Servlet日記(2001/01/14)

本日の成果

 前回のServlet日記(2000/12/24) CORBAに引き続き、CORBAの続き。今回は、Servletをサーバ側にしてみます。RMIの時はServletをサーバにするのに苦労しましたが、CORBAの場合はTIEが使えるので、そういう意味では簡単です。

 IDLは前回と同じで、IDLコンパイラでコンパイルする時に、TIEを指定します。サーバ側の実装はこんな感じ。ConvertStringOperationsインタフェースを実装するところが、普通のServletと違いますね。最初は、init()の中で別スレッドを起こして、そちらでorb.run()を実行していたのですが、そうしなくても動くようです。

package corbaservlet;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import convStr.*;

public class Servlet1 extends HttpServlet implements ConvertStringOperations {
  private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";
  private ORB orb = null;
  private convStr.ConvertString_Tie tieObj = null;
  private ORBRunner orbRunner = null;

  public void init(ServletConfig config) throws ServletException {
    super.init(config);

    try {
      String[] args = new String[1];
      args[0] = "";
      orb = ORB.init(args, null);
      tieObj = new convStr.ConvertString_Tie(this);
      orb.connect(tieObj);
      org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
      NamingContext ncRef = NamingContextHelper.narrow(objRef);
      NameComponent path[] = new NameComponent[1];
      path[0] = new NameComponent("StrConvServer", "");
      ncRef.rebind(path, tieObj);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>Servlet1</title></head>");
    out.println("<body>");
    out.println("サーブレットは GET を受信しました。これは応答です。");
    out.println("</body></html>");
  }

  public void destroy() {
    orb.disconnect(tieObj);
    orb.shutdown(true);
  }

  public void toUpper(String param1, StringHolder param2) {
    log("param1=" + param1);
    param2.value = param1.toUpperCase();
  }
}

 クライアント側は、前回のServletを単にアプリケーションにしただけなので省略。これで実行すると、CORBAサーバとしてもServletとしても動作することが確認できました。

本日の教訓

 CORBAサーバとしても動作しました。RMIでクラスパスに異様に気を使ったことを思えば、この程度のプログラムならCORBAの方が簡単だなぁ。

Servlet日記の目次 ホーム