JSF在两个页面之间的ViewScoped Bean中传递一个映射

时间:2013-09-22 20:38:20

标签: jsf primefaces

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

我曾想过将Map转换为JSON字符串并传递<f:viewParams>,但这可能会使该网址过长。

任何想法都将受到赞赏!

1 个答案:

答案 0 :(得分:3)

鉴于第二页是由PRG请求打开的,最好的办法是使用闪存范围。您可以在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";
}

然后是第二页(第2页)的支持bean的属性:

@ManagedProperty("#{flash.data}")
private Map<String, String> data;   // Setter required.

或者,或者,第二页的支持bean的postconstruct:

private Map<String, String> data;

@PostConstruct
public void init() {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    data = (Map<String, String>) ec.getFlash().get("data");        
}