我正在开发一个JSF
应用程序,我想保留有关导航前后的历史记录一致性。特别是我可以给出这个例子:
有页面overview.xhtml
及其支持Bean OverviewBean
。它显示了datatable
中的项目列表。我在datatable
的每一行都有一个链接,该链接指向每个展示项目的item_details.xhtml
视图:
<h:column>
<f:facet name="header">Edit</f:facet>
<h:link value="Edit" outcome="/item_details">
<f:param name="itemId" value="#{item.id}" />
</h:link>
</h:column>
用户可以通过点击导致item_details.xhtml
页面的overview.xhtml
的提交按钮来编辑项目数据并保存更改。这适用于h:commandButton
和相应的操作方法:
<h:commandButton value="Submit" action="#{itemDetailsBean.update()}" />
public String update() {
itemEjb.updateItem(updatedItem);
return "overview.xhtml?faces-redirect=true";
}
用户在overview.xhtml
页面上再次按预期进行操作。但是,在这种情况下,浏览器后退按钮会返回item_details.xhtml
页面,如果再次再次按下overview.xhtml
。换句话说,如果一个人遵循导航路线
overview -> item_details_3 -> overview -> item_details_5 -> overview -> item_details_2 -> overview
有(不希望的)可能以相反的方向返回这条路线。
我的意图是overview.xhtml
页面作为root page
和该页面上的后退按钮,引导用户退出应用程序或提示注销。换句话说,我希望导航作为堆栈工作:
forward: push(page)
back: pop(page)
我如何在JSF
中实现这一目标?
我知道有类似的帖子,但没有任何对我有用。
我还尝试了NoCacheFilter
:
@WebFilter("/faces/*")
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
}
chain.doFilter(req, res);
}
}
虽然调用方法doFilter
,但它对导航没有影响。