国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:14:56
字體:
來源:轉載
供稿:網友
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>


規則的沖突

這是個有趣的問題。如果有兩個相同的 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:

<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的情況下又如何呢? 留給大家作為思考吧!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达孜县| 罗田县| 鞍山市| 和林格尔县| 布尔津县| 广德县| 石泉县| 墨玉县| 灵川县| 扶沟县| 鹤峰县| 仁布县| 乐业县| 连江县| 内丘县| 合江县| 定兴县| 万盛区| 华安县| 贵州省| 那曲县| 禄丰县| 长寿区| 郓城县| 华容县| 金溪县| 东兴市| 锡林浩特市| 定边县| 鄂州市| 绍兴市| 山西省| 乌兰县| 陇南市| 永川市| 卓尼县| 安义县| 武强县| 临漳县| 恩平市| 江华|