我有一个browse.xhtml
,我在其中浏览cars
列表,我想在按下“查看更多”按钮时查看details.xhtml
中的汽车详情。他们的支持bean是@ViewScoped
,分别称为BrowseBean
和DetailsBean
。
现在,我不希望用户/客户在网址中看到汽车ID,因此我希望避免使用GET参数,如here和here所示。
有没有办法实现这个目标?我正在使用Mojarra 2.2.8和PrimeFaces 5以及OmniFaces 1.8.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");