谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

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


なぜ?