Jsf 在web浏览器中显示页面之前调用方法
我有一个web应用程序,有两个页面A和B。从页面A我通过Jsf 在web浏览器中显示页面之前调用方法,jsf,jsf-2,browser,navigation,lifecycle,Jsf,Jsf 2,Browser,Navigation,Lifecycle,我有一个web应用程序,有两个页面A和B。从页面A我通过h:commandButton导航到B侧,并从支持bean生成方法,返回B.xhtml 当我在B页面时,我想通过我的web浏览器中的“后退”按钮返回到某个页面。在回到页面之前,我想从backingbean调用方法 我试着用手来做这件事 <f:metadata> <f:event type="preRenderView" listener="#{userManager.myMethod}" /> </
h:commandButton
导航到B侧,并从支持bean生成方法,返回B.xhtml
当我在B页面时,我想通过我的web浏览器中的“后退”按钮返回到某个页面。在回到页面之前,我想从backingbean调用方法
我试着用手来做这件事
<f:metadata>
<f:event type="preRenderView" listener="#{userManager.myMethod}" />
</f:metadata>
但这不是工作。你知道其他的想法吗?当“后退”按钮实际上没有点击服务器时,它不会“工作”,而是显示以前从浏览器缓存中获取的页面。这将在不向服务器发出任何HTTP请求的情况下发生,因此不会调用与生成页面的HTML输出相关联的任何服务器端代码
您可以通过指示浏览器不缓存这些页面来解决此问题,以便始终直接从服务器请求这些页面,从而执行与生成页面HTML输出相关的所有服务器端代码,例如preRenderView
事件侦听器
作为一个启动示例,假设您的FacesServlet
位于web.xml
中,并且注册在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.
}
另见: