从JSF页面设置Managed Bean属性的值并在bean的方法中使用它

时间:2014-07-10 10:28:35

标签: jsf jsf-2

我有一个ViewScoped Managed Bean。在我的.xhtml页面中,我想设置bean的属性值,并在同一个bean的方法中使用它。 我设法从jsf页面设置值,但是当我想在某些方法中使用它时,属性的值不是我之前设置的值。

描述(xhtml): 在这种形式中,有一个命令链接,用于设置属性的值。它工作正常。此外,当单击命令链接时,将显示第二个表单。

<h:form>
  <h:commandLink value="Set" >
     <f:setPropertyActionListener target="#{bean.attribute}" value="true" />
     <f:ajax execute="@this" />
  </h:commandLink>
</h:form>

此表单执行使用之前设置的属性值的方法,但该值不为true,为false。

<h:form>
    <h:commandButton id="submit" value="Execute" action="#{bean.execute}" />
</h:form>

豆:

public void execute(){
    if(isAttribute())
        ---do something---
}

问题是:为什么execute()不能正确读取属性值?

当我使用一个表单时,它工作正常。但我需要它们分开形式。

2 个答案:

答案 0 :(得分:0)

bean的范围不正确。 ViewScoped意味着在视图更改的那一刻,bean被丢弃并重新创建以用于下一个视图。因此,在您的情况下,第一个视图的原始数据将丢失。

我将把你推荐给BalusC的博客:

http://balusc.blogspot.co.uk/2010/06/benefits-and-pitfalls-of-viewscoped.html

指出:

  

只要您一次又一次地将表单提交到同一视图,@ ViewScoped bean就会存在。换句话说,只要action方法返回null或甚至void,bean就会在下一个请求中出现。导航到不同的视图后,bean将被删除

答案 1 :(得分:0)

我无法确定您是否与两个请求保持同一页面。如果这样做,viewScope应该以两种不同的形式工作。如果您从1个视图导航到另一个视图,将创建另一个viewScope,您将丢失当前的视图。

您可以使用java或通过注释backingNean在sessionScope中设置值。但是后来backingBean中的所有内容都变成了sessionScoped,而且可能不需要。

您也可以使用类似弹簧的流量范围。

使用java执行此示例:

public void callThisAfterFirstClick() {
   Faces.setSessionAttribute(attribute, true)
}

public void callThisAfterSecondClick() {
   Faces.getSessionAttribute(attribute);
}