Seasar DI Container with AOP

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

セットアップ

S2と同様にJDK1.4以上が必要です。サンプルは、TomcatTomcat Pluginを使うことを前提にしています。あらかじめインストールして置いてください。s2hessians2hessian- clientをDownloadし、解凍してできた s2hessianディレクトリとs2hessian-clientをそれぞれEclipseにインポートしてください。

なおhessian-3.0.8.jarもlibにいれてありますが、下記URLからDownload出来ます。
http://www.caucho.com/hessian/download/hessian-3.0.8.jar 

DownLoad

s2hessian

s2hessian- client  

使い方

まず Serverとして、s2hessianを起動します。この場合Projectを右クリックし、Tomcatプロジェクトのメニューから、Tomcatコ ンテキストの更新をクリックしてください。

Tomcatを起動し、s2hessian-clientの org.seasar.s2hessian.example.TestAOP を実行すると31 Sampleが走ります。

Serverの設定

  web.xmlに下記設定がされています。
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<servlet>
<servlet-name>s2hessian</servlet-name>
<servlet-class>org.seasar.s2hessian.S2HessianServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>s2burlap</servlet-name>
<servlet-class>org.seasar.s2hessian.S2BurlapServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>s2servlet</servlet-name>
<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>configPath</param-name>
<param-value>app.dicon</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>s2hessian</servlet-name>
<url-pattern>/s2h/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>s2burlap</servlet-name>
<url-pattern>/s2b/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>s2servlet</servlet-name>
<url-pattern>/s2servlet</url-pattern>
</servlet-mapping>
</web-app>
ここで、通常使用される s2sevletに加え、s2hession(必要により、s2burlap)が設定されています。

次に、app.dicon(あるいは、それから呼び出されているdicon)に、公開するComponentを登録します。公開するものには、meta情 報として、「s2hessian」が指定される事が必要です。

Serverには、たとえば下記のInterfaceとImpl Programがあるとします。

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();
〜略〜
}

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;
}
〜略〜
}

app.dicon

<?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="test" class="org.seasar.s2hessian.example.SeasarTestImpl">
<meta name="s2hessian"/>
</component>
</components>

Clientの設定

Clientのapp.diconには、下記の様な設定がされています。
<?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.seasar.remoting.caucho.client.HessianConnector">
<property name="baseURL">new java.net.URL("http://localhost:8080/s2hessian/s2h/")</property>
</component>
<component name="test" class="org.seasar.s2hessian.example.SeasarTest">
<aspect>remoting</aspect>
</component>
</components>

下記のCodeがClientのSampleです。

org.seasar.s2hessian.example.TestAop

〜略〜
public class TestAop {

public static void main(String[] args) {

S2Container container = S2ContainerFactory.create("app.dicon");

SeasarTest seasarTest = (SeasarTest)container.getComponent("test");
/* Test1 */
int ires=seasarTest.intPlus(30,50);
System.out.println("Test1 intPlus result: " +ires);

/* Test2 */
boolean bres=seasarTest.boolTest(true);
System.out.println("Test2 boolTest result: " +bres);

〜略〜

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;}
}
}