Навигация PrettyFaces на selectOneMenu change

У меня есть приложение, использующее PrettyFaces и PrimeFaces. Доступ к одной странице осуществляется с использованием шаблона URL /#{ location : navigationBean.location }/#{ year : navigationBean.year }.

На этой странице у меня есть p:selectOneMenu, содержащий возможные значения местоположения. Если я изменю это меню, я хочу, чтобы страница обновлялась с тем же годом и новым местоположением.

Я протестировал это с помощью AJAX, чтобы установить местоположение в navigationBean, а затем нажал p:commandButton с результатом pretty:view (view - это идентификатор сопоставления URL-адресов). Это работает, но я хочу избавиться от кнопки.

Я пробовал следующее, но, к сожалению, возвращаемая строка в методе не выполняет навигацию.

JSF:

<p:selectOneMenu value="#{navigationBean.location}">
    <p:ajax listener="#{navigationBean.navigate}"/>
    <f:selectItems value="#{locationBean.locations}"/>
</p:selectOneMenu>

Поддерживающий компонент:

public String navigate(AjaxBehaviorEvent event)
{
    return (location != null) ? "pretty:view" : null;
}

Конфигурация PrettyFaces:

<url-mapping id="view">
    <pattern value="/#{ location : navigationBean.location }/#{ /\\d{4}/ year : navigationBean.year }/"/>
    <view-id value="/view.xhtml"/>
</url-mapping>

person siebz0r    schedule 10.09.2012    source источник


Ответы (1)


Вы не можете вернуть результат навигации из слушателей действий (ajax). Вы можете вернуть его только из реальных методов действия, используемых в <h:commandButton action>.

Используйте _ 2_.

public void navigate() {
    FacesContext context = FacesContext.getCurrentInstance();
    context.getApplication().getNavigationHandler()
        .handleNavigation(context, null, (location != null) ? "pretty:view" : null);
}
person BalusC    schedule 10.09.2012
comment
Приятное спасибо! Для записи ExternalContext#redirect() не работал с PrettyFaces. Неуклюжий код - это ошибка с моей стороны (пропустил место, упрощающее пример, обновил свой вопрос). - person siebz0r; 10.09.2012
comment
Пожалуйста. ExternalContext#redirect() принимает только реальные URL-адреса, а не идентификаторы представлений JSF или результаты навигации, не говоря уже об идентификаторах представлений PrettyFaces или результатах навигации. - person BalusC; 10.09.2012
comment
Объясняет многое. Я отредактировал ваш ответ по соображениям здравомыслия (чтобы он соответствовал обновленному ответу). Спасибо еще раз. - person siebz0r; 10.09.2012