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、柔軟性ありすぎや」とも言える。この話はもちょっと続くのだけれど、今回はこれでおしまい。