0

我有一个页面,其中包含按页面排列的搜索结果。当我向前导航到详细视图并向后导航到结果视图时,结果视图将转到第 1 页。我怎样才能解决这个问题?我正在使用两个 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>
4

1 回答 1

2

如果您对视图范围的数据进行操作,例如通过<h:commandLink>它管理当前页面,只要您通过回发与当前视图交互,就可以使用它。当您显示详细信息视图时,您不再处理结果视图,因此您的视图信息基本上消失了。因此,当您按下浏览器的后退按钮时,您将返回到第一页(如果页面未缓存)或返回到之前离开的视图(如果页面被缓存),但您会得到一个ViewExpiredException.

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

因此,您将有一堆<f:viewParam>标签来将分页数据保留在结果视图中。您还需要将命令链接更改为带有嵌套 s 的普通<h:link>s,这些嵌套<f:param>s 也代表分页数据。

于 2013-09-23T20:13:14.767 回答