在@ViewScoped bean之间传递一个对象而不使用GET参数
我有一个browse.xhtml
在哪里我浏览cars
列表,我想查看details.xhtml
当按下“查看更多”button的车的details.xhtml
。 他们的支持bean是@ViewScoped
,分别叫做BrowseBean
和BrowseBean
。
现在,我不希望用户/客户端在URL中看到汽车ID,所以我想避免使用GET PARAMS,如这里和这里所介绍的。
有没有办法做到这一点? 我正在用PrimeFaces 5和OmniFaces 1.8.1来使用Mojarra 2.2.8。
取决于您是发送redirect还是仅导航。
如果你发送redirect,然后把它放在闪光范围:
Faces.setFlashAttribute("car", car);
这可以在下一个bean的@PostConstruct
中使用:
Car car = Faces.getFlashAttribute("car");
或者,如果你只是浏览,然后把它放在请求范围内:
Faces.setRequestAttribute("car", car);
这可以在下一个bean的@PostConstruct
中使用:
Car car = Faces.getRequestAttribute("car");
也可以看看:
- 在另一个视图范围的bean中注入一个视图范围的bean导致它被重新创build
- 如何在JSF中将对象从一个页面传递到另一个页面而无需编写转换器
请注意,我认为你非常了解有两个完全独立的视图的deviseselect,不能存在(是幂等的)没有其他视图,而不是具有有条件呈现内容的单个视图。 而且,您已经知道视图在实际上被请求时(如通过书签,共享链接,search机器人等)是如何performance的。 如果没有,那么我强烈build议仔细阅读这个问题的答案: 如何在JSF中导航? 如何使URL反映当前页面(而不是以前的页面) 。
更新:如果您不使用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");