JSF如何加载托管bean的属性值?

时间:2013-07-27 14:37:50

标签: jsf ajax4jsf

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

第0步:

有一个托管bean BeanA,范围是请求。和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>

步骤2:

提交表单以验证文本输入

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  1. 使用<t:saveState>

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

    <a4j:keepAlive beanName="BeanA" />