在@ViewScoped bean之间传递一个对象而不使用GET参数

我有一个browse.xhtml在哪里我浏览cars列表,我想查看details.xhtml当按下“查看更多”button的车的details.xhtml 。 他们的支持bean是@ViewScoped ,分别叫做BrowseBeanBrowseBean

现在,我不希望用户/客户端在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");