回到页面我失去了状态

时间:2013-09-23 19:21:15

标签: jsf jsf-2.2

我有一个页面,其中包含以页面形式排列的搜索结果。当我向前导航到详细视图并向后导航到结果视图时,结果视图将转到page1。我怎样才能解决这个问题?我正在使用两个ViewScoped bean。我尝试过SessionScoped,但它会做同样的事情。做这个的最好方式是什么?

结果页

<f:metadata>
        <f:viewParam name="lang" value="#{search.language}" />
        <f:viewAction action="#{result.init()}" />
</f:metadata>
<h:form>
            <ui:repeat value="#{result.recipesView}" var="rec">
                <h:link value="#{rec.title}" outcome="recipeshow">
                    <f:param name="id" value="#{rec.id}" />
                </h:link>
                <br/>
                <h:outputText value="#{rec.id}"/><br/>
                <h:outputText value="#{rec.author}"/><br/>
                <h:outputText value="#{rec.createDate}"/><br/>
                <br/>
            </ui:repeat>
            <br/>
            <ui:repeat value="#{result.pagesArray}" var="page">
                <h:commandLink value="#{page.pageNumber}" disabled="#{page.pageDisabled}">
                    <f:ajax listener="#{result.doPages()}" render="@form"/>
                    <f:param name="currentPage" value="#{page.pageNumber}"/>
                </h:commandLink>                  &nbsp;
            </ui:repeat>
</h:form>

1 个答案:

答案 0 :(得分:2)

如果您对视图范围数据进行操作,例如通过<h:commandLink>管理当前页面,只要您通过回发与当前视图进行交互,它就会可用。当您显示详细信息视图时,您不再处理结果视图,因此您的视图信息基本上消失了。因此,当您按下浏览器的后退按钮时,您将恢复到第一页(如果页面未被缓存)或者预先保留的视图(如果页面被缓存),但是您将获得{{1 }}

要克服这个困难,您需要做的是将信息保存在后退按钮所指向的URL中。换句话说,放弃使用帖子链接(ViewExpiredException)来分页结果并切换到使用获取链接(<h:commandLink>)。后者将用于发送一个新的获取请求,其中包含相关信息(当前页面,分页大小,寻呼顺序等)以显示结果。这可以通过使用<h:link><f:param>标记来完成。在这种情况下,按下后退按钮时,您将看到结果,其中包含请求中定义的参数。结果的幂等性是你处境的关键。

因此,您将拥有一堆<f:viewParam>标记,以便将分页数据保留在结果视图中。您还需要将命令链接更改为使用表示分页数据的嵌套<f:viewParam>的普通<h:link>