【问题标题】:JSF Pass a map in ViewScoped Bean between two pagesJSF 在两个页面之间传递 ViewScoped Bean 中的映射
【发布时间】:2013-09-27 17:11:30
【问题描述】:

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

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

任何想法都将不胜感激!

【问题讨论】:

  • 这两个页​​面如何交互?通过简单的向前导航?还是通过重定向导航?
  • 他们的网址不同。所以我认为它正在重定向......这会有什么不同吗?
  • 那么第二页不是第一页表单提交的结果吗?
  • 是的。第一页表单提交的结果会存储在地图中,第二页需要地图。
  • 通过整个地图?我在想这种事情是否有任何好的散列函数?

标签: jsf primefaces


【解决方案1】:

鉴于第二页是由 PRG 请求打开的,最好的办法是使用 flash 作用域。您可以将 flash 范围的属性放入映射中,由 ExternalContext#getFlash() 提供,并且您可以通过相同的 ExternalContext#getFlash() 映射在下一个请求中获取它们(在 EL 范围内,#{flash} 也可以使用)。

所以,例如应该这样做:在第一页的backing bean的action方法中:

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");        
}

【讨论】:

  • 我注意到这种方法的一个缺点是它会影响页面的可收藏性,因为您将始终依赖上一个页面来传递参数。
  • 然后做你最初想要但不想要的(作为请求参数传递)。
  • 是的。确实如此。谢谢!
最近更新 更多