前回(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の時よりも、実行環境を作るのは簡単かも。 |