我正在使用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;
}
}
因此,当渲染otherPage时,o
为空。
你知道我怎么能解决这个问题?如何在@ViewScoped
托管bean中保留对象并在不使用@SessionScoped
的情况下将其保存在其他页面上?
答案 0 :(得分:5)
导航到不同的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");
}
}
但是我想知道你是否意识到幂等与非幂等请求的重要性。也许你实际上需要一个“普通的vanilla”链接,而不需要调用视图范围的bean动作方法。请参阅下面的最后一个“另请参见”链接,了解相关的详细示例。