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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20岁扶墙码农

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值