2011-11-24 79 views

回答

9

附加一個ajax監聽器,讓它通過NavigationHandler導航。

例如

<h:form> 
    <h:selectOneMenu value="#{navigator.outcome}"> 
     <f:selectItem itemLabel="Select page..." /> 
     <f:selectItem itemValue="page1" itemLabel="Page 1" /> 
     <f:selectItem itemValue="page2" itemLabel="Page 2" /> 
     <f:selectItem itemValue="page3" itemLabel="Page 3" /> 
     <f:ajax listener="#{navigator.navigate}" /> 
    </h:selectOneMenu> 
</h:form> 

(上面的例子中預計page1.xhtmlpage2.xhtml和在相同的上下文page3.xhtml;甚至可以使一個<f:selectItems>代替)

private String outcome; 

public void navigate() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
    navigationHandler.handleNavigation(context, null, outcome + "?faces-redirect=true"); 
} 

?faces-redirect=true是沒有必要,但它有效地發送重定向,以便瀏覽器地址欄中的URL可以正確更改,這對用戶體驗更好和書籤的頁面。

+0

工程就像一個魅力。謝謝! – mm1

+0

不客氣。 – BalusC

+0

我還沒有看到評論(我不知道爲什麼),否則我不會評論... – spauny

2

你可能有這樣的事情:

<p:selectOneMenu value="#{myBean.mySelectedPage}"> 
      <f:selectItem itemValue="http://www.yahoo.com" itemLabel="yahoo" /> 
      <f:selectItem itemValue="http://www.google.com" itemLabel="google" /> 
      <f:selectItem itemValue="search.jsf" itemLabel="search" /> 
      <p:ajax event="change" listener="#{myBean.myNavigationMethod}" /> 
</p:selectOneMenu> 

,並在你的navigationMethod您有:

String myPage = mySelectedPage 
FacesContext.getCurrentInstance().getExternalContext().redirect(myPage); 

前兩個selectItem是一個完整的URL,最後一個是在另一頁你web應用程序(請注意,擴展名必須是在web.xml中設置的擴展名 - 它可以是.jsf,.xhtml,.htm等)

0

而不是使用ajax導航u如下:

<p:selectOneMenu value="#{navigator.outcome}" onchange="window.location =this.options[this.selectedIndex].value">      
    <f:selectItem itemLabel="Select page..." /> 
    <f:selectItem itemValue="page1" itemLabel="Page 1" /> 
    <f:selectItem itemValue="page2" itemLabel="Page 2" /> 
    <f:selectItem itemValue="page3" itemLabel="Page 3" /> 
    <p:ajax event="change" listener="#{navigator.navigate}" /> 
</p:selectOneMenu> 

即使會話超時,此功能仍然有效。

+0

我嘗試過使用ajax方法,但是一旦會話超時,剩下的菜單就不會響應任何內容。 –

+1

請注意,OP明確詢問「調用JSF導航」。也許他確實需要以編程方式進行,例如因爲他需要跟蹤麪包屑/歷史記錄等頁面。 – BalusC