JSF: JSF page and common servlet/jsp communication summary (redirect and forward)

来源:互联网 发布:大数据下的电子商务 编辑:程序博客网 时间:2024/05/02 02:19

 
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.