Как вы передаете параметры просмотра при навигации из действия в JSF2?
Из действия в моем bean, я пытаюсь перенаправить на другую страницу, ожидающую параметра вида. Каков рекомендуемый способ сделать это в JSF2?
Например, моя исходная страница:
http://localhost/page1.xhtml
у него есть commandButton, который вызывает действие:
<h:commandButton value="submit" action="#{myBean.submit}" />
где my bean выглядит следующим образом:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success";
}
И теперь, я хочу, чтобы действие "отправить" вернулось, чтобы перейти к
http://localhost/page2.xhtml?id=2
Я попытался сделать это с помощью параметра view-param в моем случае навигации, но с нечетными результатами. Фрагмент 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() при первом загрузке моего приложения и повторно использует это же значение для всех последующих вызовов, создавая неверные параметры просмотра для страницы2.
Итак, я ищу либо лучший способ сделать это, либо причину/решение для того, почему параметр view не запрашивается с моего bean каждый раз.
Ответы
Ответ 1
Неинтуитивная вещь о передаче параметров в JSF заключается в том, что вы не решаете, что отправлять (в действии), а скорее то, что вы хотите получить (на целевой странице).
Когда вы выполняете действие, которое заканчивается перенаправлением, загружаются метаданные целевой страницы, и все необходимые параметры считываются и добавляются к URL-адресу в качестве параметров.
Обратите внимание, что это точно такой же механизм, как и с любой другой привязкой JSF: вы не можете прочитать значение inputText из одного места и писать в другом месте. Выражение значения, определенное в viewParam, используется как для чтения (перед перенаправлением), так и для записи (после перенаправления).
С помощью bean вы просто выполните:
@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>
Он будет делать именно то, что вы хотите.
Ответ 2
Без лучшего решения, что я нашел для работы, просто строит строку запроса в bean return:
public String submit() {
// Do something
return "/page2.xhtml?faces-redirect=true&id=" + id;
}
Не самый гибкий из решений, но, похоже, работает так, как я этого хочу.
Также используя этот подход для очистки процесса построения строки запроса:
http://www.warski.org/blog/?p=185
Ответ 3
Посмотрите на них:
Вам понадобится что-то вроде:
<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>
Ответ 4
Вы можете сделать это с помощью Primefaces следующим образом:
<p:button
outcome="/page2.xhtml?faces-redirect=true&id=#{myBean.id}">
</p:button>
Ответ 5
Просто добавьте видимый атрибут для тега перенаправления, как показано ниже:
<redirect include-view-params="true">
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
Вот несколько примеров навигации.
Ответ 6
Решение без ссылки на Bean:
<h:button value="login"
outcome="content/configuration.xhtml?i=1" />
В моем проекте мне нужен такой подход:
<h:commandButton value="login"
action="content/configuration.xhtml?faces-redirect=true&i=1" />