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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • QMap简单用法

    QMap简单用法QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,这个类也支持一键多值的情况,用类QMultiMapQHash具有和QMap几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash两种之间的区别是:

  • matplotlib无法显示图片_python运行程序后不显示图像

    matplotlib无法显示图片_python运行程序后不显示图像在学习Matplotlib的时候,在Pycharm中运行的时候不会弹出画的图像。首先你运行之后最小化pycharm,看看是不是已经出来了,只是没有自己弹到最顶层。 代码如下: importnumpyasnpimportmatplotlib.pyplotaspltdefmain():#线的绘制x=np.linspace(-np.p…

  • cmd命令怎么切换盘符_cmd命令行怎么切换到d盘

    cmd命令怎么切换盘符_cmd命令行怎么切换到d盘用命令行,要从C盘切换到F盘,然后傻傻地输入了cdcd是在同一个盘下切换空间用的盘之间切换应该用:F:盘符名加一个冒号,大小写不限。

  • mount命令详解

    mount命令详解原文链接:https://blog.csdn.net/happy_teemo/article/details/80026906挂接命令(mount)首先,介绍一下挂接(mount)命令的使用方法,

  • 电脑虚拟ip地址怎么弄_虚拟服务器内部端口和外部端口

    电脑虚拟ip地址怎么弄_虚拟服务器内部端口和外部端口写在前面最近,有位小伙伴为了实现Nginx的高可用,在自己的服务器上搭建了一套Nginx集群,Nginx节点的服务器总共有3台。那么问题来了:如何对外只使用一个IP地址,通过某种策略来访问三个服务器节点上的Nginx?答案就是:可以使用虚拟IP来实现!那么,如何在服务器上添加虚拟IP?今天,我们就一起实操在服务器上添加虚拟IP。实战内容这里我们创建两个虚拟机环境,IP地址分别为192.168.20…

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

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