JSF2.2入門 第18回CDIとManagedBeanのViewScoped(ビュースコープ)


18title

ViewScopedはCDIとManagedBeanのどちらにも共通するものです。ViewScopedは同じViewの中でのみ有効なビーンです。ブラウザーのウィンドウやタブが違うと情報は共有できません。

katatsumuri-e1463911702620CDIのViewScoped

leaf-e1463911721194CDIビーンの書き方

第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;
}

}

leaf-e1463911721194CDIの使い方

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ではありませんからこのビーンは無効になってしまいます。

では順に確認してみましょう。

<入力画面> 何か入力しましょう。

20161108-input

<同じViewつまり同じページ> ちゃんとビーンの内容が表示されます。

20161108-sameview

<Forwardした場合> ビーンの内容は表示されません。

20161108-forward

<Redirectした場合> これもビーンの内容は表示されません。

20161108-redirect

katatsumuri-e1463911702620ManagedBeanのViewScoped

leaf-e1463911721194ManagedBeanの書き方

@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;
}

}

katatsumuri-e1463911702620どんなときにViewScopedはいいのか

このスコープはAjaxを使って同じページにとどまったままでページ遷移を伴わず、コンテンツをスムーズに操作するアプリケーションに向きます。なおビーンの中で@PostConstructアノーテーションを指定したメソッドはビーンがインスタンス化されるときに1回だけコールされ後は呼ばれません。そこで初期化されたものを同じView内で使い回します。

previousnext

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