所以我有以下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
答案 0 :(得分:1)
至于你的具体问题,那个(老式的)导航案例是指定一个重定向。重定向基本上指示客户端在给定资源上发送全新的HTTP请求。您为此设置了attribtue的初始请求已被删除。
我不确定您的具体功能要求是什么,因此很难提出正确的解决方案来实现这一目标。一种方法是从导航案例中删除<redirect>
条目。另一种方法是在目标页面中使用带有<f:param>
和<f:viewParam>
的普通链接来设置/转换它(这会立即改善书签性,从而提高SEO和UX)。另一种方法是使用闪存范围。