aby*_*lie 2 jsf parameter-passing managed-bean view-scope
我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当渲染otherPage时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";
}
}
Run Code Online (Sandbox Code Playgroud)
@ManagedBean
@ViewScoped
public class OtherMB {
private Object anyObject;
@PostConstruct
public void init() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
this.anyObject = ec.getRequestMap().get("anyObject");
}
}
Run Code Online (Sandbox Code Playgroud)
但是我想知道你是否意识到幂等与非幂等请求的重要性.也许您实际上需要一个"普通的vanilla"链接,而无需调用视图范围的bean操作方法.请参阅下面的最后一个"另请参见"链接以获取有关该示例的详细示例.