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

17

我有一个 browse.xhtml 页面,其中我浏览了一份 汽车 列表,并希望在按下“查看更多”按钮时在 details.xhtml 中查看汽车的详细信息。它们的后备bean分别是 @ViewScoped 类型的 BrowseBeanDetailsBean

现在,我不希望用户/客户在URL中看到汽车ID,因此我想避免使用GET参数,就像这里这里所介绍的那样。

有没有什么方法可以实现这一点? 我正在使用Mojarra 2.2.8,PrimeFaces 5和OmniFaces 1.8.1。

1个回答

45

取决于您是发送重定向还是仅导航.

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

Faces.setFlashAttribute("car", car);

这可以在下一个bean的@PostConstruct中使用:

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

或者,如果你只是在浏览页面,那么将它放在请求范围内:

Faces.setRequestAttribute("car", car);

这将在下一个Bean的@PostConstruct中可用:

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

参见:

请注意,我假设您非常清楚设计选择,即具有两个完全独立的视图,没有另一个视图不能存在(不具有幂等性),而不是具有条件渲染内容的单个视图。并且您已经知道当实际请求幂等地(即通过书签、共享链接、搜索机器人等)时,视图应该如何表现。如果不知道,请务必仔细阅读此问题上的答案:如何在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");

谢谢您的回复,但是我在 Faces.setFlashAttribute("car", car); 上遇到了 ClassNotFoundException这里 是跟踪信息。 omnifaces 库的范围设置为 compile,这样正确吗?(尝试将其设置为运行时,但我再次遇到了相同的异常) - Chris
OmniFaces 在运行时类路径中缺失。显然 Maven 构建失败了。OmniFaces 必须(完全像 PrimeFaces 一样)最终出现在构建的 /WEB-INF/lib 文件夹中。默认作用域(编译)应该可以正常工作。 - BalusC
我已经尝试了 mvn compile 命令,并且它已经成功完成。这是我现在拥有的范围。我甚至在 pom.xml 中明确声明了它,但我仍然遇到了异常。我应该像使用 Primefaces 一样下载 jar 包并将其添加到 WEB-INF/lib 文件夹中,还是发布一个新问题来解决这个问题? - Chris
问题在于我没有成功安装Primefaces,如此处所述,因此我将primefaces-5.0.jar下载到了WEB-INF/lib文件夹中。我可能已经搞砸了我的配置,这是我第一次使用所有这些工具并使用Java EE。 - Chris
我不使用IDEA,但基于我的Eclipse经验,症状表明IDE在项目自动构建期间没有意识到使用Maven,并顽固地使用其自己的WAR构建过程。这与PrimeFaces或OmniFaces没有特定关系。您在pom中声明任何其他第三方库时都会遇到完全相同的问题。 - BalusC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接