【问题标题】:How does JSF load property values of managed bean?JSF 如何加载托管 bean 的属性值?
【发布时间】:2013-07-27 18:17:28
【问题描述】:

我是 JSF 初学者。我有一个关于托管 bean 的问题。

步骤 0:

有一个托管bean BeanA,作用域是request。而BeanA instance1.propertyA = "0";

第 1 步:

使用ajax改变国家,然后在BeanA.countryChanged方法中,改变托管bean BeanA.propertyA = "A"。

<t:selectOneMenu id="Country" required="true" valueChangeListener="#{BeanA.countryChanged}">
    <a4j:support event="onchange" limitToList="true" ajaxSingle="true" />
    <f:selectItems value="#{BeanA.countries}" /> 
</t:selectOneMenu>

第二步:

提交表单以验证文本输入

<h:inputText id="street" required="#{BeanA.propertyA == "A"}"

我希望在步骤 2 中 BeanA instance2 的值 propertyA 在 JSF 验证阶段应该是“A”,但实际上它是“0”。我不知道 JSF 如何加载 BeanA 实例属性值来创建新的 BeanA 实例。我该怎么办,值将变为“A”?谢谢,

【问题讨论】:

  • 您使用的是 JSF 1.x 还是 2.x?答案取决于此。在未来的问题中,请始终提及使用的确切 JSF impl/version。我 1.x 显然已经使用了 RichFaces 3.x(&lt;a4j:support&gt; 不再存在于 RichFaces 4.x 中,4.x 仅是 JSF 2.x),所以 @987654324 @将是答案。但如果是 2.x,@ViewScoped 就是答案。
  • 我正在使用 JSF 1.X。谢谢,
  • @BalusC,感谢您的快速回复。提交表单时如何同步托管bean的属性状态?

标签: jsf ajax4jsf


【解决方案1】:

这些症状表明您的 bean 是请求范围的。这意味着它会在每个 HTTP 请求上进行重建。您可能没有意识到每个单独的 ajax 请求也算作一个单独的 HTTP 请求。实际上,您不会在同一个视图上跨 ajax 回发重用同一个 bean 实例。每次创建一个全新的实例时,其所有属性都设置为默认值。

JSF 2.0 在设计时考虑到了 ajax,在标准 API 中使用新的 view 范围解决了这个问题。

在 JSF 1.x 中,您需要回退到 3rd 方组件库。在您的特定情况下,鉴于您同时使用 Tomahawk 和 Ajax4jsf,您有 2 个选项:

  1. 使用&lt;t:saveState&gt;

    <t:saveState value="#{BeanA}" />
    
  2. 或者,使用&lt;a4j:keepAlive&gt;

    <a4j:keepAlive beanName="BeanA" />
    

【讨论】:

  • 非常有用。非常感谢!
猜你喜欢
  • 2012-06-30
  • 2013-12-23
  • 2011-07-10
  • 1970-01-01
  • 2011-12-25
  • 2015-03-11
  • 2017-02-07
相关资源
最近更新 更多