Seam&amp; JSF - 误解<h:inputhidden>?</h:inputhidden>

时间:2011-11-24 02:25:49

标签: java html jsf seam hidden-field

我使用Seam 2.2,JPA和JSF编写了一个电子商务Web应用程序,当然,它包含产品搜索功能。为了实现这一点,我创建了一个名为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 />的工作原理吗?要将这些值传递给我的搜索操作,我需要做什么?有没有更好的方法来实现我的目标?这是一个Seam Scope问题吗?我真的很感激你能给予的任何帮助。

1 个答案:

答案 0 :(得分:1)

根据你的评论,听起来你正确使用h:inputHidden,问题必须在于JSF bean范围。

bean的行为就像它们是请求范围一样。当您触发h:commandLink时,页面会重新呈现并发回隐藏的输入,然后在导航结果(“下一个”或“上一个”)转发到另一个页面后,这些发布的值不可用。

很可能@Scope(ScopeType.CONVERSATION)的行为与预期不符。我不是Seam专家,但是从文档的快速扫描看起来Seam将每个单独的HTTP请求视为“对话”,除非另有说明。这样可以解释为什么单击commandLink时值会重置。您可能需要使用@ Begin / @ End注释划分长时间运行的对话

http://seamframework.org/Community/ConversationExample