SAStruts + Velocity (1)
http://d.hatena.ne.jp/morningmist7/20080415/1208222633
このセミナーをきっかけにSAStrutsを勉強しはじめたのですが、
私の現場ではStruts+Velocityで開発を行っているので、SAStrutsと
Velocityが連携できるか調査しました。
必要なモジュールのダウンロード
sa-struts-blank-1.0.2-rc2.zip
velocity-tools-1.2.zip
必要なファイルのマージ
まず、sa-struts-blank-1.0.2-rc2.zipを展開します。
次に、velocity-tools-1.2.zipの中にある以下のファイルを追加して行きます。
commons-digester-1.7.jar
commons-lang-2.1.jar
sslext-1.2.jar
velocity-1.4.jar
velocity-tools-1.2.jar
velocity-tools-generic-1.2.jar
velocity-tools-view-1.2.jar
webapp/WEB-INF/web.xml
webapp/WEB-INF/toolbox.xml
webapp/WEB-INF/VM_global_library.vm
webapp/WEB-INF/velocity.properties
sa-struts-blank-1.0.2-rc2の中にある以下のファイルは削除します。
commons-digester-1.6.jar
設定の修正
webapp/WEB-INF/web.xml の修正
→以下の記述を追加
<servlet> <servlet-name>velocity</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class> <init-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/toolbox.xml</param-value> </init-param> <init-param> <param-name>org.apache.velocity.properties</param-name> <param-value>/WEB-INF/velocity.properties</param-value> </init-param> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping>
webapp/WEB-INF/toolbox.xml の修正
→以下の記述を追加
<tool> <key>escape</key> <scope>application</scope> <class>org.apache.velocity.tools.generic.EscapeTool</class> </tool>
webapp/WEB-INF/velocity.properties の修正
→以下の記述を追加・修正
input.encoding=UTF-8 output.encoding=UTF-8 default.contentType=text/html; charset=UTF-8 webapp.resource.loader.cache = false velocimacro.library = WEB-INF/VM_global_library.vm
サンプルの作成
sa-struts-tutorial-1.0.2-rc2 に含まれるaddサンプルをVelocityに移植して動作確認を行います。
まず、Actionクラスを作成。
package tutorial.action; import org.seasar.struts.annotation.Execute; import org.seasar.struts.annotation.IntegerType; import org.seasar.struts.annotation.Required; public class AddAction { @Required @IntegerType public String arg1; @Required @IntegerType public String arg2; public Integer result; @Execute(validator = false) public String index() { return "add.vm"; } @Execute(input = "add.vm") public String submit() { result = Integer.valueOf(arg1) + Integer.valueOf(arg2); return "add.vm"; } }
次に、vmファイルを作成。
<html> <head> <title>Velocity</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> #errorMarkup() <form name="velocityActionForm" method="post" action="$link.setRelative("/add/")"> <input type="text" name="arg1" value="$!arg1"> + <input type="text" name="arg2" value="$!arg2"> = $!escape.html($!result)<br /> <input type="submit" name="add" value="足し算"> </form> </body> </html>
動作確認
とりあえず、うまく動いているようです。
ただし、vmファイルの修正を動的に検知してくれない時があります。
何か設定が必要なんでしょうか?