Передает ли f:viewParam только строку запроса в URL-адресе, когда первая страница использует тот же управляемый компонент, что и вторая страница?

Давайте использовать страницу поиска и страницу результатов, например. Если у меня есть bean-компонент ViewScoped, который обрабатывает мою страницу поиска и страницу результатов, я могу передавать параметры через URL-адрес, используя что-то вроде этого:

search.xhtml

<p:commandButton value="Search" type="submit" action="#{searchBacker.search}" >

поддерживающая фасоль

@ManagedBean(name="search")
@ViewScoped
public class searchBacker extends AbstractBacking {

  private String firstName = null;
  private String lastName = null;
  private String results = null;

  public String search() {
    return "results?faces-redirect=true&amp;includeViewParams=true";
  }

  public void getResults() {
    MyDAO dao = new MyDAO();
    results = dao.getResults(firstName, lastName);
  }

  //getters and setters
}

результаты.xhtml

<f:metadata>
  <f:event type="preRenderView" listener="#{searchBacker.getResults}" />
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>

Теперь предположим, что у меня есть два управляемых компонента: один для страницы поиска и один для страницы результатов.

Будет ли строка запроса по-прежнему встроена в URL-адрес с двумя разными управляемыми компонентами или это работает только при использовании одного и того же управляемого компонента для обеих страниц?

ОБНОВЛЕНИЕ

У меня одинаковые <f:viewParam> на страницах search.xhtml и results.xhtml, но единственная разница в том, что мой f:viewParam value указывает на другого покровителя в моем results.xhtml, чем в search.xhtml. Когда я это делаю, никакие параметры не передаются через URL-адрес. Когда я указываю свой f:viewParam value в results.xhtml на тот же бэкер, который я использую в search.xhtml, параметр прекрасно передается через URL-адрес, но значение не существует в бэкере результатов, где мне это нужно. Если у меня есть дублирующиеся f:viewParams на моей странице results.xhtml - один со сторонником поиска и один со сторонником результатов, все работает нормально. Является ли наличие 2 одинаковых f:viewParams с обоими управляемыми bean-компонентами правильным способом сделать это?

Примеры:

results.xhtml - параметры передаются через URL, но недоступны в моем resultsBacker

<f:metadata>
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>

results.xhtml - никакие параметры не передаются через URL-адрес

<f:metadata>
  <f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>

results.xhtml - параметры передаются через URL-адрес и доступны в моем resultsBacker, но кажутся неуклюжими. Это правильный способ сделать это или я все еще что-то упускаю?

<f:metadata>
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
  <f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>

person Catfish    schedule 02.08.2013    source источник
comment
В чем именно ваша проблема? Кажется, вы задаете риторический вопрос, на который легко ответить, поэкспериментировав с ним самостоятельно. Разве ваша конкретная проблема не в том, что includeViewParams=true не сработало?   -  person BalusC    schedule 04.08.2013
comment
Когда я попытался использовать includeViewParams=true с моим f:viewParam value, используя тот же компонент поддержки, что и моя страница поиска, все в порядке, но когда я изменил значение на новый компонент поддержки, параметры не отображаются в URL-адресе.   -  person Catfish    schedule 04.08.2013


Ответы (2)


includeViewParams работает только в том случае, если и исходное и целевое представление имеют требуемые параметры представления, объявленные как <f:viewParam>.

Итак, в вашем случае parituclar вам нужно поместить <f:viewParam> с одинаковыми name как в search.xhtml, так и в results.xhtml. Под обложками includeViewParams получает только параметры представления текущего представления, а затем применяет только те, которые также объявлены в целевом представлении.

Смотрите также:


Не связанный с конкретной проблемой, вы, похоже, действительно хотите получить форму GET. В этом случае для этого есть лучший способ, чем выполнение POST-Redirect-GET с параметрами. Посмотрите внизу выше См. также ссылку.

person BalusC    schedule 04.08.2013
comment
Не могли бы вы уточнить, что вы подразумеваете под only if both the source and target view have the desired view parameters? Обычно я просто перенаправляю на страницу и использую includeViewParams=true, а затем на странице, на которую я перенаправляюсь, у меня просто есть теги f:viewParam. - person Catfish; 05.08.2013
comment
Я уточнил ответ. - person BalusC; 05.08.2013
comment
Спасибо за разъяснения. Пожалуйста, смотрите обновленный раздел моего вопроса. - person Catfish; 05.08.2013
comment
Значение не обязательно должно быть одинаковым. Просто имя. Я уточнил ответ больше. - person BalusC; 05.08.2013
comment
Хорошо, мне интересно, является ли это ошибкой, потому что, как вы можете видеть из моего обновленного раздела, если у меня есть разные вспомогательные компоненты в value моих f:viewParam, ничего не передается через URL-адрес. - person Catfish; 05.08.2013
comment
Какая реализация/версия JSF? Не могу воспроизвести в Mojarra 2.1.24. - person BalusC; 05.08.2013
comment
В настоящее время я использую Mojarra 2.0.9, потому что с 2.1.x я не мог пройти мимо ошибки Невозможно создать сеанс после фиксации ответа. Позже я попытаюсь создать простой воспроизводимый случай. - person Catfish; 05.08.2013
comment
Воспроизведено в версии 2.0.9. Итак, вам нужно обновиться. Что касается новой проблемы session+committed, то она, в свою очередь, исправлена ​​в версии 2.1.18. См. также создать сеанс после того, как ответ был отправлен"> stackoverflow.com/questions/8072311/ - person BalusC; 05.08.2013

Я предлагаю вам реализовать два управляемых компонента @ViewScoped, один для страницы поиска, а другой для страницы результатов. У вас также должно быть две страницы xhtml, каждая из которых связана с bean-компонентом. Очевидно, что его страница будет иметь свой собственный URL-адрес (похоже, что вы делаете прямо сейчас с тем же компонентом).

Вы можете заставить bean-компонент второй страницы ожидать два параметра, firstName и lastName. После, в методе preRenderView, когда параметры уже установлены во втором управляемом компоненте, запросите вашу БД с этими значениями. Так как же добиться перехода между бобами? Результата должно быть достаточно.

<p:button outcome="results">
    <f:param name="firstName" value="#{searchBean.firstName}">
    <f:param name="lastName" value="#{searchBean.lastName}">
</p:button>

Это заставляет JSF создавать URL-адрес с нужными вам параметрами. После того, как вы можете сделать то же самое, что делаете сейчас, но используя второй bean-компонент для получения параметров (я настоятельно рекомендую вам не использовать метод получения для метода preRenderView):

<f:metadata>
  <f:event type="preRenderView" listener="#{resultBacker.initialize}" />
  <f:viewParam name="firstName" value="#{resultBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{resultBacker.lastName}"/>
</f:metadata>
person Xtreme Biker    schedule 03.08.2013