JSF Bean LifeCycle - 如何存储请求属性

时间:2013-06-17 11:28:53

标签: jsf

所以我有以下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的调用之间丢失 - 调用open和调试在控制台中显示正确的id - 以及页面的呈现,其中页面执行某些操作#{projectController。 getProjectId} - 因为这会返回null。

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

为了提供更多信息,我正在使用JBoss AS 7.2和PrimeFaces 3.4.2

1 个答案:

答案 0 :(得分:1)

至于你的具体问题,那个(老式的)导航案例是指定一个重定向。重定向基本上指示客户端在给定资源上发送全新的HTTP请求。您为此设置了attribtue的初始请求已被删除。

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

另见: