Как вы проходите просмотр параметров при навигации от действия в JSF2?

StackOverflow https://stackoverflow.com/questions/3605238

  •  25-09-2019
  •  | 
  •  

Вопрос

От действия в моем бобе, я пытаюсь перенаправить на другую страницу, ожидая параметра просмотра. Какой рекомендуемый способ сделать это в 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.

Проверьте эти:

Тебе нужно что-то вроде:

<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&amp;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&amp;i=1"  />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top