在簡單web應用程序中,網(wǎng)頁導航是靜態(tài)的。也就是說,一個導航動作總是跳轉(zhuǎn)到固定的目的頁面。要實現(xiàn)靜態(tài)導航,在編寫頁面時只需要在動作構件(例如命令按鈕)的action屬性中指定導航的來源標識字符串,<h:commandButton label="login" action="login"/>。并且,如上文所述,我們需要在導航規(guī)則里配置一個outcome,告訴JSF引擎導航的目的地。導航規(guī)則在配置文件WEB-INF/faces-config.xml中的配置為:
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id> 來源網(wǎng)址
<navigation-case>
<from-outcome>login</from-outcome> 來源構件
<to-view-id>/welcome.xhtml</to-view-id>目的網(wǎng)址
</navigation-case>
</navigation-rule>
那么,用戶進入login.xhtml后,點擊命令按鈕,導航管理器將根據(jù)導航規(guī)則,執(zhí)行頁面跳轉(zhuǎn)到welcome.xhtml中去。
如果有好多頁面點擊命令按鈕后要跳轉(zhuǎn)到同一頁面,可以仔細挑選動作字符串,將多個導航規(guī)則組合在一起。例如,可以配置整個應用程序頁面中action輸出為logout的按鈕,點擊后,跳轉(zhuǎn)到logout.xhtml頁面。
<navigation-rule>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/logout.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
沒有指定from-view-id元素,上面的導航規(guī)則適合于所有頁面。
靜態(tài)導航中,action對應的是固定字符串。但在多數(shù)web應用程序中,導航不是靜態(tài)的,而是需要根據(jù)一定邏輯動態(tài)決定采用哪種導航規(guī)則。為此,OperaMasks中提供了動態(tài)導航特性。動態(tài)導航與靜態(tài)導航最大的區(qū)別在于action是通過EL表達式指定的方法。頁面的跳轉(zhuǎn)所采用的導航規(guī)則依賴于用戶對action方法的具體實現(xiàn)。
動態(tài)導航的action對應的是一個方法引用(method reference)。例如:
< h:commandButton label="test_dynamic" action="#{backBean.login}" />
要實現(xiàn)動態(tài)導航,action屬性中的方法要有返回值。導航控制器根據(jù)返回值的結果進行導航規(guī)則的匹配,進而實現(xiàn)頁面的跳轉(zhuǎn)。方法的返回值可以是任何類型,使用枚舉類型是一個有用的選擇,因為編譯器能夠在動作名稱中捕獲方法的返回值的類型。例如:在常見的用戶登錄界面中要核對用戶是否合法,根據(jù)核對的結果跳轉(zhuǎn)到不同的頁面,就要用動態(tài)導航來處理。其中action的方法引用的寫法可以如下:
public String login(){
if(username.equals(name)){
return "sucess";
}
else{
return "failure";
}
}
導航規(guī)則配置文件faces-config.xml的寫法和上面的靜態(tài)導航配置一樣(這里的配置可以被靜態(tài)導航和動態(tài)導航同時使用)。