我阅读了整个介绍,以了解我们何时以及为什么应该选择特定的Scope,这对于静态字段和方法来说是清楚的,但对于Bean本身的对象来说不是,至少对我来说是这样。
Bean1:
@ManagedBean
@SessionScoped
public class ConsultBean implements java.io.Serializable {
public String name="oldName";
public String getResults(){
return "index";
}
..
光束2:
@ManagedBean
@SessionScoped
public class TestBean implements java.io.Serializable {
public ConsultBean obj=new ConsultBean();
public String show(){
obj.setName("newName");
return obj.getResults();
}
..
index.jspx/xhtml
<h:panelGrid columns="2">
<h:outputText value="Result:"/>
<h:outputText value="#{consultBean.name}"/>
</h:panelGrid>
结果是:oldName
!
但何时:
public String getResults(){
this.setName("New Name")
return "index";
}
结果仍然是:oldName
!!
呼叫发起的对象是否重要?
问题是public ConsultBean obj=new ConsultBean();
,您不应该实例化托管bean。框架的工作就是为你做这件事,这就是托管bean的全部意义。
使用ManagedProperty注入ConsultBean
。
尽管如此,我还是建议您使用CDI,而不是旧的jsf-bean api