使用JSF和prettyFaces重定向

时间:2013-10-31 18:04:12

标签: jsf redirect prettyfaces

我遇到了使用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期间创建的

如何实现这一目标?

非常感谢!

迈克尔

2 个答案:

答案 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";
}