Шов и JSF - недоразумение <h: inputHidden />? - PullRequest
0 голосов
/ 24 ноября 2011

Я написал веб-приложение для электронной коммерции с использованием Seam 2.2, JPA и JSF, которое, конечно же, содержит функцию поиска товаров.Для этого я создал класс SearchForm, который содержит различные параметры, используемые для поиска (начальный индекс, максимальное количество результатов, 'и' условия, 'или' условия и т. Д.). У меня также естьвеб-действие - ProductSearchAction - которое использует объект SearchForm для извлечения записей из базы данных.Это выглядит примерно так:

@Name("searchForm")
@AutoCreate
@Scope(ScopeType.CONVERSATION)
public class SearchForm {

   private int startIndex = 0;

   private int maxResults = 20;

   ...

}


@Name("productSearchAction")
@AutoCreate
@Scope(ScopeType.CONVERSATION)
public class ProductSearchAction {

   @In
   private SearchForm searchForm = null;

   @Out
   private List<Products> products = null;

   ...

   public void searchProducts() {
      ...
   }

   ...

}

В моем JSF я отображаю список продуктов, заключенный в <h:form />, с 2 <h:commandLink /> ссылками для перемещения вперед и назад по результатам.Поскольку я не создаю диалог для каждого поиска, я пытаюсь передать состояние объектам ProductSearchAction и SearchForm с помощью скрытых полей <h:inputHidden />.На моей странице есть такие поля:

<h:form>
   ...

   <h:inputHidden value="#{searchForm.maxResults}" />
   <h:inputHidden value="#{searchForm.startIndex}" />
   <h:inputHidden value="#{searchForm.andTerms}" />

   ...

   <h:commandLink action="next" value="Next" />
   <h:commandLink action="previous" value="Previous" />
</h:form>

Насколько я понимаю, <h:inputHidden /> состоит в том, что он будет заполнять соответствующие значения в SearchForm, которые затем будут доступны для ProductSearchAction.searchProducts().Когда я просматриваю исходный код HTML, я вижу скрытые параметры, устанавливаемые в HTML.Однако, когда я нажимаю «далее» или «предыдущий», что приводит меня к действию searchProducts(), ни одно из значений не устанавливается.

Не понимаю ли я, как работает <h:inputHidden />?Что мне нужно сделать, чтобы передать эти значения моему поисковому действию?Есть ли лучший способ достичь моей цели?Это проблема объема шва?Я ДЕЙСТВИТЕЛЬНО благодарен за любую помощь, которую вы можете оказать.

1 Ответ

1 голос
/ 27 ноября 2011

Исходя из вашего комментария, звучит так, как будто вы правильно используете h: inputHidden, и проблема должна лежать в области действия JSF-компонента.

Бины ведут себя так, как будто они являются областью запроса. Когда вы запускаете h: commandLink, страница повторно отображает и публикует скрытые входные данные обратно, а затем эти опубликованные значения становятся недоступными после того, как результат навигации («следующий» или «предыдущий») переходит на другую страницу.

По всей вероятности, @Scope (ScopeType.CONVERSATION) ведет себя не так, как вы ожидаете. Я не эксперт по Seam, но после быстрого сканирования документации кажется, что Seam рассматривает каждый отдельный HTTP-запрос как «разговор», если не указано иное. Так что это объясняет, почему значения сбрасываются при нажатии на ссылку commandLink. Вам, вероятно, нужно разграничить длительный разговор с аннотациями @ Begin / @ End.

http://seamframework.org/Community/ConversationExample

...