1

所以我有以下jsf页面(工作):

<ui:define name="content">
  <h:form>
    <p:dataTable id="projectList" value="#{studyController.studyList}" var="item">
      <p:column headerText="ID" >
        <h:outputText value="#{item.id}"/>
      </p:column>
      <p:column headerText="Name">
        <h:outputText value="#{item.name}"/>
      </p:column>
      <p:column headerText="Action">
        <h:commandLink action="#{projectController.openProject(item.id)}" value="Project">
        </h:commandLink>
      </p:column>
    </p:dataTable>
  </h:form>
</ui:define>

这是 bean,在链接点击时调用:

@Named
public class ProjectController{

  private Integer projectId;

  public String openProject(Integer projectId){
    // this works, System.out.println shows correct setting
    this.projectId = projectId;

    // now redirect to correct jsf page via faces-config.xml
    return "show_project";
  }

  // this is called by the jsf page to be shown
  public Integer getProjectId(){
    // this is null :(
    return this.projectId;
  }  

}

我的 faces-config.xml 类似于:

<navigation-rule>
  <from-view-id>*</from-view-id>
  <navigation-case>
    <from-outcome>show_project</from-outcome>
    <to-view-id>/project.xhtml</to-view-id>
    <redirect/>
  </navigation-case>
</navigation-rule>

一切正常,除了 ProjectController 的 projectId 在调用 openProject 之间丢失 - 调用和调试在控制台中显示正确的 id - 和页面的呈现,页面在其中进行一些链接 #{projectController.getProjectId} -因为这返回null。

在呈现页面之前,如何保留 bean 中的值?我尝试了一些@SessionScope、@RequestScope 和其他东西,但坦率地说,我不了解 JFS 生命周期的完整扩展。

只是为了提供更多信息,我将 JBoss AS 7.2 与 PrimeFaces 3.4.2 一起使用

4

1 回答 1

1

至于您的具体问题,(老式)导航案例正在指定重定向。重定向基本上指示客户端在给定资源上发送全新的 HTTP 请求。您设置属性的初始请求因此被丢弃。

我不确定您的具体功能要求是什么,因此很难提出正确的解决方案来实现这一目标。一种方法是<redirect>从导航案例中删除条目。另一种方法是在目标页面中使用带有 a<f:param>和 the的普通链接<f:viewParam>来设置/转换它(这也立即提高了可收藏性,从而提高了 SEO 和 UX)。另一种方法是使用闪存范围。

也可以看看:

于 2013-06-17T11:47:05.237 回答