DIコンテナ(Seasar2)との連携

*Curl ORB for Java version 0.6 がリリースされました。リリースノートはこちら

Curl ORBでは、DIコンテナ上で管理されているオブジェクトのメソッドをコールすることができます。今回は、各種設定及びCurlからの呼び出し方法を紹介していきます。

 

Seasar2 framework利用準備

まずは、Curl ORBとSeasar frameworkを連携するため、ここから S2Container 2.4.xの Zipファイルをダウンロード及び解凍しますと、解凍先のディレクトリ、seasar2/lib直下の4つのファイル

aopalliance-1.0.jar
javassist-3.4.ga.jar
ognl-2.6.9-patch-20070908.jar
s2-framework-2.4.29.jar

をWEB-INF/lib配下へ保存します。

次にWEB-INF直下に、classesフォルダを作成し、その直下にapp.diconに以下のような設定を行い、ファイルを作成します。


<!DOCTYPE components PUBLIC “-//SEASAR//DTD S2Container 2.4//EN”
“http://www.seasar.org/dtd/components24.dtd”>
<components>
  <component name=”hello” class=”com.test.HelloImpl” />
</components>

を設定し、ファイルを作成します。(この例ではcom.testパッケージの中にサービスクラスが存在する場合です。もしサービスクラスのパッケージ名として別の名前を利用する場合は、ここを変更してください。)

Seasar2では通信のスコープが選択できます。

instance=”request”
instance=”session”
instance=”application”

スコープを変更したい場合はapp.diconの中の<component>タグの中に、上記のいずれかを記述してください。

(例:  <component name=”hello” class=”com.test.HelloImpl” instance=”application” />

次に、web.xmlにSeasar2用のフィルタを設定します。

  <filter>
    <display-name>s2filter</display-name>
    <filter-name>s2filter</filter-name>
    <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>s2filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

また、app.diconの名前、場所を任意に記述、配置した場合は、web.xmlにその情報を記述します。

例:
  <context-param>
    <param-name>configPath</param-name>
    <param-value>../2app.dicon</param-value>  *classesから見た相対パスで表現します。
  </context-param>

次に、curl-config.xmlにSeasar2を利用するための記述を下記のように行います。

  <application-context
    name=”seasar2″
    class=”com.curlap.orb.context.Seasar2ApplicationContext”
  />

 

サービスクラスの作成

サーバサイドのサービスクラスとして、Hello実装クラスを作成します。

// インターフェースクラス
package com.test;

public interface Hello {
 // sayHello
 public String sayHello(String name);
}

// 実装クラス
package com.test;

public class HelloImpl implements Hello {
 // sayHello
 public String sayHello(String name) {
  return “Hello ” + name + ” (Seasar2 Framework)”;
 }
}

ここでAPサーバ(Tomcat等)を再起動します。

再起動後、コード生成ツールを利用して、以下のようなCurlのコードを生成します。ServiceClass(DI)を選択し、interface nameとしてhelloを選択して生成します。(コード生成ツールの詳細な利用方法はこちらです。)

|||
||| NOTE: *** This code was generated by the Curl code generator automatically ***
|||

|| PACKAGE COM.TEST
 
{import * from COM.CURLAP.ORB.SERVLET}

{define-class public Hello {inherits ORBClientForContext}
 

  {constructor public {default}
    {construct-super.ORBClientForContext “hello”}
  }

  {method public {say-hello v0:String}:#String
    {return {self.invoke “sayHello”, arguments = {FastArray v0}}}
  }
 
}

サービスクラスへのアクセス

生成されたコード(Helloサービスクラス)に対して、以下のようにアクセスいたします。(通常のCurlのクラスに対するアクセスと同様です。)

 

|| manifest.mcurlファイル
{curl 6.0 manifest}
{manifest PROJECT}

 

|| ORB packages
{delegate-to COM.CURLAP.ORB,
    location = “COM/CURLAP/ORB/manifest.mcurl”
}

|| Curl code generator
{component file code-generator.dcurl,
    location = “code-generator.dcurl”
}

|| add for seasar2 test
{component package COM.TEST,
    location = “load.scurl”
}

|| テストstart.curl
{curl 6.0 applet}
{applet manifest = “manifest.mcurl”}

{import * from COM.TEST}

{do
    def hello = {Hello}
    {popup-message {hello.say-hello “akira”}}
}

これにより、Curl側のsay-helloメソッドをコールしますと、サーバサイドのDIコンテナ(Seasar2)で管理されているHelloオブジェクトを呼び出し、say-helloメソッドを実行し、戻り値をCurlへ返します。(このサンプルでは、”Hello akira (Seasar2 Framework)”と表示されます。)

このように、簡単にサーバサイドとの連携を行うことができます。