我有一个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()不能正确读取属性值?
当我使用一个表单时,它工作正常。但我需要它们分开形式。
答案 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);
}