実は理解していません、その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は実行されます。
なぜ?