開発者ドキュメント

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と非常によく似ています。 🙂

ソースコードをダウンロードする

それをダウンロードする –

JSF-2- Conditional-Navigation-Example.zip

(11KB)

モバイルバージョンを終了