JSF/PrimeFaces selectOneMenu更改view-id

4

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

3个回答

8

附加一个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.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正确更改,这对用户体验和页面可书签性更好。

我没有看到评论(不知道为什么),否则我就不会发表评论了... - spauny
@spauny:我不确定你的意思。难道你不是想说“回答”而不是“评论”吗?如果你觉得你的回答是多余的,就删掉它吧。 - BalusC
是的,抱歉,我是指答案...我的回答并不完全是多余的;它还提到了使用redirect而不是navigationHandler进行导航:D - 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>

在您的导航方法中,您有:

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

前两个selectItem用于完整的URL,最后一个用于Web应用程序中的另一页(请注意扩展名必须是您的web.xml设置的扩展名之一 - 可以是.jsf、.xhtml、.htm等)


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>

即使会话超时,这也可以正常工作。


我尝试使用ajax方法,但一旦会话超时,你就会得到一个不响应任何操作的菜单。 - DD.
1
请注意,OP明确要求“调用JSF导航”。也许他真的需要以编程方式执行此操作,例如因为他需要跟踪页面以进行面包屑/历史记录等。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接