我正在使用 JSF 2.1 和 Primefaces:
我有一个具有托管属性的 View 范围托管 bean 和一个在其他 View 范围托管 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
?
最佳答案
一旦导航到不同的 JSF View , View 范围就会被销毁并重新创建。您知道,只要您与同一个 JSF View 交互, View 作用域就存在。在这种特殊情况下,您在一个请求期间实际上会得到两个 #{otherMB}
托管 bean 实例。一个实例由源 View 使用,另一个实例由目标 View 使用。
由于第二个 View 是在同一个请求中创建的,因此您可以将其作为请求属性传递。
@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");
}
}
但是我想知道您是否意识到幂等请求与非幂等请求的重要性。也许您实际上需要一个“普通”链接,而不需要调用 View 作用域 bean 操作方法。有关详细示例,请参阅下面最后一个“另请参阅”链接。
另请参阅:
关于jsf - 如何将 bean 属性从一个 View 传递到另一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431195/