本ドキュメントはS2Axis-1.0.3 について記述しています.旧バージョンについては該当バージョンの配布ファイルに含まれているドキュメントを参照してください.
S2AxisExamplesは,S2Axisの基本的な機能を一通り使用したサンプルです.インストールについてはセットアップを参照してください.
ソースはサーバ側とクライアント側に分かれており,クライアント側はJUnit (S2Unit) のテストケースとして作成されています.それぞれ,以下のソースフォルダにあります.
- サーバ側
src/server フォルダのorg.seasar.axis.examples.exnn パッケージ
- クライアント側
src/client フォルダのorg.seasar.axis.examples.exnn パッケージ
単純なクラスをWebサービスとして公開する例です.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="Echo" class="org.seasar.remoting.axis.examples.ex01.EchoImpl">
<meta name="axis-service"/>
</component>
</components>
クライアント側は動的呼び出しを使用しています.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>
<component class="org.apache.axis.client.Service"/>
<component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
<property name="baseURL">
"http://localhost:8080/s2-axis-examples/services/"
</property>
</component>
<component class="org.seasar.remoting.axis.examples.ex01.Echo">
<aspect>remoting</aspect>
</component>
</components>
実装クラスを公開すると,不要なメソッドまで公開されてる場合があります(インタフェースを実装していない場合や複数のインタフェースを実装している場合など).ex02の実装クラスHelloImpl は二つのインタフェースを実装していますが,MessageSettableのメソッドsetMessage(String) はWebサービスとして公開しないものとします.
このような場合には,公開するJavaインタフェースを指定します(実装したインタフェースが一つだけの場合や,実装した複数のインタフェースのメソッドを全て公開する場合には明示的に指定する必要はありません).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="Hello" class="org.seasar.remoting.axis.examples.ex02.HelloImpl">
<meta name="axis-service">
<component class="org.seasar.remoting.axis.server.ServiceDef">
<property name="serviceType">
@org.seasar.remoting.axis.examples.ex02.Hello@class
</property>
</component>
</meta>
<property name="message">"Hello"</property>
</component>
</components>
<property> 要素をコメントアウトしてWebコンテナを起動すると,Hello のWSDLにsetServiceType(String) メソッドが含まれることを確認することが出来ます.
このサンプルでは,サービスは引数および戻り値の型としてJavaBeansを使用しています.しかし,クライアント・サーバ側とも自動的にタイプマッピングが登録されるため,特に何も指定しなくても動作します.
Axisは独自の拡張機能としてHTTPセッションを使用したセッションスコープのサービスをサポートします.S2Axisでセッションスコープのサービスを使う場合には,サービスのライフサイクル管理はS2で行います.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="Counter" class="org.seasar.axis.examples.ex04.CounterImpl"
instance="session"
>
<meta name="axis-service"/>
</component>
</components>
instance 属性の値を singleton やprototype に変更すると,このサンプルは正しく動作しなくなります (テストケースであるクライアントが失敗します).
セッションスコープを使う場合,クライアント側ではセッショントラッキングを有効にする必要があります.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>
<component class="org.apache.axis.client.Service">
<property name="maintainSession">true</property>
</component>
<component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
<property name="baseURL">
"http://localhost:8080/s2-axis-examples/services/"
</property>
</component>
<component class="org.seasar.remoting.axis.examples.ex04.Counter">
<aspect>remoting</aspect>
</component>
</components>
maintainSession 属性の値を false にすると,このサンプルは正しく動作しなくなります.
WSDL2Javaを使ってJavaのスタブおよびスケルトンを生成した場合のサンプルです.WSDL2Javaが生成したWSDDファイルを指定します.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="Magazine"
class="org.seasar.remoting.axis.examples.ex05.MagazineSoapBindingImpl">
<meta name="axis-service">
"org/seasar/remoting/axis/examples/ex05/deploy.wsdd"
</meta>
<property name="title">"CanCam"</property>
<initMethod name="addModel">
<arg>
<component class="org.seasar.remoting.axis.examples.ex05.Model">
<property name="name">"Yuri Ebihara"</property>
<property name="age">25</property>
</component>
</arg>
</initMethod>
<initMethod name="addModel">
<arg>
<component class="org.seasar.remoting.axis.examples.ex05.Model">
<property name="name">"Naoko Tokuzawa"</property>
<property name="age">20</property>
</component>
</arg>
</initMethod>
<initMethod name="addModel">
<arg>
<component class="org.seasar.remoting.axis.examples.ex05.Model">
<property name="name">"Asami Usuda"</property>
<property name="age">20</property>
</component>
</arg>
</initMethod>
</component>
</components>
クライアント側はWSDLから生成されたスタブを使用する静的呼び出しになっています.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="locator"
class="org.seasar.remoting.axis.examples.ex05.MagazineServiceLocator"
/>
<component class="org.seasar.remoting.axis.examples.ex05.Magazine">
<!-- locator.getMagazine() -->
locator.getMagazine(
new java.net.URL(locator.getMagazineAddress() +
locator.getMagazineWSDDServiceName()))
</component>
</components>
S2でインスタンス管理するハンドラをサービスのリクエストチェーンおよびレスポンスチェーンとして使用するサンプルです.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="Foo"
class="org.seasar.remoting.axis.examples.ex06.FooSoapBindingImpl">
<meta name="axis-service">
"org/seasar/remoting/axis/examples/ex06/deploy.wsdd"
</meta>
</component>
<component name="fooRequestHandler"
class="org.seasar.remoting.axis.examples.ex06.LoggingHandler">
<meta name="axis-handler"/>
<property name="message">"Enter Foo"</property>
</component>
<component name="fooResponseHandler"
class="org.seasar.remoting.axis.examples.ex06.LoggingHandler">
<meta name="axis-handler"/>
<property name="message">"Exit Foo"</property>
</component>
</components>
このハンドラを使用するため,WSDL2Javaが生成したWSDDにリクエストフローおよびレスポンスフローの記述を追加しています.
<!-- Use this file to deploy some handlers/chains and services -->
<!-- Two ways to do this: -->
<!-- java org.apache.axis.client.AdminClient deploy.wsdd -->
<!-- after the axis server is running -->
<!-- or -->
<!-- java org.apache.axis.utils.Admin client|server deploy.wsdd -->
<!-- from the same directory that the Axis engine runs -->
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- Services from FooService WSDL service -->
<service name="Foo" provider="java:RPC" style="rpc" use="encoded">
<parameter name="wsdlTargetNamespace" value="http://ex06.examples.axis.remoting.seasar.org"/>
<parameter name="wsdlServiceElement" value="FooService"/>
<parameter name="wsdlServicePort" value="Foo"/>
<parameter name="className" value="org.seasar.remoting.axis.examples.ex06.FooSoapBindingImpl"/>
<parameter name="wsdlPortType" value="Foo"/>
<operation name="ping" qname="operNS:ping"
xmlns:operNS="http://ex06.examples.axis.remoting.seasar.org" soapAction=""
>
</operation>
<parameter name="allowedMethods" value="ping"/>
<requestFlow>
<handler type="fooRequestHandler"/>
</requestFlow>
<responseFlow>
<handler type="fooResponseHandler"/>
</responseFlow>
</service>
</deployment>
クライアントを実行するとサーバ側に次のようなメッセージが出力されます.
[DEBUG] http-8080-Processor24 org.seasar.remoting.axis.examples.ex06.LoggingHandler
Enter Foo
[DEBUG] http-8080-Processor24 org.seasar.remoting.axis.examples.ex06.LoggingHandler
Exit Foo
このサンプルでは,Axisが標準で提供するEchoHandler をプロバイダとするサービスをWSDDに記述し,デプロイします.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<meta name="axis-deploy
">"org/seasar/remoting/axis/examples/ex07/deploy.wsdd"
</meta>
</components>
ex05との違いは,<component> 要素ではなく,<components>要素の下に記述することです.
デプロイされるWSDDは次のようになっています.
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="EchoHandler" provider="Handler" style="rpc" use="encoded">
<parameter name="handlerClass" value="org.apache.axis.handlers.EchoHandler"/>
</service>
</deployment>
WSDDに記述されているEchoHandler のインスタンス管理にS2およびS2Axisは関与しません.単にデプロイするだけです.
このサンプルでは,diconファイルに記述したハンドラおよび,WSDDファイルをデプロイします.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<include path="s2-axis.dicon"/>
<component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>
<component class="org.apache.axis.client.Service"/>
<component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
<property name="baseURL">
"http://localhost:8080/s2-axis-examples/services/"
</property>
</component>
<component class="org.seasar.remoting.axis.examples.ex01.Echo">
<aspect>remoting</aspect>
</component>
<component name="countHandler"
class="org.seasar.remoting.axis.examples.ex08.CountHandler">
<meta name="axis-handler"/>
</component>
<meta name="axis-deploy">"org/seasar/remoting/axis/examples/ex08/deploy.wsdd"</meta>
</components>
デプロイされるWSDDは次のようになっています.
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<requestFlow>
<handler type="countHandler"/>
</requestFlow>
<responseFlow>
<handler type="countHandler"/>
</responseFlow>
</globalConfiguration>
</deployment>
WSDDに記述されているcountHandler のインスタンス管理はS2によって行われます.
|