servlet的工作原理_servlet的作用

servlet的工作原理_servlet的作用1.Servlet容器Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:在Tomact容器等级中,Context容器直接管理Servlet在容器中的包装类Wrapper,每个Context对应一个Web项目,所以Context如何运行直接影响到Servlet的运行。1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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技术内幕》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185894.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月4日 下午9:00
下一篇 2022年10月4日 下午9:16


相关推荐

  • day04 JavaScript高级程序设计 阅读总结

    day04 JavaScript高级程序设计 阅读总结《JavaScript高级程序设计》(第四版)阅读总结额,据说这本是前端er必看书籍,花了20个小时简单把这本书过了一下,目前暂时很少用到的东西我这一遍就没有过了,等以后要用的时候再回来继续学了。先来谈谈这本书的缺点,书籍前面章节用到了一些后面才讲到的东西,比如第三章讲symbol对象时,就用到了后面才讲的iterator和generator。然后就是感觉讲的有点太广了,而且基本没有课后习题,看过就是看过了,顶多自己花时间把书里面的例子都敲一遍。所以我建议应该和现代JavaScript教程一起食用。反

    2022年8月20日
    12
  • JS、ActiveXObject、Scripting.FileSystemObject

    JS、ActiveXObject、Scripting.FileSystemObjectJavascript之文件操作(IE)一、功能实现核心:FileSystemObject对象要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象。&#1

    2022年7月1日
    30
  • Spark是什么?

    Spark是什么?Spark 是个通用的集群计算框架 通过将大量数据集计算任务分配到多台计算机上 提供高效内存计算 如果你熟悉 Hadoop 那么你知道分布式计算框架要解决两个问题 如何分发数据和如何分发计算 Hadoop 使用 HDFS 来解决分布式数据问题 MapReduce 计算范式提供有效的分布式计算 类似的 Spark 拥有多种语言的函数式编程 API 提供了除 map 和 reduce 之外更多的运算符 这些操作是

    2026年3月17日
    2
  • 常见问题与调试技巧

    常见问题与调试技巧

    2026年3月15日
    3
  • 怎么让Linux发邮件? Linux怎么发email

    怎么让Linux发邮件? Linux怎么发email相比大家也想让自己的Linux备份啊什么的存储起来  放到哪里最安全呢 相比来说放到自己QQ邮箱比放到自己电脑更安全一些我们今天就来做一个实验让你的Linux发邮件到你的mail中我们今天需要一个软件(mailx)直接yum装即可:yuminstall-ymailx 然后我们创建一个隐藏文件类似.sh 随便一个就好 vi/email.sh然…

    2022年10月20日
    5
  • java.lang.NullPointerException出现的几种原因以及解决

    java.lang.NullPointerException出现的几种原因以及解决java.lang.NullPointerException出现的几种原因:1、字符串变量未初始化2、接口类型的对象没有用具体的类初始化,比如:Mapmap//会报错Mapmap=newMap();//则不会报错了3、当一个对象的值为空时,你没有判断为空的情况。4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常Stringstr…

    2022年5月20日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号