Как вы проходите просмотр параметров при навигации от действия в JSF2?
Вопрос
От действия в моем бобе, я пытаюсь перенаправить на другую страницу, ожидая параметра просмотра. Какой рекомендуемый способ сделать это в JSF2?
Например, скажем, моя исходная страница:http: //localhost/page1.xhtml.
У него есть команда, который вызывает действие:
<h:commandButton value="submit" action="#{myBean.submit}" />
где моя бобина выглядит:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success";
}
И теперь я хочу, чтобы «отправить» возвращение действия навигации кhttp: //localhost/page2.xhtml? ID = 2
Я пытался сделать это с помощью параметра VIEW на моем случае навигации, но с нечетными результатами. Фрагмент Faces-Config выглядит следующим образом:
<navigation-rule>
<from-view-id>/page1.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/page2.xhtml</to-view-id>
<redirect>
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
Странное поведение, даже если MyBean устанавливается на запрос на частоту, оно звонит только MyBean.GetID (), в первый раз, когда я загружаю мое приложение, и повторно использующую то же значение для всех последующих вызовов, создавая неправильные параметры просмотра для Page2.
Таким образом, я ищу либо лучший способ сделать это или причина / решение для того, почему параметр View не требуется из моим бобов каждый раз.
Решение
Неинтуитивная вещь о передаче параметров в JSF заключается в том, что вы не решаете, что отправлять (в действии), а скорее, что вы хотите получить (на целевой странице).
Когда вы выполняете действие, которое заканчивается перенаправленным, загружена метаданные целевой страницы, и все необходимые параметры читаются и добавляются к URL-адресу в качестве параметров.
Обратите внимание, что это точно такой же механизм, что и при любом другом связывании JSF: вы не можете прочитать значение IgplyText из одного места, и он пишет где-то еще. Выражение значения, определенное в viewparam, используется как для чтения (до перенаправления), так и для записи (после перенаправления).
С вашим бобов, вы просто делаете:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success?faces-redirect=true&includeViewParams=true";
}
// setter and getter for id
Если приемная сторона имеет:
<f:metadata>
<f:viewParam name="id" value="#{myBean.id}" />
</f:metadata>
Это сделает именно то, что вы хотите.
Другие советы
Без приятного решения, то, что я нашел на работу, просто строить мою строку запроса в бобовом возврате:
public String submit() {
// Do something
return "/page2.xhtml?faces-redirect=true&id=" + id;
}
Не самый гибкий из решений, но, похоже, работает, как я хочу.
Также используя этот подход для очистки процесса построения строки запроса:http://www.warski.org/blog/?p=185.
Проверьте эти:
- http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#get.
- http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-
Тебе нужно что-то вроде:
<h:link outcome="success">
<f:param name="foo" value="bar"/>
</h:link>
...а также...
<f:metadata>
<f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>
Судя по эта страница, что-то вроде этого может быть проще:
<managed-bean>
<managed-bean-name>blog</managed-bean-name>
<managed-bean-class>com.acme.Blog</managed-bean-class>
<managed-property>
<property-name>entryId</property-name>
<value>#{param['id']}</value>
</managed-property>
</managed-bean>
Вы можете сделать это с использованием таких главных стендов:
<p:button
outcome="/page2.xhtml?faces-redirect=true&id=#{myBean.id}">
</p:button>
Просто добавьте видимый атрибут для перенаправления тега, как показано ниже:
<redirect include-view-params="true">
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
Здесь Есть несколько навигационных примеров.
Решение без ссылки на бону:
<h:button value="login"
outcome="content/configuration.xhtml?i=1" />
В моем проекте мне нужен этот подход:
<h:commandButton value="login"
action="content/configuration.xhtml?faces-redirect=true&i=1" />