我正在使用JSF2和PrimeFaces3。我如何编写selectOneMenu,当他更改菜单中的选项时,会调用JSF导航将用户重定向到另一个页面?
答案 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.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正确更改,这对于用户体验和页面的可收藏性更有利。
答案 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>
即使会话超时,这仍然有效。