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

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

お題は、こちら

  • 公式サイト: Slim3
  • バージョン: 1.0.5

最近、appengineでslim3を利用していることもあるので、最初に取り上げました。

Slim3といえば、DatastoreがメインでControllerはあまり触れられませんが、あっさりしていて挙動が理解しやすく、個人的には好きです。

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
  <context-param>
    <param-name>slim3.rootPackage</param-name>
    <param-value>slim3</param-value>
  </context-param>

  省略

</web-app>

パラメータslim3.rootPackageにアプリケーションのベースとなるパッケージを指定します。

AddController.java

次は、Java

package slim3.controller;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.controller.validator.Validators;

public class AddController extends Controller {

    @Override
    public Navigation run() throws Exception {
        if (param("calculate") == null) {
            return forward("input.jsp");
        }
        Validators v = new Validators(request);
        v.add("arg1", v.required(), v.integerType());
        v.add("arg2", v.required(), v.integerType());
        if (!v.validate()) {
            return forward("input.jsp");
        }
        requestScope("result", asInteger("arg1")+asInteger("arg2"));
        return forward("result.jsp");
    }
}

読めばやってることがだいたい理解できるのではないでしょうか。
以下の処理もフレームワークが勝手に呼び出すことはなくプログラマが明示的に呼び出します。

  • リクエストパラメータをフィールドにマッピング
  • コンバート
  • バリデート

実は、Webフレームワークってこのレベルで良いのかとも思ったりします。とはいえ、pretty URLの機能とか持っています。

input.jsp

入力画面です。

<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>input</title>
</head>
<body>
<ul>
<c:forEach var="e" items="${f:errors()}">
<li>${f:h(e)}</li>
</c:forEach>
</ul>
<form>
<input type="text" ${f:text("arg1")} />${f:h(errors.arg1)}<br/><br/>
<input type="text" ${f:text("arg2")} />${f:h(errors.arg2)}<br/>
<input type="submit" name="calculate" />
</form>
</body>
</html>

Slim3自体は、カスタムタグは持っておらず、JSTL + ELファンクションで作る感じです。描画系のカスタムタグがないので、JSPを直接ブラウザでプレビューした時も、ある程度レイアウトの確認ができるのかと思います。
エラーメッセージは、フィールド毎に出力するパターンと一気に出力するパターンを書いてみました。ただ、画面ごとにエラーメッセージを変えたい場合の方法とかわからない。。

result.jsp

結果出力画面です。

<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>result</title>
</head>
<body>
result: ${f:h(result)}
</body>
</html>

appengineでJSPの共通インクルードができないのが残念だ。