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