sup*_*max 7 jsf dependency-injection jsf-2 managed-bean
我需要在另一个视图范围的bean中使用保存在视图范围bean中的一些数据.
@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
//
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean
@ViewScoped
public class Nota implements Serializable {
@ManagedProperty("#{attivita}")
private Attivita attivita;
// Getter and setter.
}
Run Code Online (Sandbox Code Playgroud)
现在,也许我关于它的理论仍然很差,我注意到当#{attivita}注入时,Attivita构造函数被调用,从而创建另一个实例.这是正确的行为吗?如果我想引用同一个实例而不是创建一个新实例呢?
Bal*_*usC 14
如果您在回发中从一个视图导航到另一个视图,则会发生这种情况.视图范围bean不依赖于请求,而是绑定到视图.因此,当您导航到新视图时,它将获得视图范围bean的全新实例.它不会重用与先前视图关联的相同bean实例.
我知道attivitabean是在初始视图上创建的,并在回发时重用.我知道notabean与您导航到的新视图相关联.在注入attivita时,即使在同一个请求中有另一个实例,它也只会获得一个新的独特实例.这是所有预期的(并且无可否认地有点不直观)行为.
没有标准的JSF解决方案.CDI解决了这个问题@ConversationScoped(只要你明确告诉它存在,bean就会存在)和CDI扩展MyFaces CODI会更进一步@ViewAccessScoped(只要导航视图引用它,bean就会存在).
但是,您可以通过将bean存储为请求范围中的属性来解决此问题.
@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
public String submit() {
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().put("attivita", this);
return "nota";
}
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean
@ViewScoped
public class Nota implements Serializable {
private Attivita attivita;
@PostConstruct
public void init() {
attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().get("attivita");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是相当hacky.根据具体的功能要求,可能有更好的解决方案.还要注意的是,你应该在nota视图中引用所需的Attivitabean实例作为#{nota.attivita}和不作为#{attivita},因为它会给你一个新的和不同的实例,对于之前已经解释的原因.
| 归档时间: |
|
| 查看次数: |
9914 次 |
| 最近记录: |