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

JSF如何加载托管bean的属性值?,jsf,ajax4jsf,Jsf,Ajax4jsf,我是JSF初学者。我有一个关于托管bean的问题 步骤0: 有一个托管bean BeanA,作用域是request。和BeanA instance1.propertyA=“0” 步骤1: 使用ajax更改国家,然后在BeanA.countryChanged方法中,更改托管bean BeanA.propertyA=“A” 步骤2: 提交表单以验证文本输入 <h:inputText id="street" required="#{BeanA.propertyA == "A"}" 这些症状

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

步骤0: 有一个托管bean BeanA,作用域是request。和BeanA instance1.propertyA=“0”

步骤1: 使用ajax更改国家,然后在BeanA.countryChanged方法中,更改托管bean BeanA.propertyA=“A”


步骤2: 提交表单以验证文本输入

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

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

JSF2.0是以ajax为核心设计的,它通过标准API中新的
视图
范围解决了这个问题

在JSF1.x中,您需要回到第三方组件库。在您的特定情况下,考虑到您同时使用Tomahawk和Ajax4jsf,您有两个选项:

  • 使用

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

    <t:saveState value="#{BeanA}" />
    
    <a4j:keepAlive beanName="BeanA" />
    
    
    

  • 您使用的是JSF1.x还是2.x?答案取决于此。在以后的问题中,请始终提及使用的确切JSF impl/版本。我想RichFaces 3.x中的1.x显然已经被使用了(
    在RichFaces 4.x中不再存在,而4.x只是JSF2.x),所以
    就是答案。但是如果它是2.x,
    @ViewScoped
    将是答案。谢谢,@BalusC,谢谢你的快速回复。提交表单时如何同步托管bean的属性状态?非常有用。非常感谢!