JSF 2.0の条件付きナビゲーション・ルール
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と非常によく似ています。 🙂