微信扫一扫 分享朋友圈

已有 610 人浏览分享

开启左侧

转发和重定向是什么?

[复制链接]
610 0
一、转发(forward)

    一种在服务器内部的资源跳转方式。
1. 实现步骤
    通过request对象获取请求转发器对象:RequestDispatcher,getRequestDispatcher(String path)
    然后使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("/RequestDemo6").forward(request,response);
注意这里是给服务器用,所以不需要获取虚拟目录,即 request.getContextPath();
2. 图解
image.png
客户端浏览器发送请求到RequestDemo5,RequestDemo5转发请求到RequestDemo6,并且共享request域对象“Ray”。

3. 代码示例
        1. 请求转发
         设置一个数据域,并且把它转发到RequestDemo6。

  1. @WebServlet(name = "RequestDemo5", value = "/RequestDemo5")
  2. public class 请求转发 extends HttpServlet {
  3.     @Override
  4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5.         request.setAttribute("name","Ray");
  6.         request.getRequestDispatcher("/RequestDemo6").forward(request,response);         //给服务器用,路径不需要加虚拟目录
  7.         System.out.println("RequestDemo5被访问了。");
  8.     }
  9. }
复制代码
   2. 共享数据          获取RequestDemo5中的数据域,并打印信息。
  1. @WebServlet(name = "RequestDemo6", value = "/RequestDemo6")
  2. public class 共享数据 extends HttpServlet {
  3.     @Override
  4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5.         Object name = request.getAttribute("name");
  6.         System.out.println(name);
  7.         System.out.println("RequestDemo6被访问了。");
  8.     }
  9. }
复制代码
3. 结果
    当我们再浏览器下输入localhost:8080/Web/RequestDemo5并敲击回车后,可以看到:
    RequestDemo5居然输出了RequestDemo6的 “Ray”。
    RequestDemo6和RequestDemo5同时被访问了,而且是RequestDemo6先被访问到,RequestDemo5被后访问到。

image.png
4. 转发的特点
        1. 抓包分析后,发现虽然访问到了2个servlet,但是实际上却是一次请求。

image.png
2. 当我们把要转发到的资源 /RequestDemo6 换成 www.baidu.com 发现并不能实现转发(404 not found),说明了只能转发到当前服务器内部资源中。
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.         request.setAttribute("name","Ray");
  3.         request.getRequestDispatcher("www.baidu.com").forward(request,response);         //给服务器用,路径不需要加虚拟目录
  4.         System.out.println("RequestDemo5被访问了。");
  5. }
复制代码
image.png
   3. 浏览器地址栏路径不发生变化
image.png
  二、重定向(redirect)

     另一种资源跳转的方式。

1. 实现步骤
        1. 设置状态码为302
response.setStatus(302);

        2. 设置响应头
response.setHeader("location","/Web/responseServletDemo2");
        注. 一种简单的重定向方法
response.sendRedirect(contextPath + "/responseServletDemo2");

2. 图解

image.png
3. 代码示例
        1. 编写ResponseDemo1,将请求重定向到ResponseDemo2。
  1. @WebServlet(name = "responseServletDemo1", value = "/responseServletDemo1")
  2. public class 重定向 extends HttpServlet {
  3.     @Override
  4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5.         System.out.println("Demo1!!!");
  6. //        response.setStatus(302);                               //设置状态码为302(重定向)
  7. //        response.setHeader("location","/Web/responseServletDemo2");            // 设置响应头location
  8.         String contextPath = request.getContextPath();                  //动态获取虚拟目录
  9.         //简单重定向方法
  10.         response.sendRedirect(contextPath + "/responseServletDemo2");               //给客户端用,需要加虚拟目录
  11.     }
  12. }
复制代码
注意:这里给客户端使用,需要加虚拟目录。即  request.getContextPath();
        2. 编写ResponseDemo2,直接输出信息。


  1. @WebServlet(name = "responseServletDemo2", value = "/responseServletDemo2")
  2. public class 重定向Demo extends HttpServlet {
  3.     @Override
  4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5.         System.out.println("Demo2!!!!");
  6.     }
  7. }
复制代码
3. 结果
当我们输入localhost:8080/Web/responseServletDemo1 敲击回车发现浏览器地址会瞬间变成
localhost:8080/Web/responseServletDemo2   ,抓包分析发现浏览器一共发送了2次请求。

image.png
回到输出窗口,发现ResponseDemo1和ResponseDemo2的信息都被输出了。
image.png
4. 重定向的特点
    地址栏发生变化
    重定向可以访问其他站点(服务器)的资源
    重定向是两次请求。不能使用request对象来共享数据

三、转发和重定向的区别(总结)
        转发的地址栏不变,而重定向变成转发后的资源。
        转发是一次请求,而重定向是两次请求。所以一般可以说重定向是2次转发。
        转发只能在自己内部服务器资源内相互转发,而重定向可以访问其他站点。


免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

26

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2024-4-19 06:33 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。