我有一个页面,其中包含以页面形式排列的搜索结果。当我向前导航到详细视图并向后导航到结果视图时,结果视图将转到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>
</ui:repeat>
</h:form>
答案 0 :(得分:2)
如果您对视图范围数据进行操作,例如通过<h:commandLink>
管理当前页面,只要您通过回发与当前视图进行交互,它就会可用。当您显示详细信息视图时,您不再处理结果视图,因此您的视图信息基本上消失了。因此,当您按下浏览器的后退按钮时,您将恢复到第一页(如果页面未被缓存)或者预先保留的视图(如果页面被缓存),但是您将获得{{1 }}
要克服这个困难,您需要做的是将信息保存在后退按钮所指向的URL中。换句话说,放弃使用帖子链接(ViewExpiredException
)来分页结果并切换到使用获取链接(<h:commandLink>
)。后者将用于发送一个新的获取请求,其中包含相关信息(当前页面,分页大小,寻呼顺序等)以显示结果。这可以通过使用<h:link>
和<f:param>
标记来完成。在这种情况下,按下后退按钮时,您将看到结果,其中包含请求中定义的参数。结果的幂等性是你处境的关键。
因此,您将拥有一堆<f:viewParam>
标记,以便将分页数据保留在结果视图中。您还需要将命令链接更改为使用表示分页数据的嵌套<f:viewParam>
的普通<h:link>
。