我正在使用JSF2和PrimeFaces3。当用户在下拉菜单中更改选项时,如何编写selectOneMenu以调用JSF导航来重定向用户到另一个页面?
我正在使用JSF2和PrimeFaces3。当用户在下拉菜单中更改选项时,如何编写selectOneMenu以调用JSF导航来重定向用户到另一个页面?
附加一个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.xhtml
、page2.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正确更改,这对用户体验和页面可书签性更好。您可以这样写:
<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等)
不要使用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>
即使会话超时,这也可以正常工作。
redirect
而不是navigationHandler
进行导航:D - spauny