我有一个web应用程序,有两个页面A和B。从页面A,我通过h:commandButton
导航到B侧,并从backingbean中生成方法,返回B.xhtml
。
当我在B页面时,我想通过网络浏览器中的"返回"按钮返回到A页面。在回到A页面之前,我想从backingbean调用方法。
我试着通过来做到这一点
<f:metadata>
<f:event type="preRenderView" listener="#{userManager.myMethod}" />
</f:metadata>
但没用。你还知道其他想法吗?
当后退按钮实际上没有击中服务器,而是显示之前从浏览器缓存中获得的页面时,它不会"工作"。这将在没有任何HTTP请求的情况下发生,因此不会调用与生成页面HTML输出相关的任何服务器端代码。
您可以通过指示浏览器不要缓存这些页面来解决此问题,这样它们将始终直接从服务器请求,从而执行与生成页面HTML输出相关的所有服务器端代码,例如preRenderView
事件侦听器。
作为一个启动示例,假设您的FacesServlet
在web.xml
中注册在facesServlet
:的<servlet-name>
上,则此筛选器应该执行此操作
@WebFilter(servletNames = "facesServlet")
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"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(req, res);
}
// init() and destroy() can be kept NOOP.
}
另请参阅:
- 避免JSF web应用程序上的后退按钮