什么是转发和重定向转发_转发和重定向的相同点

什么是转发和重定向转发_转发和重定向的相同点通过代码和图解详细解释转发和重定向的区别。最后得出结论!

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

一、转发(forward)

1. 实现步骤

 2. 图解

3. 代码示例

        1. 请求转发

        2. 共享数据 

        3. 结果

4. 转发的特点

​ 二、重定向(redirect)

1. 实现步骤

        1. 设置状态码为302

        2. 设置响应头

        注. 一种简单的重定向方法 

2. 图解

3. 代码示例

        1. 编写ResponseDemo1,将请求重定向到ResponseDemo2。

        2. 编写ResponseDemo2,直接输出信息。

        3. 结果

4. 重定向的特点

三、转发和重定向的区别(总结)


一、转发(forward)

一种在服务器内部的资源跳转方式。

1. 实现步骤

  1. 通过request对象获取请求转发器对象:RequestDispatcher,getRequestDispatcher(String path)
  2. 然后使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("/RequestDemo6").forward(request,response);

注意这里是给服务器用,所以不需要获取虚拟目录,即 request.getContextPath();

 2. 图解

什么是转发和重定向转发_转发和重定向的相同点

 客户端浏览器发送请求到RequestDemo5,RequestDemo5转发请求到RequestDemo6,并且共享request域对象“Ray”。

3. 代码示例

        1. 请求转发

         设置一个数据域,并且把它转发到RequestDemo6。

@WebServlet(name = "RequestDemo5", value = "/RequestDemo5")
public class 请求转发 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name","Ray");
        request.getRequestDispatcher("/RequestDemo6").forward(request,response);         //给服务器用,路径不需要加虚拟目录
        System.out.println("RequestDemo5被访问了。");
    }
}

        2. 共享数据 

        获取RequestDemo5中的数据域,并打印信息。

@WebServlet(name = "RequestDemo6", value = "/RequestDemo6")
public class 共享数据 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object name = request.getAttribute("name");
        System.out.println(name);
        System.out.println("RequestDemo6被访问了。");
    }
}

        3. 结果

    当我们再浏览器下输入localhost:8080/Web/RequestDemo5并敲击回车后,可以看到:

  1. RequestDemo5居然输出了RequestDemo6的 “Ray”。
  2. RequestDemo6和RequestDemo5同时被访问了,而且是RequestDemo6先被访问到,RequestDemo5被后访问到。

什么是转发和重定向转发_转发和重定向的相同点

4. 转发的特点

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

什么是转发和重定向转发_转发和重定向的相同点

         2. 当我们把要转发到的资源 /RequestDemo6 换成 www.baidu.com 发现并不能实现转发(404 not found),说明了只能转发到当前服务器内部资源中。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name","Ray");
        request.getRequestDispatcher("www.baidu.com").forward(request,response);         //给服务器用,路径不需要加虚拟目录
        System.out.println("RequestDemo5被访问了。");
}

什么是转发和重定向转发_转发和重定向的相同点

什么是转发和重定向转发_转发和重定向的相同点

        3. 浏览器地址栏路径不发生变化

什么是转发和重定向转发_转发和重定向的相同点 二、重定向(redirect)

 另一种资源跳转的方式。

1. 实现步骤

        1. 设置状态码为302

response.setStatus(302);

        2. 设置响应头

response.setHeader("location","/Web/responseServletDemo2");

        注. 一种简单的重定向方法 

response.sendRedirect(contextPath + "/responseServletDemo2");

2. 图解

什么是转发和重定向转发_转发和重定向的相同点

3. 代码示例

        1. 编写ResponseDemo1,将请求重定向到ResponseDemo2。

@WebServlet(name = "responseServletDemo1", value = "/responseServletDemo1")
public class 重定向 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo1!!!");
//        response.setStatus(302);                               //设置状态码为302(重定向)
//        response.setHeader("location","/Web/responseServletDemo2");            // 设置响应头location
        String contextPath = request.getContextPath();                  //动态获取虚拟目录
        //简单重定向方法
        response.sendRedirect(contextPath + "/responseServletDemo2");               //给客户端用,需要加虚拟目录
    }
}

        注意:这里给客户端使用,需要加虚拟目录。即  request.getContextPath();

        2. 编写ResponseDemo2,直接输出信息。

@WebServlet(name = "responseServletDemo2", value = "/responseServletDemo2")
public class 重定向Demo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo2!!!!");
    }
}

        3. 结果

当我们输入localhost:8080/Web/responseServletDemo1 敲击回车发现浏览器地址会瞬间变成

localhost:8080/Web/responseServletDemo2   ,抓包分析发现浏览器一共发送了2次请求。

什么是转发和重定向转发_转发和重定向的相同点

 回到输出窗口,发现ResponseDemo1和ResponseDemo2的信息都被输出了。

什么是转发和重定向转发_转发和重定向的相同点

4. 重定向的特点

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

三、转发和重定向的区别(总结)

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196217.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Android 浏览器打开APP中的Activity

    Android 浏览器打开APP中的Activity具体实现方式请看博客:jiangwei0910410003上面的示例打开了MainActivity,如果要打开很多不同的Activity,就这样干:

    2022年5月14日
  • 004 JVM调优工具_arthas(阿尔萨斯)

    004 JVM调优工具_arthas(阿尔萨斯)https://alibaba.github.io/arthas/Arthas是Alibaba开源的Java诊断工具,其安装应用非常简单,功能非常强大;1.安装:推荐使用arthas-boot下载arthas-boot.jar:curl-Ohttps://alibaba.github.io/arthas/arthas-boot.jarjava-jararthas-bo…

  • java.math.BigDecimal 比较大小

    java.math.BigDecimal 比较大小BigDecimala=newBigDecimal(101);BigDecimalb=newBigDecimal(111);//使用compareTo方法比较//注意:a、b均不能为null,否则会报空指针if(a.compareTo(b)==-1){System.out.println("a小于b");}if(a.compareTo(b)==…

  • mac怎么上传文件到服务器_linux传输文件到linux

    mac怎么上传文件到服务器_linux传输文件到linux前言我们使用mac时,想让本地文件上传至服务器,该怎么办呢windows系统,我们可以使用xftp或者rz命令,那么mac呢?mac系统,我们可以使用sftp、scp或者rz命令,本文介绍sft

  • css 渐变背景_照片背景换成蓝色渐变

    css 渐变背景_照片背景换成蓝色渐变CSS渐变背景看这一篇就够了在我们自己设计网页的时候,为了好看美观,颜色可谓是最让人头疼的一部分。尤其是在配色上又找不到一些好看的网站。今天我就来记录一些好看的渐变式背景,和一些常用的颜色网站。CSS渐变使可以显示两种或多种指定颜色之间的平滑过渡。让我们来玩一玩,看能玩出什么花来。CSS定义了两种渐变类型:一、线性渐变(向下/向上/向左/向右/对角线)我们通过属性linear-gradient来这样定义一个线性渐变。background-image:linear-gradient(方向

    2022年10月22日
  • github中删除项目

    github中删除项目

    2021年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号