Передача свойства JSF от поддерживающего компонента A к вспомогательному компоненту B - PullRequest
3 голосов
/ 18 февраля 2011

В настоящий момент я углубляюсь в JSF 2.0, и мне немного не хватает понимания о "переносе" свойств управляемого компонента из одного представления в другое. Я немного искал, но не нашел действительно хорошего примера, так что если кто-нибудь мог бы указать мне на учебник или объяснить немного, я был бы очень благодарен.

Итак, вот мой сценарий:

Я занимаюсь разработкой приложения для календаря для маленьких площадок. Первое представление select.xhtml содержит переключатель календаря, в котором пользователь может выбрать конкретную дату:

<html>
  ...
  <h:form>

    <!-- Calendar selector from primefaces -->
    <p:calendar value="#{calendarSelect.date}" mode="inline" navigator="true" />

    <p:commandButton value="Show entries for date" action="day" />
    ...

Мой соответствующий боб выглядит следующим образом:

@ManagedBean(name="calendarSelect")
@RequestScoped
public class CalendarSelectComponent {

  private Date date = null;

  ... // Getters and setters

Теперь, когда я отправляю форму с select.xhtml, меня перенаправляют на day.xhtml

<html>
  ...
  <h:form>

    The current day ist:
    <h:outputText value="#{calendarEdit.date}">
      <f:convertDateTime pattern="dd.MM.yyyy" />
    </h:outputText>

Теперь поддерживающий боб выглядит так:

@ManagedBean(name="calendarEdit")
@ViewScoped
public class CalendarEditComponent implements Serializable {

  private Date date = null;
  private CalendarEntryBean currentEntry = null;
  private List<CalendarEntryBean> allEntries = null;

  ....

Сейчас я пытаюсь решить проблему: как передать параметр date из селектора в редактор ?

Я пробовал несколько вариантов, один из них был таким:

<p:commandButton value="Show entries for date" action="day" />
  <f:setPropertyActionListener target="#{calendarEdit.date}" value="#{calendarSelect.date}" />
</p:commandButton>

Отладчик показывает, что действительно, date свойство calendarEdit заполняется значением из calendarSelect, но, поскольку day.xhtml является новым представлением, создается новый компонент поддержки CalendarEditComponent а не тот, который я заполнил датой из селектора в представлении select.

Я читал, что одним из решений было бы создание базового компонента SessionScoped, который бы сохранял все свои значения. Но я не думаю, что это должно работать, потому что мне не нужна информация в сеансе , я просто хочу, чтобы она «путешествовала» от А к В. Еще один недостаток сеанса Основанный на этом подход заключается в том, что я могу использовать только один селектор и один редактор для каждой сессии - что, я думаю, неприемлемо, если вы думаете о многооконной навигации и т. д.

Я действительно не думаю, что я первый столкнулся с таким сценарием, и я уверен, что JSF предлагает элегантное решение для этого, но я не смог найти это решение.

Итак, еще раз, если кто-нибудь знает, как подойти к этому - я слушаю! ; -)

1 Ответ

2 голосов
/ 18 февраля 2011

<f:setPropertyActionListener> выполняется во время фазы действия вызова формы отправки.Таким образом, ожидается, что значение все еще там в этой точке.Но так как ваш выбранный bean-компонент является областью запроса, его больше нет при отправке формы.Вместо этого вы хотите передать параметр запроса, который будет встроен в вывод во время ответа рендеринга.Вы можете сделать это с помощью <f:param>.

<p:commandButton value="Show entries for date" action="day" />
  <f:param name="date" value="#{calendarSelect.dateAsString}" />
</p:commandButton>

. Он будет доступен в качестве параметра запроса (обратите внимание, что он понимает только строки из-за природы HTTP).Вы могли бы позволить JSF устанавливать параметры запроса в качестве управляемых свойств, но, поскольку ваш bean-объект редактирования имеет вид, это невозможно с @ManagedProperty.Вы должны собрать его самостоятельно ExternalContext.

String dateAsString = externalContext.getRequestParameterMap().get("date");

Правда, это неуклюже.Я бы просто использовал тот же компонент и представление для этого и переключал бы видимость выбора / редактирования форм с помощью атрибута rendered.В конце концов, представление редактирования не может быть открыто или добавлено в закладки простым GET, не так ли?;)

...