我遇到了使用JSF和漂亮面孔重定向的问题。我对这些东西很新,需要一些帮助,因为我无法重定向工作,就像我想要的那样。
基本上我在我漂亮的配置中有这个:
<url-mapping id="newProject">
<pattern value="/newProject/" />
<view-id value="/faces/project/newProject.xhtml" />
<action>#{projectController.initNewProject}</action>
</url-mapping>
<url-mapping id="project">
<pattern value="/project/" />
<view-id value="/faces/project/projectIdx.xhtml" />
</url-mapping>
initNewProject函数如下所示:
public String initNewProject() throws IOException {
project = this.createProject(123415, "1234578943148", "KB25");
System.out.println(project);
return "pretty:project";
}
其中project是ProjectController中的一个字段:
@Named
@ConversationScoped
public class ProjectController implements Serializable {
private transient Project project;
...
重定向按照我的意愿工作,因为URL从../newProject/变为../project/,并显示/faces/project/newProject.xhtml的内容。但有些人在重定向期间会调用ProjektController的构造函数并使字段项目为空。
如果我改变
return "pretty:project";
到
return "/project/projectIdx.xhtml";
一切正常。项目内容显示在网页上。但是URL不会更改。它保持../newProject/,如果用户按下F5,他就会创建一个不好的新项目。
由于其他一些原因,我无法将项目存储在会话中,所以这对我来说是没有选择的。
我不希望重定向重新创建控制器,因为我希望newProject.xhtml显示项目的内容,这是在initNewProject期间创建的
如何实现这一目标?
非常感谢!
迈克尔
答案 0 :(得分:0)
我认为问题是由两个映射之间的紧密耦合引起的。基本上,您在第一个映射中使用页面操作来初始化bean属性,然后想要在第二个映射呈现的页面中访问此属性。这不是使用PrettyFaces创建的RESTful URL的工作方式。
相反,您的第二个映射应该完全独立于另一个。这确保了RESTful URL即使被加入书签,复制到另一个浏览器窗口或其他任何内容中也能正常工作。
使用PrettyFaces构建这样一个RESTful URL的常用方法是使用这样的路径参数:
<url-mapping id="project">
<pattern value="/project/#{projectController.projectId}/" />
<view-id value="/faces/project/projectIdx.xhtml" />
<action>#{projectController.loadProject}</action>
</url-mapping>
这样项目的ID就会被注入你的控制器,你可以在页面操作方法中从数据库中加载相应的实体:
public void loadProject() {
this.project = projectDao.getById( projectId );
}
如何处理示例的“新项目”用例取决于您对持久性和整个过程的要求。
理论上,您提供的代码也应该有效。我的猜测是,保持转换范围有效所需的cid
查询参数由于某种原因而丢失。关于这个问题,PrettyFaces论坛上有一些主题。但是AFAIK通常是由较旧的CDI实现中的错误引起的。
答案 1 :(得分:0)
使用以下语法修复了重定向:
public String create(final Post post) {
postService.save(post);
return "pretty:posts";
}