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

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配下へ保存します。

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

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

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

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

(例:  <component name=”hi” class=”com.test.HiImpl” 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>

また、CurlORB内でSeasar2を利用するため、同様にWEB-INF/web.xmlに以下のように指定します。 

  <context-param>
    <param-name>com.curlap.orb.applicationContextClass</param-name>
    <param-value>com.curlap.orb.context.Seasar2ApplicationContext</param-value>
  </context-param>

web.xml


<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:web=”http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” id=”WebApp_ID” version=”2.5″>

  <!– InvokeApplicationContextServlet –>
  <servlet>
    <servlet-name>InvokeApplicationContextServlet</servlet-name>
    <servlet-class>com.curlap.orb.servlet.InvokeApplicationContextServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>InvokeApplicationContextServlet</servlet-name>
    <url-pattern>/invoke-application-context</url-pattern>
  </servlet-mapping>

  <!– NewInstanceServlet –>
  <servlet>
    <servlet-name>NewInstanceServlet</servlet-name>
    <servlet-class>com.curlap.orb.servlet.NewInstanceServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>NewInstanceServlet</servlet-name>
    <url-pattern>/new-instance</url-pattern>
  </servlet-mapping>
 
  <!– InvokeHttpSessionServlet –>
  <servlet>
    <servlet-name>InvokeHttpSessionServlet</servlet-name>
    <servlet-class>com.curlap.orb.servlet.InvokeHttpSessionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>InvokeHttpSessionServlet</servlet-name>
    <url-pattern>/invoke-http-session</url-pattern>
  </servlet-mapping>

  <!– DestroyInstanceServlet –>
  <servlet>
    <servlet-name>DestroyInstanceServlet</servlet-name>
    <servlet-class>com.curlap.orb.servlet.DestroyInstanceServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DestroyInstanceServlet</servlet-name>
    <url-pattern>/destroy-instance</url-pattern>
  </servlet-mapping>
 
  <!– DefaultFilter –>
  <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>
  <filter>
 
    <filter-name>DefaultFilter</filter-name>
    <filter-class>com.curlap.orb.servlet.DefaultInstanceManagementFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DefaultFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!–
    Curl ORB – Environment – (since 0.6)
      default: none
        – none (none security)
        – development
        – test
        – production
  –>
  <context-param>
    <param-name>com.curlap.orb.environment</param-name>
    <param-value>development</param-value>
  </context-param>

  <!–
    Curl ORB – DI container integration – (since 0.6)
      default: com.curlap.orb.context.ServletApplicationContext
        – spring : com.curlap.orb.context.Spring2_5ApplicationContext
        – seasar2: com.curlap.orb.context.Seasar2ApplicationContext
  –>
 
  <context-param>
    <param-name>com.curlap.orb.applicationContextClass</param-name>
    <param-value>com.curlap.orb.context.Seasar2ApplicationContext</param-value>
  </context-param>

 
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>

</web-app>

サービスクラスの作成

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

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

public interface Hi{
 // sayHi
 public String sayHi(String name);
}

// 実装クラス
package com.test;
import com.curlap.orb.security.RemoteService;

@RemoteService
public class HiImpl implements Hi {
 // sayHi
 public String sayHi(String name) {
  return “Hi ” + name + ” (Seasar2 Framework)”;
 }
}

 

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

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

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

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

|||
||| Curl ORB for java (version 0.6)
|||  This code was generated by the Curl code generator automatically.

|||  package name   : COM.TEST
|||  generated date : 2008-12-18 15:01:52.174000
|||

{import * from COM.CURLAP.ORB}

{define-class public Hi {inherits ApplicationContextClient}
 

  {constructor public {default server-url:#Url = null}
    {construct-super.ApplicationContextClient “hi”, server-url = server-url}
  }

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

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

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

 

{curl 6.0 applet} || or 7.0
{curl-file-attributes character-encoding = “shift-jis”}
{applet manifest = “manifest.mcurl”,
    {compiler-directives careful? = true}
}

{import * from COM.TEST}
{value
  def h = {Hi}
  {popup-message {h.say-hi “akira”}}
}

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

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