Seasar2.4 + Click
どうもTeedaが趣味に合わないので、Clickと組み合わせてみることにしてみた。
ここにSeasarとClickの組み合わせる方法があったのだけど、2.4でSeasar側のコードが大きく変わったのと、Click側も変化しているようでうまくいかない。仕方がないので、いろいろいじくった結果、下記のようにすることでうまくいった*1。ホットデプロイにも対応できてる。
[追記] 拡張子が「.htm/.jsp」以外だとautomapがうまくいかないことが判明したので、.htmlを.htmに修正しました。
いや、しかしホットデプロイすごいなぁ。JavaがGPLで配布されることより革命的な機能かもしれない。
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との組み合わせによってホットデプロイが可能になる。