Servlet学习四:redirect和forward

一. 概念

  1. redirect(从定向):客户端发送一个redirect请求的时候,服务端回复给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL(参数丢失)重新向URL对应服务器发送一个请求。
  2. forward(转发):客户端发送一个forward请求的时候,服务器内部完成转发(参数仍在这个request里面),把转发之后的结果回复给客户端。
  3. 区别:
  4. 请求转发,即(一次请求,保存请求对象)request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端;
  5. 请求重定向

    请求重定向,即response.sendRedirect(),是一种客户端行为,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变

 

二. Redirect

  1. HttpServletResponse.sendRedirect(String location)源码

    Java代码  收藏代码

    1. public void sendRedirect(String location) throws IOException {  
    2.   
    3.         if (isCommitted())  
    4.             throw new IllegalStateException  
    5.                 (sm.getString("coyoteResponse.sendRedirect.ise"));  
    6.   
    7.         // Ignore any call from an included servlet  
    8.         if (included)  
    9.             return;   
    10.   
    11.         // Clear any data content that has been buffered  
    12.         resetBuffer();  
    13.   
    14.         // Generate a temporary redirect to the specified location  
    15.         try {  
    16.              //1.将ocation转换成绝对路径  
    17.             String absolute = toAbsolute(location);  
    18.             //2.设置新的效应头部302  
    19.             setStatus(SC_FOUND);  
    20.             //3.设置Location  
    21.             setHeader("Location", absolute);  
    22.         } catch (IllegalArgumentException e) {  
    23.             setStatus(SC_NOT_FOUND);  
    24.         }  
    25.   
    26.         // Cause the response to be finished (from the application perspective)  
    27.         setSuspended(true);  
    28. }  
  2. 看源码就知道sendRedirect的使用了
    1. 带http协议的,从定向到指定服务器。

      Java代码  收藏代码

      1. 在http://localhost:8080/CoreServer/page/report/report.jsp页面  
      2. httpServletResponse.sendRedirect("http://www.baidu.com");  
      3. =====>  
      4. http://www.baidu.com。   
    2. 其它类型都跳转到内部服务器。

      Java代码  收藏代码

      1. 在http://localhost:8080/CoreServer/page/report/report.jsp页面httpServletResponse.sendRedirect("www.baidu.com");  
      2. =====>  
      3. http://localhost:8080/CoreServer/page/report/www.baidu.com。  
      4.   
      5. httpServletResponse.sendRedirect("reportList.jsp);  
      6. =====>  
      7. http://localhost:8080/CoreServer/page/report/reportList.jsp。   

 

 

三. forward

  1. 基于请求路径和转发路径,内部完成跳转。

    Java代码  收藏代码

    1. 在http://localhost:8080/CoreServer/page/report/report.jsp(请求路径)页面HttpServletRequest.getRequestDispatcher("t1.jsp").forward(request, response);(转发路径)  
    2.   
    3. 返回http://localhost:8080/CoreServer/page/report/t1.jsp的内容。  

 

四. struts规范

  1. struts.xml文件里,<result>标签的type默认属性值是"dispatcher"(实际上就是转发,forward)。开发人员可以根据自己的需要指定不同的类型,如redirect、stream等。
  2. servlet 2.4规范,默认forward不经过filter。如果你要让forward的页面也经过filter,web.xml配置如下。

    Java代码  收藏代码

    1. <filter>  
    2.     <filter-name>jspFilter</filter-name>  
    3.     <filter-class>com.cb.cbms.coreserver.servlet.JspFilter</filter-class>     
    4. </filter>  
    5. <filter-mapping>  
    6.     <filter-name>jspFilter</filter-name>  
    7.     <url-pattern>/*</url-pattern>  
    8.     <dispatcher>REQUEST</dispatcher>  //forward要经过哪些filter,在对应filter下面加上这两行  
    9.     <dispatcher>FORWARD</dispatcher>    
    10. </filter-mapping>  
  3. 如果在项目里出现了,

    Java代码  收藏代码

    1. 此页面不能正确地重定向  
    2. **浏览器检测到该服务器正在将此地址的请求循环重定向。  
     请参考上述两点就行核查。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值