非Ajax方法在ViewScoped托管bean中给出相同的结果

时间:2014-02-07 09:26:44

标签: jsf jsf-2 primefaces view-scope

我有一个像下面这样的数据表

<p:dataTable value="#{userTable.tempLists}" var="user"
    sortBy="#{user.userId}" sortOrder="descending"      
    paginator="true"
    rows="10" paginatorPosition="bottom">           
    <p:column headerText="User ID" sortBy="#{user.userId}">
        <p:commandLink ajax="false" value="#{user.userId}" action="#{userTable.showDetails(user.userId)}"/>
    </p:column>
    <p:column headerText="User Name" sortBy="#{user.userName}">
        <h:outputText value="#{user.userName}">
        </h:outputText>
    </p:column>
</p:dataTable>

我有一个面板名称,如下面的详细信息

<p:panel>
      <h:outputText value="#{userTable.userId}"/>
      <h:outputText value="#{userTable.userName}"/>
</p:panel>

我的UserTable托管bean是视图范围的。功能就像当用户点击commandLink时,我的方法将获得用户的详细信息。获取详细信息后,dataTable将隐藏,并将显示面板。对于用户来说,它几乎看起来像是一个不同的页面。

问题在于,当用户点击任何userId(commandLink)时,他将完美地获得细节。然后他可以使用浏览器后退按钮并尝试通过单击另一个userId来获取详细信息。但在这种情况下,用户获得的结果与之前的结果相同。错误日志中没有任何内容。

我发现在视图范围内托管bean的某个地方,非ajax操作方法存在此问题。但是我需要将它保存在视图中,以便通过排序和分页来维护表状态。因此,每当用户按下后退按钮时,我都可以在选择之前显示相同的屏幕。

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:0)

键盘上的后退按钮确实不会调用新的HTTP请求。猜测这是出了什么问题。使用列表和详细信息页面实际上更糟糕。我一直在努力解决同样的错误几个小时。

请参阅:Difference between jsf actionListener(param) and propertyListener when using back button on keyboard