谈谈request和response的本质关系,转发和重定向的本质

本文探讨了HttpServletRequest和HttpServletResponse在Servlet中的角色,解释了request和response对象由web容器(如Tomcat)创建,并通过实例解析了doGet和doPost方法的工作原理。重点阐述了转发与重定向的区别:重定向通过response将新地址返回客户端,导致两次HTTP请求和地址变化;而转发在web容器内通过request更改地址,保持同一次请求,地址不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前读书的时候,刚学servlet的时候老实搞不清楚HttpServletRequest 和HttpServletResponse的关系,搞不清楚request和response是主要是做什么的,还有就是为什么Servlet里面的方法老是看到doPost和doGet。所以现在就来详细谈谈。

先放一张我喜欢的博主发的一张新疆伊犁的照片

在这里插入图片描述
谈谈request和response的本质关系:

一个是请求对象,一个是响应对象,那么这两个对象是由谁创建的?
答案是,web容器创建的,简单来说,tomcat容器创建的。

整个流程是这样的:

  1. 首先由客户端(也就是客户浏览器)对web容器发出HTTP请求,
    在这里插入图片描述

  2. 如果是首次访问,那么需要先创建目标servlet。
    在这里插入图片描述

  3. 再由web容器根据http请求创建出request对象和response对象。虽然response对象里面是空的,但是这个时候他就已经被创建出来了,他俩相当于是同一天生的亲兄弟。
    在这里插入图片描述

  4. 然后web容器将生成的request对象和response对象传递到servlet。
    在这里插入图片描述

来我们来看一个标准的servlet是怎么工作的:

@WebServlet(name = "DemoServlet", urlPatterns = "/two")
public class Demo7TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是Two,从请求域中取出one中的值:" + request.getAttribute("name"));
    }
}

我们来看看上面的这段代码干了上面事

  1. 如果发送过来的是get请求,servlet会调用doGet方法,把request和response传递到doPost方法。相当于不管是get方法还是post方法,我都把它变到doPost方法里面去。

  2. doPost方法体里面就开始各种操作,但是归根结底就是将得到的数据写到response里面去,然后再由response载着这些数据返回给Tomcat容器,再由tomcat容器返回给客户端。

由于request和response对象都早就已经创建好了,所的Servlet中的doPost方法和doGet方法传的值都要有

doPost(HttpServletRequest request, HttpServletResponse response)
doGet(HttpServletRequest request, HttpServletResponse response)

doGet和doPost方法的区别是 :

看form表单提交的是get方法还是post方法
在这里插入图片描述
当form框里面的method为get时,执行doGet方法
当form框里面的method为post时,执行doPost方法
在这里插入图片描述

在这里插入图片描述

由此衍生转发和重定向的根本区别就显而易见:

重定向为什么是response来做而转发是request来做?

response.sendRedirect("/MyServlet");
request.getRequestDispatcher("/MyServlet")
  • 重定向本质其实是将"/MyServlet"这个地址作为数据放到了response里面返回给了客户端,也就是说已经出了web容器了,客户端拿到了这个地址,然后根据这个地址再去访问。所以就相当于两次访问,所以地址会变化。

  • 而转发的本质是,把当前request对象里面的地址替换成新的地址,然后由同一个request对象,再去访问新的servlet。整个过程都在web容器里面,所以是同一次http请求了。在客户端那边地址不会变。

参考文章:https://www.cnblogs.com/best/p/9295216.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值