ViewScopedはCDIとManagedBeanのどちらにも共通するものです。ViewScopedは同じViewの中でのみ有効なビーンです。ブラウザーのウィンドウやタブが違うと情報は共有できません。
CDIのViewScoped
CDIビーンの書き方
第16、17回RequestScopedやSessionScopedのところで作ったものと同じ趣味を保持するビーンをViewScopedで作ります。
アノーテーションのところがキーポイントです。@NamedはRequestScopedやSessionScopedと同じです。次に@ViewScopedを書きます。それに対応してjavax.faces.view.ViewScopedをインポートします。もともとViewScopedはCDIでは定義されておらずjavax.enterprise.contextパッケージにはありません。JSFがその代わりに作ったものなのです。CDIのSessionScopedと同じく完全修飾子でアノーテーションを書く必要はありません。セッション期間中にビーンは生きていなければいけないのでSessionScopedと同様にSerializableをインプリメントしなければなりません。
[HobbyViewBean.java]
package com.myjsf;
import javax.inject.Named;
import java.io.Serializable;
import javax.faces.view.ViewScoped;
@Named(value=”hobbyViewBean”)
@ViewScoped
public class HobbyViewBean implements Serializable{
private String hobby;
public HobbyViewBean() {
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
CDIの使い方
RequestScopedやSessionScopedの時と同じJSFページを用意します。これで動作を確認してみます。
[viewScopeSample.xhtml]
<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:h=”http://xmlns.jcp.org/jsf/html”>
<h:head>
<title>ViewScope sample</title>
</h:head>
<h:body>
<h2>ViewScopeの例</h2>
<h:form>
あなたの趣味は何ですか:<h:inputText value=”#{hobbyViewBean.hobby}”/><p/>
<h:commandButton value=”このページで表示” /><p/>
<h:commandButton value=”Forwardして表示” action=”viewScopeCheckNextPage.xhtml”/><p/>
<h:commandButton value=”Redirectして表示” action=”viewScopeCheckNextPage.xhtml?faces-redirect=true;”/>
</h:form>
<br/>
あなたが入力した趣味:
<h:outputText value=”#{hobbyViewBean.hobby}”/>
</h:body>
</html>
commandButtonが3つあります。注意して見てほしいのですが、1番目のボタンにはactionプロパティがありませんね。これはつまり同じViewのままでサーバーと通信を行っているわけです。ViewScopedビーンが有効な範囲内という典型の例です。
2番目のボタンはactionプロパティがあって、クリックされるとviewScopeCheckNextPage.xhtmlにForwardされます。そうすると同じViewではなくなりますからViewScopedビーンは無効になって何も情報を参照できません。
3番目のボタンにもactionプロパティがあって、しかもリダイレクトが有効になっています。これも同じViewではありませんからこのビーンは無効になってしまいます。
では順に確認してみましょう。
<入力画面> 何か入力しましょう。
<同じViewつまり同じページ> ちゃんとビーンの内容が表示されます。
<Forwardした場合> ビーンの内容は表示されません。
<Redirectした場合> これもビーンの内容は表示されません。
ManagedBeanのViewScoped
ManagedBeanの書き方
@ManagedBeanをつけている点はいつものお約束ですが、CDIと一番違うところは同じ「@ViewScoped」でも定義されいるパッケージが違います。javax.faces.bean.ViewScopedを使いますので、間違えないようにしましょう。実行結果はさきほどのCDIとまったく同じなので省略します。
[HobbyViewBeanMB .java]
package com.myjsf;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class HobbyViewBeanMB implements Serializable{
private String hobby;
public HobbyViewBeanMB() {
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
どんなときにViewScopedはいいのか
このスコープはAjaxを使って同じページにとどまったままでページ遷移を伴わず、コンテンツをスムーズに操作するアプリケーションに向きます。なおビーンの中で@PostConstructアノーテーションを指定したメソッドはビーンがインスタンス化されるときに1回だけコールされ後は呼ばれません。そこで初期化されたものを同じView内で使い回します。


JSF2.2のすべてをまとめたkindle電子書籍 「JavaServer Faces2.2 入門」もぜひご覧ください。パソコン、iPhone、Androidどんな端末用にもamazonが無料のKindle電子書籍リーダーを用意しています。それをつかってKindle本を手軽にお楽しみください。あなたが今お使いの端末用Kidle電子書籍リーダーのご案内