我有两个页面A和B的Web应用程序。从第A页开始,我通过h:commandButton
导航到B侧,并从支持bean创建方法,返回B.xhtml
。
当我在B页面时,我想通过网络浏览器中的“返回”按钮返回A页面。在回到A页面之前,我想从支持bean调用方法。
我尝试通过
来做到这一点<f:metadata>
<f:event type="preRenderView" listener="#{userManager.myMethod}" />
</f:metadata>
但这不起作用。你知道其他任何想法吗?
答案 0 :(得分:1)
当后退按钮实际上没有点击服务器时,它将无法“工作”,而是显示以前从浏览器缓存中获取的页面。这将在没有任何HTTP请求的情况下发生,因此不会调用与生成页面的HTML输出相关联的任何服务器端代码。
您可以通过指示浏览器不缓存这些页面来解决此问题,以便始终直接从服务器请求它们,从而执行与生成页面的HTML输出相关联的所有服务器端代码,例如{{1事件监听器。
作为启动示例,此过滤器应该执行此操作,假设preRenderView
位于FacesServlet
web.xml
<servlet-name>
上的facesServlet
:
@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.
}