【问题标题】:Seam & JSF - misunderstanding <h:inputHidden />?Seam & JSF - 误解 <h:inputHidden />?
【发布时间】:2011-11-24 02:25:48
【问题描述】:

我使用 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() {
      ...
   }

   ...

}

在我的 JSF 中,我显示了包含在 &lt;h:form /&gt; 中的产品列表,其中包含 2 个 &lt;h:commandLink /&gt; 链接,用于在结果中向前和向后翻页。由于我没有为每次搜索创建对话,因此我试图通过使用 &lt;h:inputHidden /&gt; 隐藏字段将状态传递给 ProductSearchActionSearchForm 对象。我的页面中有这样的字段:

<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>

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

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

【问题讨论】:

  • 听起来你对JSF和h:inputHidden的理解是对的。要进行故障排除,请尝试使用相同的值将 h:outputText 添加到您的页面。还可以尝试 h:outputText value="#{searchForm}" 以查看 searchForm 是否完全暴露在您的 JSF 视图中 - 也许 Seam/JSF 接线中有问题。
  • 我在查看源代码时肯定会看到隐藏的输入值正在写入,所以我知道它们至少在 HTML 本身中就位。但是,当我单击将我带到 searchProducts() 的“下一个”或“上一个”链接时,我在 searchForm 对象中看不到这些值。
  • 请显示您的导航配置/逻辑——“下一步”如何导致 searchProducts()
  • 一般来说, 将呈现先前请求中存在的值,并在回发时将该值放回同一个 bean 中。 @Scope(CONVERSATION) 为您提供了跨重定向保留 bean 值的额外优势。顺便说一句, JSF 的行为与 非常相似,因此在开发/调试期间使用 ,并在一切正常后将它们转换为 。祝你好运!

标签: java html jsf seam hidden-field


【解决方案1】:

根据您的评论,您似乎在正确使用 h:inputHidden,并且问题必须出在 JSF bean 范围内。

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

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

http://seamframework.org/Community/ConversationExample

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2011-03-04
    • 1970-01-01
    • 2011-08-28
    • 2015-05-31
    • 2011-08-27
    相关资源
    最近更新 更多