JSF / PrimeFaces selectOneMenu изменить идентификатор представления - PullRequest
4 голосов
/ 24 ноября 2011

Я использую JSF2 и PrimeFaces3.Как я могу написать selectOneMenu, который будет вызывать JSF-навигацию, чтобы перенаправить пользователя на другую страницу, когда он изменит параметр в меню?

Ответы [ 3 ]

9 голосов
/ 24 ноября 2011

Присоедините слушателя ajax и позвольте ему перемещаться по NavigationHandler.

* 1006 Е.Г. *

<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 в адресной строке браузера будет правильно меняться, что лучше для удобства пользователей и возможности закладки страниц.

2 голосов
/ 24 ноября 2011

Вы можете иметь что-то вроде:

<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.xml - это может быть .jsf,. xhtml, .htm и т. д.)

0 голосов
/ 27 февраля 2013

Вместо использования 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>

Это работает, даже если время сеанса истекло.

...