読者です 読者をやめる 読者になる 読者になる

いろんなJava Webフレームワークで同じ画面を作ってみる(Cubby2編)

Java

いろんなJava Webフレームワークで同じ画面を作ってみる(Cubby2編)です。

お題は、こちら

Cubbyは、Seasarのプロダクトの1つです。

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いっぱい使ってたなぁ。