繁体   English   中英

使用JSF和prettyFaces重定向

[英]Redirect with JSF and 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期间创建的项目内容

如何做到这一点?

非常感谢!

麦可

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM