0

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

第2步:

提交表单以验证文本输入

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

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

4

1 回答 1

1

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

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

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

  1. 使用<t:saveState>.

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

    <a4j:keepAlive beanName="BeanA" />
    
于 2013-07-27T14:51:08.350 回答