JSFの画面遷移について説明します。
通常Webシステムの画面遷移といえば、以下2種類による遷移になります。
- リンククリック
- ボタンを押す
JSFの場合どのようにそれを実現するのかを説明します。
目次
JSFの初期表示処理
JSFでは一般的には以下のような画面遷移になります。
XHTML→ManagedBean→XHTML→ManagedBean→XHTML→・・・
何が言いたいのかというとスタートが必ずXHTMLから始まるということです。
ここで1つ問題が出てきます。
初期表示時の初期値はどうやって設定するんだ!?
JSFの初期表示処理は以下2つがあるようです。
ポストコンストラクタ
ポストコンストラクタとはJavaの一般的なイメージでいうところのコンストラクタです。つまりオブジェクトが生成されたときに実行される処理のことです。
普通のコンストラクタとの違いはCDIが利用できるか/できないかです。
コンストラクタ | CDIが実行できるようになる前に処理が開始 |
ポストコンストラクタ | CDIが実行できるようになって処理が開始 |
なので、JSF開発ではコンストラクタはほとんど利用せず、ポストコンストラクタを利用することになります。
ポイントは対象のManagedBeanのオブジェクトが生成されるたびに実行されるということです。なので利用しているスコープによって実行タイミングは変わります。
ポストコンストラクタを実装するには「@PostConstruct」を付けて戻り値voidのメソッドを定義するだけです。
import javax.annotation.PostConstruct; ・・・省略・・・ @PostConstruct public void init() { System.out.println("ポストコンストラクタ"); }
f:viewAction
Faceletsに画面呼び出し時に実行する処理を設定し、ManagedBeanに処理内容を定義する方法です。
こちらはオブジェクトの生成にかかわらず、初期画面表示時に実行されることがポイントです。
<body> <f:metadata> <f:viewAction action="#{transitionBean.view()}"/> </f:metadata> </body>
public void view() { System.out.println("viewAction"); }
サンプルソース
facelets:transition1.xhtml
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h ="http://xmlns.jcp.org/jsf/html" xmlns:f ="http://xmlns.jcp.org/jsf/core" xmlns:ui ="http://xmlns.jcp.org/jsf/facelets" xmlns:jsf="http://xmlns.jcp.org/jsf"> <head> </head> <body> <f:metadata> <f:viewAction action="#{transition1Bean.view()}"/> </f:metadata> </body> </html>
ManagedBean:Transition1Bean
package com.ittoybox.bean; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.faces.view.ViewScoped; import javax.inject.Named; @Named @ViewScoped public class Transition1Bean implements Serializable { /** * コンストラクタ */ public Transition1Bean() { System.out.println("コンストラクタ"); } /** * ポストコンストラクタ */ @PostConstruct public void init() { System.out.println("ポストコンストラクタ"); } /** * viewAction */ public void view() { System.out.println("viewAction"); } }
実行結果
コンストラクタ
ポストコンストラクタ
viewAction
画面遷移
次は画面遷移する方法について説明します。
画面1(XHTML) ⇒ 画面2(XHTML)
あまりケースとしてはないと思いますがXHTML⇒XHTMLの例。メニューから他画面への遷移とかメニューへの戻るぐらい?と思います。
button | <a jsf:outcome=”index”>メニューへ戻る</a> |
リンク | <button jsf:outcome=”index”>メニューへ戻る</button> |
outcomeに指定するのはxhtmlのファイル名です。jsf:outcome=”index.xhtml”でもよいですが、拡張子(xhtml)は省略可能です。
画面1(XHTML) ⇒ Java(ManagedBean) ⇒ 画面2(XHTML)
次はXHTMLからManagedBeanを介して別のXHTMLへ遷移する方法です。よくある一般的ン画面遷移と思います。画面遷移方法をパススルーアトリビュートを利用した記述方法で紹介します。
button | <button jsf:action=”#{transition1Bean.exec()}”>ボタンで画面遷移</button> |
リンク | <a jsf:action=”#{transition1Bean.exec()}”>リンクで画面遷移</a> |
action属性にはManagedBeanの先頭小文字.メソッド名をEL式(#{}のこと)に指定します。
ManagedBean側
public String exec() { return "transition2.xhtml"; //遷移先のxhtmlを指定 }
java側の戻り値は呼び出したい画面を指定します。