Seasar2.4 + Click

どうもTeedaが趣味に合わないので、Clickと組み合わせてみることにしてみた。

ここにSeasarとClickの組み合わせる方法があったのだけど、2.4でSeasar側のコードが大きく変わったのと、Click側も変化しているようでうまくいかない。仕方がないので、いろいろいじくった結果、下記のようにすることでうまくいった*1ホットデプロイにも対応できてる。

[追記] 拡張子が「.htm/.jsp」以外だとautomapがうまくいかないことが判明したので、.htmlを.htmに修正しました。

いや、しかしホットデプロイすごいなぁ。JavaGPLで配布されることより革命的な機能かもしれない。

S2ClickServlet.java

package net.arnx.seasar;

import net.sf.click.ClickServlet;
import net.sf.click.Page;

import javax.servlet.http.HttpServletRequest;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class S2ClickServlet extends ClickServlet {
    private static final long serialVersionUID = -5891577141427276192L;
    
    protected Page newPageInstance(String path, Class pageClass,
        HttpServletRequest request) throws Exception {
    
        Page page = null;

        S2Container container = SingletonS2ContainerFactory.getContainer();

        if (container.hasComponentDef(pageClass)) {
            page = (Page)container.getComponent(pageClass);
        } else {
            page = (Page)pageClass.newInstance();
        }

        return page;
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">	
    <filter>
        <filter-name>s2filter</filter-name>
        <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
    </filter>

    <filter>
        <filter-name>hotdeployfilter</filter-name>
        <filter-class>org.seasar.framework.container.hotdeploy.HotdeployFilter</filter-class>
    </filter>

    <filter>
        <filter-name>encodingfilter</filter-name>
        <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
	
	<filter>
		<filter-name>compression-filter</filter-name>
		<filter-class>net.sf.click.extras.filter.CompressionFilter</filter-class>
	</filter>

    <filter-mapping>
        <filter-name>s2filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <filter-mapping>
        <filter-name>hotdeployfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

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

	<servlet>
		<servlet-name>s2servlet</servlet-name>
		<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
		<init-param>
 			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
	    <load-on-startup>0</load-on-startup>
	</servlet>

	<servlet>
		<servlet-name>click-servlet</servlet-name>
		<servlet-class>net.arnx.seasar.S2ClickServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>s2servlet</servlet-name>
		<url-pattern>/s2servlet</url-pattern>
	</servlet-mapping>	
	
	<servlet-mapping>
		<servlet-name>click-servlet</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.htm</welcome-file>
    </welcome-file-list>
</web-app>

click.xml

下記のpackageの部分を自作クラスのパッケージに修正する。Seasarの命名規約にそってwebをはさむのが吉。

<?xml version="1.0" encoding="UTF-8"?>

<click-app charset="UTF-8" locale="ja">
	<pages package="(自作クラスのパッケージ).web" automapping="true">
	</pages>
	<headers>
		<header name="Pragma" value="no-cache" />
		<header name="Cache-Control" value="no-store, no-cache, must-revalidate, post-check=0, pre-check=0" />
	</headers>
	<mode value="development" />
</click-app>

s2container.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="hotdeploy.dicon"/>
</components>

app.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="aop.dicon"/>
</components>

convention.dicon

addRootPackageNameを自作クラスのパッケージ名に書き換える。すると、次のcustomizerとの組み合わせによってホットデプロイが可能になる。

customizer.dicon

defaultCustomizerのコメントを解除*2TeedaのPageクラスの命名規約がClickでもそのまま使えるので何もしなくていい。

*1:気にする人がいたら困るので一応書いておくが、著作権は放棄するので自由に使ってくれ。ソースそのままpackage名を弄って使ったり公開したりしても一向に構わんので。

*2:良く見たらtraceIntercepterをコメントアウトしてあるだけだった。