ひがやすを技術ブログ

電通国際情報サービスのプログラマ

仕様案

S2JSFで開発されるアプリケーションは、POJOベースになります。Webの環境が要らないので、テストも簡単です。でも、プレゼンテーション層のテストは要らない気もするけど。
1つの画面は、フォームとアクションのクラスで構成されます。足し算の入力画面と結果を出力する画面の場合次のようになります。


public class AddInputForm {
private int arg1;
private int arg2;
...後は、getter,setterメソッド
}

<form id="addInputForm">
<input type="text" id="arg1"/>
<input type="text" id="arg2"/>
<input type="submit"
action="#{addInputAction.calculate}"
value="calculate"/>
</form>

public class AddResultForm {
private int result;
...後は、getter,setterメソッド
}

<form id="addResultForm">
result:<span id="result">3</span>
</form>
3は実行時には、addResultForm.resultの値で置き換えられます。

public class AddInputAction {
private AddInputForm addInputForm;
private AddResultForm addResultForm;
private AddLogic addLogic;
...getter,setterメソッド
public String calculate() {
int arg1 = addInputFrom.getArg1();
int arg2 = addInputFrom.getArg2();
int result = addLogic.calculate(arg1, arg2);
addResultForm.setResult(result);
return "addResult";
}
}
faces-config.xml

<managed-bean>
<managed-bean-name>addInputForm</managed-bean-name>
<managed-bean-class>AddInputForm</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>addResultForm</managed-bean-name>
<managed-bean-class>AddResultForm</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>addInputAction</managed-bean-name>
<managed-bean-class>AddInputAction</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>addInputForm</property-name>
<value>#{addInputForm}</value>
</managed-property>
</managed-bean>
フォームは単にデータの入れ物です。
ポイントは、アクションクラスです。入力値を受け取るためのフォーム用のプロパティを定義しておけば、S2JSFがセットしてくれます。
また、プロパティ名とmanaged-bean-nameが一緒なら、managed-propertyの設定がなくても自動的にDIしてくれます。
次の画面に値を渡したい場合は、次の画面のフォームに対するプロパティを用意しておけば、S2JSFが自動的にセットしてくれます。Tapestryのように次のページを取得するメソッドを呼び出す必要もありません。
S2Containerで管理されているコンポーネントも同様にmanaged-propertyでDIできます。自動DIも同様です。
パターンでいうと、フォームはViewHelper、HTMLはViewTemplateになります。
早く欲しいなぁ。自分が。(^^;


フォームとアクションをきちんと分離して、アクションにDIするようにしたのがキーとなる考えですね。アクションのスコープは必ずリクエストにします。
からさわぎ@大阪の日曜日に難しい顔して考えてたときがあったと思うけど、その時に考えていたんですよ。