Java Seam&;JSF-误解<;h:未经授权/>;?

Java Seam&;JSF-误解<;h:未经授权/>;?,java,html,jsf,seam,hidden-field,Java,Html,Jsf,Seam,Hidden Field,我已经使用Seam 2.2、JPA和JSF编写了一个电子商务web应用程序,其中当然包含产品搜索功能。为了实现这一点,我创建了一个名为SearchForm的类,其中包含用于搜索的各种参数(开始索引、最大结果数”和“术语”或“术语”等)我还有一个web操作--ProductSearchAction,它使用SearchForm对象从数据库中提取条目。它看起来像这样: @Name("searchForm") @AutoCreate @Scope(ScopeType.CONVERSATION) publ

我已经使用Seam 2.2、JPA和JSF编写了一个电子商务web应用程序,其中当然包含产品搜索功能。为了实现这一点,我创建了一个名为
SearchForm
的类,其中包含用于搜索的各种参数(开始索引、最大结果数”和“术语”或“术语”等)我还有一个web操作--
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() {
      ...
   }

   ...

}
我对
的理解是,它将在
SearchForm
中填充适当的值,然后将这些值提供给
ProductSearchAction.searchProducts()
。当我查看HTML源代码时,我看到HTML中设置的隐藏参数。但是,当我单击“下一步”或“上一步”进入
searchProducts()
操作时,没有设置任何值


我是否误解了
的工作原理?我需要做什么才能将这些值传递给我的搜索操作?有没有更好的方法来实现我的目标?这是一个Seam范围问题吗?我非常感谢您提供的任何帮助。

根据您的评论,您似乎正确地使用了h:inputHidden,问题一定在于JSFbean的作用域

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

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


听起来您对JSF和h:InAuthidden的理解是正确的。要进行故障排除,请尝试使用相同的值将h:outputText添加到页面。还可以尝试h:outputText value=“#{searchForm}”来查看searchForm是否公开给您的JSF视图——也许Seam/JSF连接中有什么错误。当我编写视图源代码时,我肯定看到了隐藏的输入值,所以我知道它们至少在HTML本身中。但是,当我单击指向searchProducts()的“下一步”或“上一步”链接时,我在我的searchForm对象中看不到这些值。请显示您的导航配置/逻辑——“下一步”如何导致searchProducts()通常会呈现上一个请求中的值,并将这些值放回回回post back上的同一个bean中@范围(对话)为您提供了跨重定向保留bean值的额外优势。顺便说一句,JSF-wise的行为非常类似于,因此在开发/调试期间使用,并在一切正常工作后将其转换为。祝你好运
<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>