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

 
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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值