深入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接口