JSF page and common servlet communication:
Note: The key is to understand the difference of servlet and JSF lifecycles.
0. common form "action" attribute can be used to post to a JSF page.
1. common servlet can redirect to JSF page. (response.sendRedirect)
2. common servlet can not forward to JSF page.
(request.getRequestDispatcher(page).forward(request, response) does not work when forward to a JSF page)
3. JSF page can redirect to common servlet/jsp.
4. JSF page can use method 1 and method 3 below to forward to common servelt/jsp, method 2 can only be used to forward to JSF page.
5. Three ways to implement forward in a jsf enviroment (usually in a listenter or action, can not be in doPost/doGet method):
Methoed1:
FacesContext context = FacesContext.getCurrentInstance();
javax.faces.application.NavigationHandler nav = context.getApplication().getNavigationHandler();
nav.handleNavigation(context,null,"login");
Method2:
FacesContext.getCurrentInstance().getViewRoot().setViewId("/browse.jsp");
Method3:
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot view = context.getApplication().getViewHandler().createView(context, "/browse.jsp");
context.setViewRoot(view);
6. Two ways to implement redirect in a jsf environment (usually in a listenter or action, can not be in doPost/doGet method)
Method 1:
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.sendRedirect("browse.jsf");
context.responseComplete(); //这一句很重要, if no this code, the server will throw exception like below
javax.servlet.ServletException: Cannot forward after response has been committed javax.faces.webapp.FacesServlet.service(FacesServlet.java:277) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Method 2:
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location",link);
Note: JSF forword methods can only be used after "Restore View" phase(including afterPhase() of the "Restore View") and before "Render Response" phase in the lifecycle.
JSF: JSF page and common servlet/jsp communication summary (redirect and forward)
最新推荐文章于 2022-09-15 21:29:46 发布