Java——处理HTTP请求时,Web容器做了什么?
这篇文章记录的是个人之前在学习Servlet/JSP没注意到的知识。
这里所用到的Web容器是Tomcat
从抽象层面来看,Web容器是Servlet/JSP唯一认得的HTTP服务器。所以得知道在这种抽象层面下,Web容器如何生成、管理请求/响应对象,为何有这样的架构。也是这篇文章的价值所在!
要注意的是 Tomcat 主要提供了 Web 容器的主要功能,却不是 HTTP服务器的功能,Tomcat附带的HTTP服务器功能太过简单,仅仅是为了给开发者提供便利而已。
我们先来看看从请求到 Servlet 处理的关系如下:
浏览器<—>实体服务器<—>HTTP服务器程序<—>Web容器<—>Servlet
当请求来到了HTTP服务器,服务器会转交给Web容器,此时容器会创建一个代表当前的请求的 HttpServletRequest 对象,并将请求相关信息设置给该对象。同样也会创建一个响应的对象 HttpServletResponse,作为之后要对客户端进行响应的 Java 对象。
接着,容器会读取我们编写 Servlet 中的 @WebServlet 标注或者 web.xml 配置,找到能处理该请求的 Servlet。将 HttpServletRequest 对象、 HttpServletResponse 对象作为参数传入service() 方法中,该方法会根据HTTP的请求方式,调用对应的 doXXX() 方法。
接着在doGet() / doPost() 中,使用 getParameter() 取得请求参数;使用 getWriter() 取得输出用的 PrintWriter 对象,并进行各项响应处理。
对 PrintWriter 做的输出操作,最后通过 Web 容器转换为 HTTP 响应,再由 HTTP 服务器对浏览器进行响应。
最后容器将该次的 HttpServletRequest 对象、 HttpServletResponse 对象销毁回收。
So,总的来说,如果没有Web容器
- HttpServletRequest 对象、 HttpServletResponse 对象的创建
- 输出 HTTP 响应的转换
- HttpServletRequest 对象、 HttpServletResponse 对象的销毁与回收
以上这些,都得自己动手去完成,可以想象一下得有多麻烦!
PS:参考书目《JSP/Servlet学习笔记》
如果有什么说的不对的,还希望各位能不吝指导,祝大家好运!