我使用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问题吗?我真的很感激你能给予的任何帮助。
答案 0 :(得分:1)
根据你的评论,听起来你正确使用h:inputHidden,问题必须在于JSF bean范围。
bean的行为就像它们是请求范围一样。当您触发h:commandLink时,页面会重新呈现并发回隐藏的输入,然后在导航结果(“下一个”或“上一个”)转发到另一个页面后,这些发布的值不可用。
很可能@Scope(ScopeType.CONVERSATION)的行为与预期不符。我不是Seam专家,但是从文档的快速扫描看起来Seam将每个单独的HTTP请求视为“对话”,除非另有说明。这样可以解释为什么单击commandLink时值会重置。您可能需要使用@ Begin / @ End注释划分长时间运行的对话。