我使用 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的问题吗?我非常感谢您能提供的任何帮助。
最佳答案
根据您的评论,听起来您正确使用了 h:inputHidden,并且问题必须出在 JSF bean 范围内。
bean 的行为就像它们在请求范围内一样。当您触发 h:commandLink 时,页面会重新呈现并将隐藏的输入发回,然后在导航结果(“下一个”或“上一个”)转发到另一个页面后,这些发布的值将不可用。
很可能 @Scope(ScopeType.CONVERSATION) 的行为与您期望的不同。我不是 Seam 专家,但从快速浏览文档来看,除非另有说明,Seam 将每个单独的 HTTP 请求视为一个“ session ”。这样就可以解释为什么当您单击命令链接时这些值会重置。您可能需要使用 @Begin/@End 注释来划分长时间运行的对话。
关于java - Seam 和 JSF - 误解 <h :inputHidden/>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251559/