gpt4 book ai didi

jsf - 如何将 bean 属性从一个 View 传递到另一个 View

转载 作者:行者123 更新时间:2023-12-02 04:38:24 26 4
gpt4 key购买 nike

我正在使用 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 为 null。

你知道我该如何解决这个问题吗?如何在不使用 @SessionScoped 的情况下将对象保留在 @ViewScoped 托管 bean 中并使其在其他页面上保持事件状态?

最佳答案

一旦您导航到不同的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com