トップ 一覧 ヘルプ RSS ログイン

SpringIntegrationの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Springとの連携

ClickのExtrasにはSpringと連携するための[SpringClickServlet|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/spring/SpringClickServlet.html]が含まれており、これを利用することでページクラス等をSpringの管理下に置くことができるようになります。

!!ページの生成

SpringClickServletはデフォルトのClickServletを継承しており、newPageInstance()メソッドを以下のようにオーバーライドしています。

 protected Page newPageInstance(String path, Class pageClass, HttpServletRequest request)
     throws Exception {
 
     Page page = null;
 
     String beanName = pageClass.getName();
 
     if (applicationContext.containsBean(beanName)) {
         Page page = (Page) applicationContext.getBean(beanName);
 
     } else {
         page = (Page) pageClass.newIntance();
     }
 
     if (page instanceof ApplicationContextAware) {
         ApplicationContextAware aware =
             (ApplicationContextAware) page;
         aware.setApplicationContext(applicationContext);
     }
 
     return page;
 }
{{code java
protected Page newPageInstance(String path, Class pageClass, HttpServletRequest request)
    throws Exception {

    Page page = null;

    String beanName = pageClass.getName();

    if (applicationContext.containsBean(beanName)) {
        Page page = (Page) applicationContext.getBean(beanName);

    } else {
        page = (Page) pageClass.newIntance();
    }

    if (page instanceof ApplicationContextAware) {
        ApplicationContextAware aware =
            (ApplicationContextAware) page;
        aware.setApplicationContext(applicationContext);
    }

    return page;
}
}}

SpringClickServletはClickとSpringを統合するために以下の2通りの方法をサポートしています。

!ページクラスをSpringでインスタンス化する

ページクラスをSpringでインスタンス化する場合、Springの設定ファイルで以下のように定義します。bean要素のid属性はページのクラス名と同じものを指定します。

 <beans>
 
    <bean id="com.mycorp.pages.CustomerEdit" class="com.mycorp.pages.CustomerEdit"
         singleton="false">
       <property name="userService" ref="userService"/>
    </bean>
 
 </beans> 
{{code xml
<beans>

   <bean id="com.mycorp.pages.CustomerEdit" class="com.mycorp.pages.CustomerEdit"
        singleton="false">
      <property name="userService" ref="userService"/>
   </bean>

</beans>
}}

Clickのページクラスはスレッドセーフではないので、ページクラスを定義したbean要素のsingleton属性は必ずfalseに設定してください。

!ページクラスをClickでインスタンス化する

Clickでインスタンス化されたページがSpringの[ApplicationContextAware|http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/context/ApplicationContextAware.html]インターフェースを実装していた場合、SpringClickServletは生成したページに[ApplicationContext|http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/context/ApplicationContext.html]をインジェクションします。

この方法の利点はページクラスをSpringの設定ファイルに記述しなくてもよいという点です。しかし、ApplicationContextからBeanを取得するためのコードをハードコーディングしなければならないというデメリットも存在します。

 public class SpringPage extends Page implements ApplicationContextAware {
 
     protected ApplicationContext applicationContext;
 
     public void setApplicationContext(ApplicationContext applicationContext)  {
         this.applicationContext = applicationContext;
     }
 
     public Object getBean(String beanName) {
         return applicationContext.getBean(beanName);
     }
 
     public UserService getUserService() {
         return (UserService) getBean("userService");
     }
 }
{{code java
public class SpringPage extends Page implements ApplicationContextAware {

    protected ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext)  {
        this.applicationContext = applicationContext;
    }

    public Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public UserService getUserService() {
        return (UserService) getBean("userService");
    }
}
}}

!!アプリケーションコンテキストの設定

SpringのBeanは通常、applicationContext.xmlというファイルで定義されます。applicationContext.xmlには以下の2通りの配置方法があります。

!WEB-INFディレクトリに配置する

1つめは設定ファイルを/WEB-INF/applicationContext.xmlに配置し、web.xmlでSpringの[ContextLoaderListener|http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/web/context/ContextLoaderListener.html]を使用して設定ファイルを読み込む方法です。

 <web-app>
 
    <listener>
       <listener-class>
          org.springframework.web.context.ContextLoaderListener
       </listener-class>
    </listener>
 
    <servlet>
       <servlet-name>click-servlet</servlet-name>
       <servlet-class>net.sf.click.extras.spring.SpringClickServlet</servlet-class>
       <load-on-startup>0</load-on-startup>
    </servlet>
 
    <servlet-mapping>
       <servlet-name>click-servlet</servlet-name>
       <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
 
 </web-app> 
{{code xml
<web-app>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

   <servlet>
      <servlet-name>click-servlet</servlet-name>
      <servlet-class>net.sf.click.extras.spring.SpringClickServlet</servlet-class>
      <load-on-startup>0</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>click-servlet</servlet-name>
      <url-pattern>*.htm</url-pattern>
   </servlet-mapping>

</web-app> 
}}

この方法は、アプリケーションの実行中にapplicationContext.xmlに変更が加えられた場合にSpringによって自動的に変更が反映されるというメリットがあります。

!クラスパスに配置する

2つめは、applicationContext.xmlをクラスパス上に配置する方法です。たとえば/WEB-INF/classes/applicationContext.xmlに設定ファイルを配置したとします。この場合、web.xmlでSpringClickServletの初期化パラメータで設定ファイルのパスを指定します。

 <web-app>
 
    <servlet>
       <servlet-name>click-servlet</servlet-name>
       <servlet-class>net.sf.click.extras.spring.SpringClickServlet</servlet-class>
       <init-param>
         <param-name>spring-path</param-name>
         <param-value>/applicationContext.xml</param-value>
       </init-param>
       <load-on-startup>0</load-on-startup>
    </servlet>
 
    <servlet-mapping>
       <servlet-name>click-servlet</servlet-name>
       <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
 
 </web-app> 
{{code xml
<web-app>

   <servlet>
      <servlet-name>click-servlet</servlet-name>
      <servlet-class>net.sf.click.extras.spring.SpringClickServlet</servlet-class>
      <init-param>
        <param-name>spring-path</param-name>
        <param-value>/applicationContext.xml</param-value>
      </init-param>
      <load-on-startup>0</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>click-servlet</servlet-name>
      <url-pattern>*.htm</url-pattern>
   </servlet-mapping>

</web-app> 
}}