我有两个不同的页面。在第一页中,我有一个 ViewScoped Bean 中的 Map,而在第二页中,还有另一个 ViewScoped Bean,它需要第一页中的 Map。如何在两个页面之间传递地图?
我曾想过将 Map 转换为 JSON 字符串,并通过<f:viewParams>
,但这可能会使 url 太长。
任何想法将不胜感激!
我有两个不同的页面。在第一页中,我有一个 ViewScoped Bean 中的 Map,而在第二页中,还有另一个 ViewScoped Bean,它需要第一页中的 Map。如何在两个页面之间传递地图?
我曾想过将 Map 转换为 JSON 字符串,并通过<f:viewParams>
,但这可能会使 url 太长。
任何想法将不胜感激!
鉴于第二页是由 PRG 请求打开的,最好的办法是使用 flash 范围。您可以将 flash 范围的属性放在可用的映射中, ExternalContext#getFlash()
并且您可以在下一个请求中通过同一个ExternalContext#getFlash()
映射(在 EL 范围内也可用#{flash}
)来获取它们。
因此,例如,这应该这样做:在第一页的支持 bean 的操作方法中:
public String submit() {
// ...
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getFlash().put("data", data);
return "page2?faces-redirect=true";
}
然后是第二页(page2)的backing bean的一个属性:
@ManagedProperty("#{flash.data}")
private Map<String, String> data; // Setter required.
或者,或者,第二页的支持 bean 的后构造:
private Map<String, String> data;
@PostConstruct
public void init() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
data = (Map<String, String>) ec.getFlash().get("data");
}