【问题标题】:Redirect with JSF and prettyFaces使用 JSF 和 prettyFaces 重定向
【发布时间】:2013-11-11 21:06:32
【问题描述】:

我在使用 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 期间创建的项目内容

如何做到这一点?

非常感谢!

迈克尔

【问题讨论】:

    标签: jsf redirect prettyfaces


    【解决方案1】:

    我认为问题是由两个映射之间的紧密耦合引起的。基本上,您在第一个映射中使用页面操作来初始化 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 实现中的错误引起的。

    【讨论】:

      【解决方案2】:

      使用以下语法修复了重定向:

      public String create(final Post post) {
              postService.save(post);
              return "pretty:posts";
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-30
        • 2014-05-21
        • 1970-01-01
        • 2012-04-23
        • 2011-12-20
        • 2013-12-27
        • 2012-06-13
        • 2014-06-26
        • 2012-03-17
        相关资源
        最近更新 更多