実は理解していません、その1
S2JSFって、requestとsessionの動きさえ理解してれば
大体どんな問題も、説明つくじゃん? と思ってました。
実は、結構違いました。
まずは、m:rendered + m:actionの問題。
- m:renedered=#{!empty xxx} の判定を行なう。
- その判定で囲まれた場所にaタグを置く。
という時、リンクは表示されるが、submitしてもactionが呼ばれないという問題。
[Seasar-user:3063] [S2JSF] m:rendered使用時のActionが呼ばれない(再)
なんかで話題になった問題ですね。
sessionとかhiddenを使うべしと言われていましたが、私は別の方法で解決しています。
- renderedの表示判定メソッド(戻り値boolean)をInitActionに追加する。
- そのメソッドの戻り値を使って、m:renderedを記述する。
具体的には、こうです。
■ViewLogBeanクラスに以下のメソッドを追加。
public boolean getSelected() {
String selectedLogFile = viewLogForm.getSelectedLogFile();
return (selectedLogFile != null && selectedLogFile.length() > 0);
}
■ViewLog.htmlの表示判定を以下のように変更。
<tr><td>
<span m:rendered="#{selected}" >
<table border="0" width="100%"><tr>
<td width="50%" align="left"><span class="HEADER"><span m:value="#{viewLogForm.selectedLogFile}" /></span></td>
<td width="50%" align="right"><input type="button" value="テスト" m:action="#{viewLog.downloadLog}" /></td>
</tr></table>
</span>
</td></tr>
<tr><td><span m:value="#{viewLogForm.result}" /></td></tr>こうすれば、(恐らく)投稿者の意図通りに表示ができます。
ところで、この「selected」はrequestに保存されており、
ボタンを押すタイミングでは、requestから消えています。
なので、m:renderedとしてはfalseになりそうなものですが、
実際には、ボタンのActionは実行されます。
なぜ?