深入 request 和 response 对象
# 30.深入 request 和 response 对象
本文讲讲如何使用 request 和 response 对象
# request 对象和 response 对象的原理
在 Servlet 中,service 方法的参数有两个:ServletRequest servletRequest, ServletResponse servletResponse
,servletRequest
表示请求数据, servletResponse
表示响应数据
request 和 response 对象是由服务器(例如 Tomcat)创建的,我们使用 request 对象获取请求消息,response 对象设置响应消息。
当 Tomcat 收到一个请求的时候,会做如下事情:
- 根据请求 url 路径,创建对应的 Servlet 对象
- 根据请求信息封装 request 对象,并创建 response 对象
- 将 request 和 response 对象传递给 Servlet 的 service 方法,并调用 service 方法
- 我们通过编写代码,获取请求信息,然后通过 response 设置响应信息
- 服务器从 response 对象中取出消息,返回 HTTP 响应给客户端
# request 对象继承体系结构
我们之前写 Servlet 的时候,request 的参数类型是 ServletRequest
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
2
3
而在 HttpServlet
中,参数类型是 HttpServletRequest
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ServletHttpDemo1Hello doGet");
}
2
3
4
但 ServletRequest
和 HttpServletRequest
都是接口,具体创建的对象是什么呢?我们可以试着打印一下对象:
@WebServlet("/httpDemo1")
public class ServletHttpDemo1Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ServletHttpDemo1Hello doGet");
System.out.println(req);
}
}
2
3
4
5
6
7
8
重启 Tomcat,访问 http://localhost: 8080/hello/httpDemo1,可以看到 IDE 里打印了日志:
org.apache.catalina.connector.RequestFacade@521c1ce9
因此,是 Tomcat 里有个类实现了 HttpServletRequest
接口
我们可以在 Tomcat 官网下载源码:Apache Tomcat® - Apache Tomcat 9 Software Downloads (opens new window)
我们打开源码:D:\Projects\apache-tomcat-9.0.73-src\java\org\apache\catalina\connector\RequestFacade.java
可以看到类名是这样的:
public class RequestFacade implements HttpServletRequest {
小结下继承体系:
ServletRequest:接口
| 继承
HttpServletRequest : 接口,继承 ServletRequest
| 实现
org.apache.catalina.connector.RequestFacade ,实现 HttpServletRequest 接口