JSF 2には、複雑なページ・ナビゲーション・フローを解決するための非常に柔軟な条件付きナビゲーション・ルールが付属しています。次の条件付きナビゲーション・ルールの例を参照してください。
1. JSFページ
単純なJSFページ。このページから支払いページに移動するボタンがあります。
<?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://java.sun.com/jsf/html"> <h:body> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-format="fluid" data-ad-layout="in-article" data-ad-client="ca-pub-2836379775501347" data-ad-slot="6894224149"></ins> <script> (adsbygoogle = window.adsbygoogle ||[]).push({}); </script><h2>This is start.xhtml</h2> <h:form> <h:commandButton action="payment" value="Payment"/> </h:form> </h:body> </html>
2.マネージドBean
ナビゲーション・ルール内で条件付き検査を実行するためのサンプル・データを提供するマネージドBean。
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import java.io.Serializable; @ManagedBean @SessionScoped public class PaymentController implements Serializable { private static final long serialVersionUID = 1L; public boolean registerCompleted = true; public int orderQty = 99; //getter and setter methods }
3.条件付きナビゲーションルール
通常、faces-config.xmlの簡単なナビゲーションルールは次のように宣言しました。
<navigation-rule> <from-view-id>start.xhtml</from-view-id> <navigation-case> <from-outcome>payment</from-outcome> <to-view-id>payment.xhtml</to-view-id> </navigation-case> </navigation-rule>
JSF 2では、支払いページに移動する前にいくつかの条件付きチェックを追加できます。以下を参照してください。
-
faces-config.xml **
<?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig__2__0.xsd" version="2.0"> <navigation-rule> <from-view-id>start.xhtml</from-view-id> <navigation-case> <from-outcome>payment</from-outcome> <if>#{paymentController.orderQty < 100}</if> <to-view-id>ordermore.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>payment</from-outcome> <if>#{paymentController.registerCompleted}</if> <to-view-id>payment.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>payment</from-outcome> <to-view-id>register.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config>
これは、次のJavaコードと同じです。
if (from-view-id == "start.xhtml"){ if(from-outcome == "payment"){ if(paymentController.orderQty < 100){ return "ordermore"; }else if(paymentController.registerCompleted){ return "payment"; }else{ return "register"; } } }
コードは十分に自明でなければなりません。
-
注意** 条件付きナビゲーションルールでは、ナビゲーションルールのシーケンスがナビゲーションフローに影響し、常に最上位に優先順位を設定します。
4.テスト
テスト用の異なるデータセット:
-
例1 **
public class PaymentController implements Serializable { public boolean registerCompleted = true; public int orderQty = 99; ...
ボタンをクリックすると、「
paymentController.orderQty <100
」基準に達し、「ordermore.xhtml」ページに移動します。
-
例2 **
public class PaymentController implements Serializable { public boolean registerCompleted = true; public int orderQty = 200; ...
ボタンをクリックすると、「
paymentController.registerCompleted
」基準に達し、「payment.xhtml」ページに移動します。
-
例3 **
public class PaymentController implements Serializable { public boolean registerCompleted = false; public int orderQty = 200; ...
ボタンをクリックすると、すべてのチェック基準に失敗し、 “register.xhtml”ページに移動します。
提案
JSF 2.0では、条件付きナビゲーションルールに「
else
」タグはありません。JSFチームは、将来のリリースで「else」タグを含めることができますか?例えば、
<navigation-rule> <from-view-id>start.xhtml</from-view-id> <navigation-case> <from-outcome>payment</from-outcome> <if>#{paymentController.orderQty < 100}</if> <to-view-id>ordermore.xhtml</to-view-id> <else if>#{paymentController.registerCompleted}</else if> <to-view-id>payment.xhtml</to-view-id> <else> <to-view-id>register.xhtml</to-view-id> </navigation-case> </navigation-rule>
さらに、このように複数の条件付き検査も含める必要があります
<navigation-rule> <from-view-id>start.xhtml</from-view-id> <navigation-case> <from-outcome>payment</from-outcome> <if>#{paymentController.orderQty < 100} && #{paymentController.xxx}</if> <to-view-id>ordermore.xhtml</to-view-id> <else if>#{paymentController.registerCompleted}</else if> <to-view-id>payment.xhtml</to-view-id> <else> <to-view-id>register.xhtml</to-view-id> </navigation-case> </navigation-rule>
-
思考… ** JSF 2条件付きナビゲーションルール、… Spring Web Flowと非常によく似ています。 🙂