1

我有两个不同的页面。在第一页中,我有一个 ViewScoped Bean 中的 Map,而在第二页中,还有另一个 ViewScoped Bean,它需要第一页中的 Map。如何在两个页面之间传递地图?

我曾想过将 Map 转换为 JSON 字符串,并通过<f:viewParams>,但这可能会使 url 太长。

任何想法将不胜感激!

4

1 回答 1

3

鉴于第二页是由 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");        
}
于 2013-09-23T00:03:06.657 回答