> 文章列表 > Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

以tomact服务器为例:

热知识:Servlet是java定义的处理动态资源(非静态资源)的java接口规范,HttpServlet是tomcat实现了servlet接口的类

一.当第一次发送请求时候:

1.查询web.xml中的url-parrtern中配置的路径,tomcat底层维护了两个hashmap,第一个hashmap的key为url-parrtern,value为servlet-name(一个servlet对象的唯一标识);第二个hashmap的key为servlet-name,value为servlet实例

2.查看请求的资源路径是否在xml配置中的url-parrtern,即tomcat底层遍历第一个hashmap,查看是否有key为url-parrtern的map结点,如果没有,则当静态资源(web路径下的资源)进行处理,静态资源也找不到则返回404的状态码,

否则在第一个hashmap中取出key为指定url-parrtern的value,即对应的servlet-name,然后在第二个hashmap中put一个值为上面找到的servle-name,value为该servlet对象的实例,底层扫描xml,

通过dom4j得到该servle-name对应的servlet-class,然后通过反射技术创建该servlet对象,然后放到第二个map中(访问指定存在的url-parrtern再创建对应的servlet实例,前提是未在servle配置信息中指明创建web项目时自动创建,即未指明

<load-on-startup>1</load-on-startup>//xml文件方式
@WebServlet(load-on-startup=1) //注解方式

如果指明了在web项目创建时,就创建,则项目启动就会把servlet实例放到第二个hashmap中,并且调用初始化init()方法

3.找到之后通过反射调用该servlet的初始化方法init()(如果有)然后调用service()方法,注意这里用到了多态的动态绑定的机制

即该类身上并没有service()方法,而在其父类HttpServlet身上,下面是Httpservlet源码

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getMethod();long lastModified;if (method.equals("GET")) {lastModified = this.getLastModified(req);if (lastModified == -1L) {this.doGet(req, resp);} else {long ifModifiedSince = req.getDateHeader("If-Modified-Since");if (ifModifiedSince < lastModified) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals("HEAD")) {lastModified = this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}

从上图可以看出判断是get请求还是post请求返回调用对应的doGet()方法和doPost()方法,

而这两个方法要进行重写,写自己的业务逻辑,然后调用的便是自己写的doGet和doPost方法,

用到了多态的动态绑定机制!!

初始化init方法和service方法的调用顺序如下:

二.当第二次及以后再发送请求时候:

直接通过查询两个tomcat维护的hashmap,第一个通过url-parrtern得到servlet-name,第二个通过servlet-name得到servlet实例,然后调用service()方法

三.说明:

1.Servlet实例对象是单例的,因为默认只有在第一次访问对应的url时才创建,以后再访问则是通过hashmap直接取出来的

2.tomcat维护的两个servlet是常驻内存的,知道web工程销毁或其他指定的方式

3.redepoly就会销毁所有的servlet实例对象

下一期介绍HttpservletRequest和HttpservletResponse

注:封面背景来自百度,

笔记参照了教育机构的老师,如有侵权请与我联系qq1989866756