Подтвердить что ты не робот

Как вы передаете параметры просмотра при навигации из действия в 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 каждый раз.

4b9b3361

Ответ 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&amp;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&amp;i=1"  />