Servlet日記(2000/12/24)

本日の成果

 前回(Servlet日記(2000/12/09) InternetBeans Express)に引き続き、InternetBeans Expressで少し遊んでいたのですが、情報が少なくてどうもよく分かりません。しばらく置いておきましょう。ただ、少し使った感じとしては、IBMのVisualAge for Javaのサーブレットビルダの方がよくできているような気がします(詳細が分かると考えが変わるかもしれませんが)。値段もずいぶん違いますしね。(今のVisualAge for Javaでは、サーブレットビルダはなくなったそうです。IBMの何かのドキュメントでは、Nice Demoだったと書いてありました ^^;)

 今回は、ちょっと目先を変えて、CORBAで遊んでみました。といっても、別に難しいことをしている訳ではないのですが。Servletがクライアントになり、Webブラウザから与えられた文字列を、CORBAサーバを呼び出して大文字に変換するものを作ります。そういえば、以前にRMIとServletを組み合わせて同じようなプログラムを作ったのですが、ここには書いていませんでしたね。もし興味があれば、Open Design 11月号を参照してください(物書きの部屋)。

 で、まず次のようなIDLを作りました。

module convStr {
  interface ConvertString {
    void toUpper(in string param1, out string param2);
  };
};

 JBuilder 4は、エンタープライズ版でないとCORBA開発支援機能がないので、コマンドラインからJDKのIDLコンパイラを実行して各種ファイルを生成します。で、それを使って、サーバ側を次のようにしました。

package corbaserver1;

import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import convStr.*;

public class CorbaServer extends _ConvertStringImplBase {
  public void toUpper (String param1, org.omg.CORBA.StringHolder param2) {
    System.out.println("param1=" + param1);
    param2.value = param1.toUpperCase();
  }

  public static void main(String[] args) {
    try {
      ORB orb = ORB.init(args, null);
      CorbaServer obj = new CorbaServer();
      orb.connect(obj);
      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, obj);
      orb.run();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

 クライアント(Servlet)側は、ウィザードが生成したソースを元に、次のようにしました。

package corbaservlet1;

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 {
  private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";
  ORB orb = null;
  org.omg.CORBA.Object objRef = null;
  ConvertString corbaObj = null;
  /**グローバル変数の初期化*/
  public void init(ServletConfig config) throws ServletException {
    try {
      super.init(config);
      String[] args = new String[1];
      args[0] = "";
      orb = ORB.init(args, null);
      objRef = orb.resolve_initial_references("NameService");
      NamingContext ncRef = NamingContextHelper.narrow(objRef);
      NameComponent path[] = new NameComponent[1];
      path[0] = new NameComponent("StrConvServer", "");
      corbaObj = ConvertStringHelper.narrow(ncRef.resolve(path));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**HTTP Get リクエストの処理*/
  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>");
    String inStr = request.getParameter("in");
    if (null == inStr || inStr.equals("")) {
      out.println("文字列が指定されていません。");
    } else {
      StringHolder outStr = new StringHolder();
      corbaObj.toUpper(inStr, outStr);
      out.println("in=" + request.getParameter("in") + "<br>");
      out.println("out=" + outStr.value);
    }
    out.println("</body></html>");
  }
  /**後始末*/
  public void destroy() {
  }
}

 で、これもJDKに付いているtnameserv.exeを実行しておいて、まずサーバ側を実行し、次にServletを実行します。JBuilderのIDE内でServletを実行すると、いきなりGetメソッドが呼ばれるので、「文字列が指定されていません」という表示になります。

 ServletにアクセスするURLで、・・・?in=hogehoge のように指定すると、hogehogeの部分を大文字に変換したものが表示されます。またそのとき、サーバ側の画面を見ると、param1の値として、このhogehogeの部分が表示されていることが確認できます。

 というわけで、クリスマスイブスペシャル(?)でした。ケーキを食べながらこういうことをするのも、乙なものかなぁ。

本日の教訓

 CORBAクライアントとして動くようになりました。RMIの時よりも、実行環境を作るのは簡単かも。

Servlet日記の目次 ホーム