いろんなJava Webフレームワークで同じ画面を作ってみる(Cubby2編)
いろんなJava Webフレームワークで同じ画面を作ってみる(Cubby2編)です。
お題は、こちら。
- 公式サイト: Cubby Project - Cubby 2.0
- バージョン: 2.0.9
convention.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component class="org.seasar.framework.convention.impl.NamingConventionImpl"> <initMethod name="addRootPackageName"> <arg>"webapp"</arg> </initMethod> </component> <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/> </components>
SpringやGuiceと組み合わせて使えるらしいですが、Seasar2と組み合わせるパターンで試しました。
addRootPackageNameでベースとなるパッケージを指定します。
AddAction.java
package webapp.action; import org.seasar.cubby.action.ActionClass; import org.seasar.cubby.action.ActionResult; import org.seasar.cubby.action.Forward; import org.seasar.cubby.action.OnSubmit; import org.seasar.cubby.action.Path; import org.seasar.cubby.action.RequestParameter; import org.seasar.cubby.action.Validation; import org.seasar.cubby.validator.DefaultValidationRules; import org.seasar.cubby.validator.ValidationRules; import org.seasar.cubby.validator.validators.NumberValidator; import org.seasar.cubby.validator.validators.RequiredValidator; @ActionClass public class AddAction { @RequestParameter public Integer arg1; @RequestParameter public Integer arg2; public Integer result; public ValidationRules validationRules = new DefaultValidationRules() { @Override public void initialize() { add("arg1", new RequiredValidator(), new NumberValidator()); add("arg2", new RequiredValidator(), new NumberValidator()); } }; public ActionResult index() { return new Forward("input.jsp"); } @OnSubmit("calculate") @Path("/") @Validation(rules="validationRules", errorPage="input.jsp") public ActionResult submit() { result = arg1 + arg2; return new Forward("result.jsp"); } }
Cubby ってPOJOでもAction作れるようになってたんですね。選択肢があるのは、嬉しくないのでどちらかで良いかなぁと思ったりします。
バリデーションは、クラスのフィールドに対して指定するのではなく、リクエストパラメータ名に対して指定する感じです。OValでもできるらしいです。
Formアノテーションで、SAStruts同様、リクエストパラメータをバインドするオブジェクトを外に出せるらしい。
OnSubmitアノテーションは、デフォルトでメソッド名を拾って欲しいかなぁと思います。
また、JSONでレスポンスするのも考慮されており、いい感じです。
input.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/JavaScript" /> <title>input</title> </head> <body> <c:import url="/common/errors.jsp"/> <t:form value="${action}" > arg1: <t:input type="text" name="arg1"/>${f:out(errors.fields.arg1[0])}<br/> + <br/> arg2: <t:input type="text" name="arg2"/>${f:out(errors.fields.arg2[0])}<br/> <input type="submit" name="calculate" value="submit" /> </t:form> </body> </html>
Cubbyで用意されているカスタムタグは、抵抗なく自然に覚えられる感じだったと思います。
エラーをフィールド単位で出力するように書いてみたんですが、こんな感じで良いでしょうか?
result.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/JavaScript" /> <title>result</title> </head> <body> result: ${f:out(result)} </body> </html>
HTMLテンプレートが流行っているころに、「JSPは悪くない」と再考させてくれたフレームワークだった気がします。
自分もMayaaいっぱい使ってたなぁ。