我正在使用JSF 2.1和PrimeFaces:
我有一个视图范围的托管bean,带有托管属性和一种在其他视图范围示波的托管bean上设置的方法,然后转到其他页面引用的托管bean:
@ManagedBean
@ViewScoped
public class HelloMB {
@ManagedProperty("otherMB")
private OtherMB other;
public String changeOtherMB() {
otherMB.setAnyObject(new Object());
return "otherPage.xhtml";
}
}
@ManagedBean
@ViewScoped
public class OtherMB {
private Object o;
public void setAnyObject(Object o) {
this.o = o;
}
}
所以,当其他页面渲染时o
为null。
您有想法如何解决?我如何将对象保留在@ViewScoped
托管的bean中,并在不使用@SessionScoped
的另一页上保持其生存?
一旦导航到其他JSF视图,视图范围就会被破坏并重新创建。您知道,只要您与同一JSF视图互动,视图范围就会生存。在这种特殊情况下,您有效地最终会在一个请求中使用#{otherMB}
托管BEAN的两个实例。源视图和另一个实例使用的一个实例。
由于在同一请求中创建了第二个视图,因此您可以将其作为请求属性传递。
@ManagedBean
@ViewScoped
public class HelloMB implements Serializable {
public String changeOtherMB() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getRequestMap().put("anyObject", anyObject);
return "otherPage.xhtml";
}
}
@ManagedBean
@ViewScoped
public class OtherMB {
private Object anyObject;
@PostConstruct
public void init() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
this.anyObject = ec.getRequestMap().get("anyObject");
}
}
我想知道您是否意识到IDEMPOTENT与非数字请求的重要性。也许您实际上需要"普通的香草"。链接无需调用视图范围的bean Action方法。请参阅最后的"请参见"。下面的链接以此为例。
另请参见:
- 如何选择合适的豆范围?
- 如何在JSF中导航?如何使URL反映当前页面(而不是先前的页面)
- 为实体创建主尾页,如何链接它们以及选择哪个bean范围