Seasar DI Container with AOP

S2Hessianを使うと、Seasar2のコンポーネントをWSDLなしにクライアントから簡単に呼び出す事ができるようになります。JAVAでRich Clientを作る時にはいちいちWSDLを設定する必要がなく、また簡易なプロトコルですのでパフォーマンスも良いと思います。
S2HessianDotNetを使用すれば、C#でSmart Clientを書いて、そこから簡単にSeasar2のコンポーネントを呼び出せます。

セットアップ

S2と同様にJDK1.4以上が必要です。サンプルは、TomcatTomcat Pluginを使うことを前提にしています。あらかじめインストールして置いてください。S2Hessianを解凍してできたs2hessianディレクトリとs2hessian_clientをEclipseに丸ごとインポートしてください。
必要な libは、seasar2のlibと下記URLからDownload出来る hessian-3.0.8.jarで、これらを WEB-INF/libに入れてください。
http://www.caucho.com/hessian/download/hessian-3.0.8.jar  

使い方

Tomcatを起動し、s2hessian_clientのorg.seasar.s2hessian.example.TestClient を実行すると11 Sampleが走ります。
またorg.seasar.s2hessian.example.AopClientを実行すると、Client側もseasar2のAOPを使用し、S2HessianInterceptorでURLを設定し、Proxyを透過的に実行出来ます。

org.seasar.s2hessian.example.TestClient

〜略〜
public class TestClient {
  public static void main(String []args)
    throws Exception
  {
    HessianProxyFactory factory = new HessianProxyFactory();
    String url = "http://localhost:8090/s2hessian/s2h/test";
    SeasarTest seasarTest = (SeasarTest) factory.create(SeasarTest.class, url);

    /* Test1 */
    int ires=seasarTest.intPlus(3,5);
    System.out.println("Test1 intPlus result: " +ires);
〜略〜

worg.seasar.s2hessian.example.AopClient

下記 diconファイルにてURLを指定します。
〜略〜
public class TestAop {

    public static void main(String[] args) {
        
		S2Container container  = S2ContainerFactory.create("app.dicon");
		
		SeasarTest seasarTest = (SeasarTest)container.getComponent("testcomp");
	    /* Test1 */
	    int ires=seasarTest.intPlus(30,50);
	    System.out.println("Test1 intPlus result: " +ires);
〜略〜

app.dicon

下記 diconファイルにてURLを指定します。 なお下半分は、Burlapと言う XML形式でのプロトコルを使用する場合のSampleでHessianのみの場合は不要です。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
<component name="testcomp" class="org.seasar.s2hessian.example.SeasarTest">
<aspect>
<component class="org.seasar.s2hessian.S2HessianInterceptor">
<property name="serviceUrl">"http://localhost:8080/s2hessian/s2h/test"</property>
</component>
</aspect>
</component>
<component name="testburlap" class="org.seasar.s2hessian.example.SeasarTest">
<aspect>
<component class="org.seasar.s2hessian.S2BurlapInterceptor">
<property name="serviceUrl">"http://localhost:8080/s2hessian/s2b/test"</property>
</component>
</aspect>
</component>
</components>

server側の設定

app.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd"
>
<components>
<component name="test" class="org.seasar.s2hessian.example.SeasarTestImpl">
</component>
</components>

SeasarTest

public interface SeasarTest {

public int intPlus(int i,int j);
public boolean boolTest(boolean b);
public long longPlus(long x,long y);
public double doublePlus(double x,double y);
public String dateCheck1(Date d);
public Date dateCheck2();
public String stringCat(String s1,String s2);
public int[] intArray(int[] in);
public Hashtable hashTable(Hashtable ht);
public ArrayList arrayList(ArrayList ar);
public MyObject myObjectTest(MyObject mx);
public MyObject2 myObjectTest2(MyObject2 mo2);
}

SeasarTestImpl

public class SeasarTestImpl implements SeasarTest {

public int intPlus(int i, int j) {
return i+j;
}

public boolean boolTest(boolean b){
return !b;
} public long longPlus(long x, long y) {
return x+y;
}

public double doublePlus(double x, double y) {
return x+y;
}

public String dateCheck1(Date d) {
int m = d.getMonth();
int dd = d.getDate();
int h=d.getHours();
int mm=d.getMinutes();
String dds=d.toLocaleString();
return dds;
}

public String stringCat(String s1, String s2) {
return s1+s2;
}

public int[] intArray(int[] in) {
return in;
}

public Hashtable hashTable(Hashtable ht) {
return ht;
}
public ArrayList arrayList(ArrayList ar){
return ar;
}

public Date dateCheck2() {
Date nd=new Date();
return nd;
}

public MyObject myObjectTest(MyObject mx) {
return mx;
}

public MyObject2 myObjectTest2(MyObject2 mo2) {
MyObject2 mores= new MyObject2();
MyObject mo= new MyObject();
mo=mo2.getMo1();
mores.setMo1(mo);
return mores;}
} }