Servlet工作原理初识

本文介绍了Servlet容器的工作原理,包括启动过程、配置解析、Servlet实例化及初始化等关键步骤。此外,还详细阐述了Servlet的生命周期及其核心方法。

1. Servlet容器
Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:
这里写图片描述
在Tomact容器等级中,Context容器直接管理Servlet在容器中的包装类Wrapper,每个Context对应一个Web项目,所以Context如何运行直接影响到Servlet的运行。
1.2 Servlet容器的启动过程
下面这段代码描述了将一个Web工程添加到Context容器中:

  public Context addWebapp(Host host, String url, String name, String path) {
        silence(host, url);
        Context ctx = new StandardContext(); //创建一个context
        ctx.setName(name);
        ctx.setPath(url);
        ctx.setDocBase(path); //设置一系列参数
        ctx.addLifecycleListener(new DefaultWebXmlListener());  //添加Listener
        ContextConfig ctxCfg = new ContextConfig(); //创建web配置类
        ctx.addLifecycleListener(ctxCfg);       
        // prevent it from looking ( if it finds one - it'll have dup error )
        ctxCfg.setDefaultWebXml(noDefaultWebXmlPath());
        if (host == null) {
            getHost().addChild(ctx);
        } else {
            host.addChild(ctx); //将context添加到host中
        }
        return ctx;
    }

在上述代码中,创建了一个context,并且设置了一些必要的参数。其中最重要的配置是ContextConfig,这个类将会负责整个Web应用的解析工作。其会负责整个Web应用的配置文件的解析工作,如下:
ContextConfig的init方法将会主要完成以下工作:
1.创建用于解析XML配置文件的contextDigester对象。
2.读取默认的context.xml配置文件,如果存在则解析它。
3.读取默认的Host配置文件,如果存在则解析它。
4.读取默认的context自身的配置文件,如果存在则解析它。
5.设置context的DocBase。
执行完init方法后,context容器将会执行startInternal方法,主要晚餐一下工作:
1.创建读取资源文件的对象。
2.创建ClassLoader对象。
3.设置应用的工作目录。
4.启动相关的辅助类,如logger,realm,resources等。
5.修改启动状态,通知感兴趣的观察者。
6.子容器的初始化。
7.获取ServletContext并设置必要的参数。
8.初始化“load on startup“的Servlet。
2.创建Servlet实例
前面已经完成了Servlet的解析工作,并且被包装成StandardWrapper添加在Context中,接下来就是Servlet的实例化和初始化。
创建Servlet实例的方法是从Wrapper.loadServlet开始的。loadServlet方法要完成的就是获取servletClass,然后把它交给InstanceManager去创建一个基于servletClass.class的对象。
初始化Servlet是调用Wrapper.initServlet方法,这个方法就是调用了Servlet的init方法,同时把包装了StrandardWrapper对象的StrandardWrapperFacade作为ServletConfig传给Servlet。如下代码:

//创建Servlet方法
 public synchronized Servlet loadServlet() throws ServletException {
        ...............  //省略部分代码
        Servlet servlet;
        try {
            long t1=System.currentTimeMillis();
        ...............  //省略部分代码
            InstanceManager instanceManager = ((StandardContext)getParent()).getInstanceManager(); //获取InstanceManager 
            try {
                servlet = (Servlet) instanceManager.newInstance(servletClass);  //创建Servlet
         .............  //省略部分代码
          initServlet(servlet); //初始化Servlet
         .............  //省略部分代码
        return servlet;

    }

3. Servlet体系结构
如图:
这里写图片描述
由图可知,与Servlet主动关联的是三个类ServletConfig,ServletReuqest,ServletResponse。这三个类都是通过容器传递给Servlet的,其中ServletConfig在Servlet初始化就传给Servlet了,其它两个是在请求时传递给Servlet。ServletConfig是为了获取Servlet的一些配置属性,而ServletContext是为模块交换数据提供交易场景。

4.Servlet如何工作
用户发起一个请求到服务器,服务器是如何根据URL来到正确的Servlet容器中呢。在Tomact中映射工作是通过一个专门的mapper类来完成,这个类保存了Tomact的Container容器中的所有子容器的信息,在请求进入Request进入Container容器之前,Mapper将会根据这次请求的hostname和contextPath将host和context容器设置到Request的mappingData属性中。Request的Mapper类图如下:
这里写图片描述

5.Servlet的生命周期
Servlet生命周期:加载,实例化,服务,销毁。
在Servlet接口中有如下三个方法:
1.init(ServletConfig config):在Servlet的生命周期中执行一次,在服务器装入Servlet是执行,负责初始化Servlet。
2.Service()方法:它是Servlet的核心,负责响应用户的请求。HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3.destroy():当Servlet从容器中移除的时候调用,也就表明Servlet的生命周期结束了。

本篇文章是参考《深入分析JavaWeb技术内幕》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值