在不使用GET参数的情况下在@ViewScoped bean之间传递对象

时间:2014-09-05 21:46:25

标签: jsf parameter-passing jsf-2.2 omnifaces view-scope

我有一个browse.xhtml,我在其中浏览cars列表,我想在按下“查看更多”按钮时查看details.xhtml中的汽车详情。他们的支持bean是@ViewScoped,分别称为BrowseBeanDetailsBean

现在,我不希望用户/客户在网址中看到汽车ID,因此我希望避免使用GET参数,如herehere所示。

有没有办法实现这个目标?我正在使用Mojarra 2.2.8和PrimeFaces 5以及OmniFaces 1.8.1。

1 个答案:

答案 0 :(得分:39)

取决于您是否发送重定向或仅导航。

如果您要发送重定向,请将其放入闪存范围:

Faces.setFlashAttribute("car", car);

这可以在下一个bean的@PostConstruct中找到:

Car car = Faces.getFlashAttribute("car");

或者,如果您只是导航,请将其放入请求范围:

Faces.setRequestAttribute("car", car);

这可以在下一个bean的@PostConstruct中找到:

Car car = Faces.getRequestAttribute("car");

另见:

请注意,我假设您非常了解具有两个完全独立的视图的设计选择,这两个视图在没有其他视图的情况下不能存在(是幂等的),而不是例如具有条件呈现内容的单个视图。并且您已经知道视图在其实际被请求时是否应该是完全正确的(即通过书签,共享链接,搜索机器人等)。如果没有,那么我强烈建议您仔细阅读这个问题的答案:How to navigate in JSF? How to make URL reflect current page (and not previous one)


更新:如果您未使用OmniFaces,请分别使用以下内容:

FacesContext.getCurrentInstance().getExternalContext().getFlash().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("car");
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("car");