小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

CSDN技術(shù)中心 [翻譯]JSF導(dǎo)航文件設(shè)置示例

 feifan 2005-12-02
轉(zhuǎn)載請注明原作者、譯者以及出處。

JSF Navigation by Examples

JSF導(dǎo)航文件設(shè)置示例

作者:Sergey Smirnov       翻譯:fei

原文見http://forum./viewtopic.php?t=579



The JavaServer Faces (JSF)的Navigation框架提供了一些導(dǎo)航規(guī)則,可以使您在設(shè)計網(wǎng)站應(yīng)用程序時定義view(大部分是JSP頁面)之間的頁面導(dǎo)航。這些規(guī)則和其他一些設(shè)置一起定義在JSF配置文件中。該文件的名稱一般是faces-config.xml。不過完全可以把這個文件名改成其他名字,甚至可以用多個配置文件來存放相關(guān)的JSF配置信息,只要在web.xml文件中進行類似下面的設(shè)置:
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>


一個簡單的例子
一個導(dǎo)航規(guī)則的構(gòu)成其實很簡單,讓我們來看第一個例子:
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>
這段代碼規(guī)定了名為 /pages/inputname.jsp view的兩個輸出(outcomes),sayHellosayGoodbye,它們分別同特定的頁面相關(guān)聯(lián)。

設(shè)置一個默認的輸出事件(Outcome Case)
基本結(jié)構(gòu)很簡單,但是可以在這個基礎(chǔ)在進行很多變化。請看下一段代碼:
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)。這些模式有一個以星號“*”結(jié)尾的字符串組成。參見下例:
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>
這段導(dǎo)航規(guī)則適用于類似 /pages/exit.jsp之類的任何以 /pages/ 為起始URL的頁面。注意星號一定要放在最后。例如一個類似 /pages/*.jsp 的模式是無效的。

Resolving More Than One Matching Rule
現(xiàn)在我們來細察一下JSF導(dǎo)航模型中該如何處理多個規(guī)則。具體見下面例子:
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>

該例中,第二個導(dǎo)航規(guī)則,而不是前一個,將對/pages/login.jsp生效,盡管該頁面也匹配第一個規(guī)則中的模式 /pages/*。這說明對于一個特定的from-outcome,匹配更為具體的規(guī)則將生效。

"Global" Outcomes
假設(shè)現(xiàn)在我們需要一個globalHelp輸出(outcome) 可以使得從任何頁面轉(zhuǎn)到幫助頁面/help/index.html。要實現(xiàn)該效果,可以利用下面兩個聲明中的任何一個:
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>


規(guī)則的沖突
這是個有趣的問題。如果有兩個相同的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>
這種情況下,最后一個規(guī)則將生效。同時還需注意本文前面提到可以將JSF配置信息置于多個文件中的情況。從而產(chǎn)生沖突的規(guī)則可能位于不同的配置文件,此時應(yīng)根據(jù)web.xml文件中的JSF配置文件列表,在含沖突規(guī)則的配置文件中最后加載的文件中的相關(guān)規(guī)則將會生效。

將一個導(dǎo)航規(guī)則分開為幾部分
這是同一種效果的不同實現(xiàn)方式。試比較下面兩段代碼:
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>

運行時兩者效果相同。不過,第二段代碼顯示規(guī)則聲明可以任意分開后放在配置文件的不同位置,甚至是不同的配置文件中。你可以根據(jù)自己的需要選擇不同的方式。

在action中使用導(dǎo)航規(guī)則
現(xiàn)在,該看看如何將前面所學(xué)內(nèi)容應(yīng)用于程序中了。下面便是一個JSP頁面可能包含的代碼:
Code:
<h:commandButton id="submit" action="sayHello" value="Submit" />

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

這意味著將調(diào)用GetNameBean的helloAction方法,該方法運行的結(jié)果將成為一個outcome。注意helloAction必須是一個返回值為字符串的public方法。
上面兩種不同action屬性值的寫法區(qū)別在考慮到配置文件中的一個標簽時將比較重要,這個標簽便是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產(chǎn)生的話,第二個navigation case將生效,不過其原因僅僅是除from-outcome外兩者具有相同的優(yōu)先級(原文:If the sayHello outcome is determined by GetNameBean.helloAction, the second navigation case will take effect, but only because otherwise both cases had equal precedence.)

Review
為了檢查您對本文的理解情況。請看下面例子,在 /pages/inputname.jsp這頁面中對commandButton有一下聲明:
Code:
<h:commandButton id="submit" action="#{GetNameBean.helloAction}" value="Submit" />

而JSF配置文件則包含了一下內(nèi)容:
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 or /b.jsp的哪個頁面,如果在GetNameBean.helloAction返回值為sayHello的情況下又如何呢?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多