2

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

如何做到这一点?

非常感谢!

迈克尔

4

2 回答 2

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 实现中的错误引起的。

于 2013-11-04T06:48:18.313 回答
0

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

public String create(final Post post) {
        postService.save(post);
        return "pretty:posts";
}
于 2014-05-15T14:11:52.780 回答