[JSF]スコープ範囲についてのまとめ

JavaのWebアプリケーションフレームワークであるJSFを仕事で使う機会があったので、
備忘録を残そうと思います。

         使用環境

  • NetBeans8.2
  • JavaEE7.0
  • GlassFish4.1.1

JSFのスコープについて

簡単なサンプルを基に今回の備忘録を書きます。

【ManagedBean】

【view】

【実行例】
jsf3-1
【ボタンクリック後】
jsf3-2

サンプルの処理をまとめると
・f:metadata内のf:viewActionタグに設定された、ManagedBeanクラスのsetStrメソッドを実行
・画面表示
・いずれかのボタンをクリックした時にf:setPropertyActionListenerがManagedBeanクラスの変数selectdItemに値を設定
・変数selectdItemをテキストで表示
以上のすごくシンプルな内容です。
今回の主題はここから。

ManagedBeanのスコープをRequestScopedに変更

先ほどのサンプルはApplicationScopedに設定していました。
名前の表すとおりアプリケーションの稼働中有効なスコープ範囲です。
これを下記のようにRequestScopedに変更します。
RequestScopedに設定すると一度のリクエストレスポンスのやり取りでスコープの有効範囲は切れてしまいます。

【ManagedBean】

【view】
変更なし

【実行例】
JSF3-3
【ボタンクリック後】
JSF3-4

今度はボタンをクリックすると画面表示が消えて真っ白になりました。
これらの原因は以下のとおりです。
・ボタンが表示されなくなる原因
ボタン表示はui:repeatタグを使用して、ManagedBeanクラスのコレクション変数であるstrListの要素数だけ繰り返します。
しかしながら、strListに要素を追加するメソッドの呼び出しをf:viewActionタグで行なっていると、こちらはGETリクエストのみに反応してくれるタグなので、ボタンクリックなどのPOSTリクエストに対してはメソッドは呼ばれません。
結果、最初の表示に使った値はスコープの有効範囲が切れており、値を設定するメソッドも呼ばれていないのでボタンが形成されません。

・クリックしたボタンの名前が表示されなくなる原因
こちらの表示方法はシンプルでManagedBeanクラスの変数selectedItemの値を取得しているだけです。
そしてそのselectedItemに値を設定するのが以下のプログラム

この中でもボタンクリックで実行されるのが、先ほども触れたこの1行。
f:setPropertyActionListener target=”#{managedBean.selectedItem}” value=”#{item}”
このvalue属性に使用しているEL式が値設定の時に、再度インスタンスを参照しにいくのですが、スコープの有効期限が切れているため値の設定に失敗して真っ白といった流れになります。

つまりRequestScopedに設定する場合は、表示するだけならいいですが値の送信を行う場合は少し工夫しないといけないということです。
画面のHTMLにはしっかり文字列形成出来ているので、その値を使ってくれって思ってしまうのですが。。。
自分はフレームワークの都合上RequestScopedでせざるを得なかったので、値の送信にはonclickイベントでJavaScriptを使って行いました。
今回はここまでです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする