JSF / PrimeFaces selectOneMenu更改view-id

时间:2011-11-24 10:21:59

标签: jsf jsf-2 navigation primefaces selectonemenu

我正在使用JSF2和PrimeFaces3。我如何编写selectOneMenu,当他更改菜单中的选项时,会调用JSF导航将用户重定向到另一个页面?

3 个答案:

答案 0 :(得分:9)

附加一个ajax监听器,让它按NavigationHandler导航。

E.g。

<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.xhtmlpage3.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正确更改,这对于用户体验和页面的可收藏性更有利。

答案 1 :(得分: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等)

答案 2 :(得分:0)

使用以下内容代替使用ajax导航:

<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>

即使会话超时,这仍然有效。