JSF2.2試してみた - 管理ビーンの模索

前回とちょっと間があいたけど、その続き。今度は管理ビーンのあり方についての模索、というか悪あがき。
素直にlombok使えばいいのだけれど、どうしても getter/setter だらけになるのはイヤなので、なんか回避する方法は無いものかと模索した結果がこれ。

@Named
@ViewScoped
public class CalcCtrl implements Serializable {
    :

    public void doCalculation() {
        long l = Long.parseLong(requestMap("left").toString());
        long r = Long.parseLong(requestMap("right").toString());
        long a = l + r;

        if (l % 2 == 0) flash("left", "左辺 " + l + " は偶数です");
        if (r % 2 != 0) flash("right", "右辺 " + r + " は奇数です");

        List<Calc> results = (List<Calc>) viewMap("results");
        results.add(0, new Calc(l, r, a));
        reset();
    }

    :
}

ちゃんとしたソースコードはここ。
JSFSample/CalcCtrl.java at master · masanobuimai/JSFSample · GitHub


何がしたかったかというと、Grailsや(最近は知らないけど)RailsみたくViewに渡す値をコントローラのメンバ変数に持たすのではなく、リクエストに紛れ込ませてみた。それを取り出すView側のコードはこんな感じ。

<h:inputText id="left" label="左辺" value="#{requestScope.left}"
             style="#{faceUtils.valid(component.clientId)}" required="true">
  <f:validateLongRange maximum="99999"/>
</h:inputText>
  :
<h:dataTable value="#{viewScope.results}" var="calc">
  <h:column>
    <h:outputText value="#{calc.left}"/> +
    <h:outputText value="#{calc.right}"/> =
    <h:outputText value="#{calc.answer}"/>
  </h:column>
</h:dataTable>


入力値(左辺・右辺)の受け取り方がJavaBeans(Calc)経由ではなく、リクエスト(requestMap("left" or "right"))経由でString型の取り出しになるため、そのままだと型チェックが効かない。なんでまぁ、苦肉の策として範囲チェック(validateLongRange)をあてて型チェックも兼ねさせる。

やってみて一応できたけど「こりゃイケる」という感慨はなかった。むしろJSFとしてはかなりトリッキーな組み方になるんで、こんなの広めても良いこと何も無いなと思うのであった。
別の見方をすると「JSF、柔軟性ありすぎや」とも言える。この話はもちょっと続くのだけれど、今回はこれでおしまい。