程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> JSF導航文件如何設置實例解析

JSF導航文件如何設置實例解析

編輯:JAVA編程入門知識

  The JavaServer Faces (JSF)的Navigation框架提供了一些導航規則,可以使您在設計網站應用程序時定義view(大部分是jsp頁面)之間的頁面導航。這些規則和 其他一些設置一起定義在JSF配置文件中。

  該文件的名稱一般是 faces-config.XML 。不過完全可以把這個文件名改成其他名字,甚至可以用多個配置文件來存放相關的JSF配置信息,只要在web.xml文件中進行類似下面的設置:
  
  Code:

 <context-param> 
  
  <param-name>
  
  javax.faces.CONFIG_FILES
  
  </param-name>
  
  <param-value>
  
  /WEB-INF/faces-config.xml,
  
  /WEB-INF/faces-beans.xml
  
  </param-value>
  
  </context-param>

  一個簡單的例子

  一個導航規則的構成其實很簡單,讓我們來看第一個例子:
  
  Code:
  
  

 <navigation-rule> 
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
    <from-outcome>sayHello</from-outcome>
  
    <to-view-id>
  
    /pages/greeting.jsp
  
    </to-view-id>
  
  </navigation-case>
  
  <navigation-case>
  
   <from-outcome>sayGoodbye</from-outcome>
  
   <to-view-id>
  
   /pages/goodbye.jsp
  
   </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  這段代碼規定了名為 /pages/inputname.jsp view的兩個輸出(outcomes), sayHello 和 sayGoodbye ,它們分別同特定的頁面相關聯。設置一個默認的輸出事件(Outcome Case)
  
  基本結構很簡單,但是可以在這個基礎在進行很多變化。請看下一段代碼:
  
  Code:
  
  
 
<navigation-rule> 
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
   <from-outcome>sayHello</from-outcome>
  
   <to-view-id>
  
   /pages/greeting.jsp
  
   </to-view-id>
  
  </navigation-case>
  
  <navigation-case>
  
    <to-view-id>
  
    /pages/goodbye.jsp
  
    </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  該段代碼同上面的代碼非常類似,不同的是在第二個 navigation-case 中缺少了 from-outcome元素。這意味著所有除sayHello之外的outcome都將進入/pages/goodbye.jsp頁面。
  
  利用模式
  
  JSF的navigation模型答應我們利用模式(patterns)。這些模式有一個以星號“*”結尾的字符串組成。參見下例:
  
  Code:
  
  
 <navigation-rule> 
  
  <from-view-id>/pages/*</from-view-id>
  
  <navigation-case>
  
  <from-outcome>menu</from-outcome>
  
  <to-view-id>/menu/main_main.jsp</to-view-id>
  
  </navigation-case>
  
  <navigation-case>
  
    <from-outcome>info</from-outcome>
  
    <to-view-id>/menu/info.Html</to-view-id>
  
  
  </navigation-case>
  
  </navigation-rule>

  
  這段導航規則適用於類似 /pages/exit.jsp 之類的任何以 /pages/ 為起始URL的頁面。注重星號一定要放在最後。例如一個類似 / pages/*.jsp 的模式是無效的。
  
  Resolving More Than One Matching Rule
  
  現在我們來細察一下JSF導航模型中該如何處理多個規則。具體見下面例子:
  
  Code:
  
  
 <navigation-rule> 
  
  <from-view-id>/pages/*</from-view-id>
  
  <navigation-case>
  
   <from-outcome>info</from-outcome>
  
   <to-view-id>/menu/generalHelp.html</to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
  
  <navigation-rule>
  
  <from-view-id>/pages/login.jsp</from-view-id>
  
  <navigation-case>
  
    <from-outcome>info</from-outcome>
  
    <to-view-id>/menu/loginHelp.html</to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
該例中,第二個導航規則,而不是前一個,將對 /pages/login.jsp 生效,盡管該頁面也匹配第一個規則中的模式 /pages/* 。這說明對於一個特定的 from-outcome ,匹配更為具體的規則將生效。
  
  "Global" Outcomes
  
  

  
  假設現在我們需要一個globalHelp輸出(outcome) 可以使得從任何頁面轉到幫助頁面 /help/index.html 。要實現該效果,可以利用下面兩個聲明中的任何一個:
  
  Code:
  
  
<navigation-rule> 
  
  <from-view-id>*</from-view-id>
  
  <navigation-case>
  
  <from-outcome>globalhelp</from-outcome>
  
  <to-view-id>
  
  /menu/generalHelp.html
  
  </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
  
  <navigation-rule>
  
  <navigation-case>
  
  <from-outcome>globalhelp</from-outcome>
  
  <to-view-id>
  
  /menu/generalHelp.html
  
  </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  第一段代碼在標簽 from-view-id 中使用了星號,而第二斷代碼甚至根本沒有用from-view-id標簽。兩者都可以達到相同的效果。不過需注重的是,一個空的from-view-id元素是沒有任何效果的,例如:
  
  Code:
  
  
<navigation-rule> 
  
  <from-view-id>*</from-view-id>
  
  <navigation-case>
  
    <from-outcome>
  
    globalhelp
  
    </from-outcome>
  
    <to-view-id>
  
    /menu/generalHelp.html
  
    </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
  
  <navigation-rule>
  
  <from-view-id>*</from-view-id>
  
  <navigation-case>
  
    <from-outcome>
  
    globalhelp
  
    </from-outcome>
  
    <to-view-id>
  
    /pages/goaway.html
  
    </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  規則的沖突
  
  

  
  這是個有趣的問題。假如有兩個相同的 from-view-id ,其包含from-outcome也相同,只是指向不同的頁面。來看看下一個例子:
  
  Code:
  
  
 
 <navigation-rule> 
  
  
  <from-view-id>*</from-view-id>
  
  <navigation-case>
  
    <from-outcome>
  
    globalhelp
  
    </from-outcome>
  
    <to-view-id>
  
    /menu/generalHelp.html
  
    </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
  
  <navigation-rule>
  
  <from-view-id>*</from-view-id>
  
  <navigation-case>
  
    <from-outcome>
  
    globalhelp
  
    </from-outcome>
  
    <to-view-id>
  
    /pages/goaway.html
  
    </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  這種情況下,最後一個規則將生效。同時還需注重本文前面提到可以將JSF配置信息置於多個文件中的情況。從而產生沖突的規則可能位於不同的配置文件,此時應根據 web.xml 文件中的JSF配置文件列表,在含沖突規則的配置文件中最後加載的文件中的相關規則將會生效。將一個導航規則分開為幾部分,這是同一種效果的不同實現方式。試比較下面兩段代碼:
  
  Code:
  
  
 
<navigation-rule> 
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
  <from-outcome>sayHello</from-outcome>
  
  <to-view-id>
  
  /pages/greeting.jsp
  
  </to-view-id>
  
  </navigation-case>
  
  <navigation-case>
  
  <from-outcome>
  
  sayGoodbye
  
  </from-outcome>
  
  <to-view-id>
  
  /pages/goodbye.jsp
  
  </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  Code:
  
  
 
<navigation-rule> 
  
   <from-view-id>
  
   /pages/inputname.jsp
  
   </from-view-id>
  
   <navigation-case>
  
  <from-outcome>
  
  sayHello
  
  </from-outcome>
  
  <to-view-id>
  
  /pages/greeting.jsp
  
  </to-view-id>
  
   </navigation-case>
  
  <navigation-rule>
  
  ...
  
  ...
  
  <navigation-rule>
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
  <from-outcome>
  
  sayGoodbye
  
  </from-outcome>
  
  <to-view-id>
  
  /pages/goodbye.jsp
  
  </to-view-id>
  
  </navigation-case>

  
  運行時兩者效果相同。不過,第二段代碼顯示規則聲明可以任意分開後放在配置文件的不同位置,甚至是不同的配置文件中。你可以根據自己的需要選擇不同的方式。在action中使用導航規則。現在,該看看如何將前面所學內容應用於程序中了。下面便是一個JSP頁面可能包含的代碼:
  
  Code:
  
  
<?xml:namespace prefix = h /><h:commandButton 
  
  id="submit"
  
  action="sayHello"
  
  value="Submit" />

  
  action屬性值將被用作一個輸出(outcome)。這裡是另一種方式:
  
  Code:
  
  
<h:commandButton id="submit" 
  
  action="#{GetNameBean.helloAction}"
  
  value="Submit" />

  
  
  這意味著將調用GetNameBean的helloAction方法,該方法運行的結果將成為一個outcome。注重helloAction必須是一個返回值為字符串的public方法。
  
  上面兩種不同action屬性值的寫法區別在考慮到配置文件中的一個標簽時將比較重要,這個標簽便是 from-action 標簽,我們前面還未提及。請參考下面代碼:
  
  Code:
  
  
 <navigation-rule> 
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
  <from-outcome>sayHello</from-outcome>
  
  <to-view-id>
  
  /pages/anotherhello.jsp
  
  </to-view-id>
  
  </navigation-case>
  
  <navigation-case>
  
  <from-action>
  
  #{GetNameBean.helloAction}
  
  </from-action>
  
  <from-outcome>sayHello</from-outcome>
  
  <to-view-id>
  
  /pages/hello.jsp
  
  </to-view-id>
  
  </navigation-case>
  
  </navigation-rule>

  
  在這段代碼中,兩個navigation cases均含有相同的 from-view-id 以及 from-outcome 元素,不過第二個navigation case包含一個from-action元素。假如 sayHello 這個outcome是通過 GetNameBean.helloAction 產生的話,第二個navigation case將生效,不過其原因僅僅是除 from-outcome 外兩者具有相同的優先級。
  
  Review
  
  為了檢查您對本文的理解情況。請看下面例子,在 /pages/inputname.jsp 這頁面中對commandButton有一下聲明:
  
  Code:
  
  
<h:commandButton id="submit" 
  
  action="#{GetNameBean.helloAction}"
  
  value="Submit" />

  
  而JSF配置文件則包含了一下內容:
  
  Code:
  
  
 
<navigation-rule> 
  
  <from-view-id>
  
  /pages/inputname.jsp
  
  </from-view-id>
  
  <navigation-case>
  
    <from-outcome>sayHello</from-outcome>
  
    <to-view-id>/a.jsp</to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
  
  <navigation-rule>
  
  <from-view-id>/pages/*</from-view-id>
  
  <navigation-case>
  
  <from-action>
  
  #{GetNameBean.helloAction}
  
  </from-action>
  
  <from-outcome>sayHello</from-outcome>
  
  <to-view-id>/b.jsp</to-view-id>
  
  </navigation-case>
  
  </navigation-rule>
假如上面頁面中的提交按鈕被按下,到底跳到/a.jsp還是/b.jsp的哪個頁面,假如在GetNameBean.helloAction返回值為sayHello的情況下又如何呢? 留給大家作為思考吧!
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved