サンプルアプリケーションの概要
Geronimoにデプロイするサンプルアプリケーションについて紹介しましょう。サンプルアプリケーションは、WebサービスとWebアプリケーションで構成されます。サンプルを実際に動作させる場合には、記事上部のリンクから、Webサービスアプリケーションファイル「GeronimoWebService.war」とWebアプリケーションファイル「GeronimoWebApp.war」をダウンロードして、先に説明した方法でGeronimoへデプロイしてください。
アプリケーションサーバ起動後に、「http://localhost:8080/GeronimoWebApp」にアクセスすればサンプルを動作させることができます。
Webサービスの説明
まずWebサービスについて説明します。作成したWebサービスは引数として渡された文字列をメッセージに結合し、返す非常にシンプルなものです。
Webサービスクラスの作成
今回はGeronimoに取り込まれているAxisを利用してWebサービスを稼動させることとします。AxisにWebサービスを配置するには、「jws」ファイルを作成する方法と[WSDD(WebServiceDeploymentDiscriptor)]を作成する方法がありますが、今回は「jws」ファイルでWebサービスを作成することにしました。「jws」ファイルの内容は通常のjavaファイルと変わりはありませんが、classファイルを作成する必要がなく、配置するだけで簡単にWebサービスを作成することができます。ただし難点としてパッケージの指定ができず、jwsファイルで作成したクラスのpublic
メソッドは、すべてWebサービスとして公開されてしまいますので注意が必要です。サンプルコードを次に示します。
public class HelloGeronimo { public String hello( String name) { return "Hello "+ name ; } }
作成した「HelloGeronimo.jws」ファイルはWebアプリケーションのコンテクストルートに配置します。
WebサービスのPlanファイル
GeronimoでWebサービスを利用するためには、Axisなどの依存関係にあるライブラリをロードしなければなりません。GeronimoではPlanファイルを利用して、ロードするモジュールを指定する方法が提供されています。Axisを利用するための「Geronimo-web.xml」を次に示します。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/web" configId="GeronimoWebService"> <dependency> <uri>axis/axis-1.4/356167/jar</uri> </dependency> <dependency> <uri>commons-discovery/commons-discovery/0.2/jar</uri> </dependency> <dependency> <uri>commons-logging/commons-logging/1.0.4/jar </uri> </dependency> <dependency> <uri>log4j/log4j/1.2.8/jar</uri> </dependency> <dependency> <uri>org.apache.geronimo.specs/geronimo-jaxrpc_1.1_spec/1.0/jar </uri> </dependency> <dependency> <uri>org.apache.geronimo.specs/geronimo-qname_1.1_spec/1.0/jar </uri> </dependency> <dependency> <uri>org.apache.geronimo.specs/geronimo-saaj_1.1_spec/1.0/jar </uri> </dependency> <dependency> <uri>wsdl4j/wsdl4j/1.5.2/jar</uri> </dependency> </web-app>
dependency
要素のuri
には、それぞれ読み込ませるライブラリのパスを記述しています。これらはすべてGeronimoに用意されているライブラリです。どのようなライブラリが用意されているかは[Geronimo Console]にログインし、[Services]から[Common Libraries]をクリックすることで参照することができます。
Webサービスのデプロイ
アプリケーションをデプロイしたら、ブラウザを開きhttp://localhost:8080/GeronimoWebService/HelloGeronimo.jws?wsdlへアクセスして下さい。Webサービスの定義であるWSDLを参照することができます。
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace= "http://localhost:8080/GeronimoWebService/HelloGeronimo.jws" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl= "http://localhost:8080/GeronimoWebService/HelloGeronimo.jws" xmlns:intf= "http://localhost:8080/GeronimoWebService/HelloGeronimo.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:message name="helloRequest"> <wsdl:part name="name" type="xsd:string"/> </wsdl:message> <wsdl:message name="helloResponse"> <wsdl:part name="helloReturn" type="xsd:string"/> </wsdl:message> <wsdl:portType name="HelloGeronimo"> <wsdl:operation name="hello" parameterOrder="name"> <wsdl:input message="impl:helloRequest" name="helloRequest"/> <wsdl:output message="impl:helloResponse" name="helloResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloGeronimoSoapBinding" type="impl:HelloGeronimo"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="hello"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="helloRequest"> <wsdlsoap:body encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name="helloResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace= "http://localhost:8080/GeronimoWebService/HelloGeronimo.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloGeronimoService"> <wsdl:port binding="impl:HelloGeronimoSoapBinding" name="HelloGeronimo"> <wsdlsoap:address location= "http://localhost:8080/GeronimoWebService/HelloGeronimo.jws"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Webアプリケーションの説明
次にWebサービスを呼び出すWebアプリケーションについて説明します。Webアプリケーションは画面から入力されたメッセージを、Webサービスに加工して返してもらい、画面に表示します。フレームワークはStruts1.2.7を利用しています。Strutsについては、『@IT Strutsを使うWebアプリケーション構築』などの専門の記事を参照して下さい。
Webサービスクライアントの生成
Webサービスを呼び出すためには複雑なコーディングが必要ですが、Axisの「WSDL2Java」ツールを使い、Webサービスへのスタブクラスを生成し、簡単なコーディングでWebサービスを利用できるようになります。「WSDL2Java」を利用するためのクラスパスを次に示します。
set GERONIMO_HOME=D:\apache\geronimo-1.0 set CLASSPATH=. set CLASSPATH=%GERONIMO_HOME%\repository\axis\jars\axis-1.4-356167.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\org.apache.geronimo.specs
\jars\geronimo-jaxrpc_1.1_spec-1.0.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\org.apache.geronimo.specs
\jars\geronimo-saaj_1.1_spec-1.0.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\org.apache.geronimo.specs
\jars\geronimo-qname_1.1_spec-1.0.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\log4j\jars
\log4j-1.2.8.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\commons-logging
\jars\commons-logging-1.0.4.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\commons-discovery
\jars\commons-discovery-0.2.jar;%CLASSPATH% set CLASSPATH=%GERONIMO_HOME%\repository\wsdl4j
\jars\wsdl4j-1.5.2.jar;%CLASSPATH%
Webサービスのスタブクラスを生成するための「WSDL2Java」コマンドです。
java org.apache.axis.wsdl.WSDL2Javahttp://localhost:8080/GeronimoWebService/HelloGeronimo.jws?wsdl
-p to.msn.wings.webservice.client
-pオプションでは「WSDL2Java」クラスによって生成されるクラスのpackage名を指定しています。オプションを指定しない場合はWSDLの「targetnamespace」に指定されているURLがパッケージとなります。 実行が成功すると[to\msn\wings\webservice\client]ディレクトリが作成され、次の4ファイルが生成されます。
WSDL2Javaコマンドで生成されたファイル | 説明 |
HelloGeronimoService.java | ServiceLocator クラスのインターフェイス。 |
HelloGeronimoServiceLocator.java | ServiceLocator クラス。PortType を生成する。 |
HelloGeronimo_PortType.java | HelloGeronimoSoapBindingStub クラスのインターフェイス。 |
HelloGeronimoSoapBindingStub.java | ServiceLocator から取得するSoapBindingStub クラス。Webサービスのメソッドを実行する。 |
生成されたクラスを利用したAction
クラスの内容です。
public class HelloAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { HelloForm hForm = (HelloForm)form; HelloGeronimoService service = new HelloGeronimoServiceLocator(); HelloGeronimo_PortType port = service.getHelloGeronimo(); String ret = port.hello(hForm.getName()); hForm.setMessage(ret); return mapping.findForward("success"); } }
先ほど「WSDL2Java」で生成したWebサービスのクライアントクラスを利用して、Webサービスを呼び出しています。画面で入力された名前を引数として、呼び出されたサービスの戻り値を画面に表示しています。
WebアプリケーションのPlanファイル
Webアプリケーションの「Geronimo-web.xml」を次に示します。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/web" configId="GeronimoWebApp"> <context-root>/GeronimoWebApp</context-root> </web-app>
configId
属性にはGeronimoで一意に識別されるアプリケーションのID、context-root
要素にはアプリケーションにアクセスする際のパスを記述します。
Webアプリケーションのデプロイ
アプリケーションをGeronimoにデプロイしたら、「http://localhost:8080/GeronimoWebApp/」へアクセスして下さい。次のような画面が表示されればデプロイは成功です。
メッセージを入力し、[メッセージ表示]ボタンを押下しましょう。Webサービスが呼び出され、加工されたメッセージが画面下部に表示されます。
最後に
今回はGeronimoへのアプリケーションのデプロイと、Axisを利用する方法について説明しました。GeronimoはIBMがWebSphere Application Server Community Edition (WAS CE)に採用するなど話題も豊富です。今回はご紹介できませんでしたが、GeronimoにはActiveMQ、OpenEJB、ServiceMixなど様々なApacheのインキュベータープロジェクトも統合されています。今、最も進んだアプリケーションサーバを使ってみてはいかがでしょうか?
参考資料
- Apache Geronimo
- Apache Axis
- Apache Struts
- IBM developper works 『Geronimo! 第1回: J2EE 1.4エンジンへの道』 Sing Li 著、2005年5月
- IBM developper works 『Geronimo! 第2回: 野生のJ2EE 1.4を使いこなす』 Sing Li 著、2005年5月