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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 送给刚刚開始学cocos2d-x引擎 移植Android的同学

    送给刚刚開始学cocos2d-x引擎 移植Android的同学

    2021年12月4日
    35
  • UVa 414 – Machined Surfaces

    UVa 414 – Machined Surfaces题目:n个由X和空格组成的串,两边有至少一个X,将n个串压缩,每次每行消除一个空格,问到不能消除时剩余的空格。分析:简单题。统计全体空格数sum_b和最少空格数min_b,则结果就是sum_b-n*min_b。注意:利用gets或者getline读入串。#include#include#include#includeusingnamespacestd;

    2022年5月29日
    22
  • Java–String、StringBuilder及StringBuffer区别及性能对比

    Java–String、StringBuilder及StringBuffer区别及性能对比【学习背景】主要是想通过OpenJDK提供的JMH工具测试下String、StringBuilder及StringBuffer字符串拼接的效率如何~关于JMH的介绍及具体使用,我的这篇博文中有介绍:Java–☀️面试官:LinkedList真的比ArrayList添加元素快?❤️‍本文通过OpenJDKJMH带你揭开真相《⭐建议收藏⭐》当然,除了主要验证三者的字符串拼接效率之外,还会对三者做一些区别分析及常见面试问题总结,希望加深自己对这三者的认知,分享出来,也希望能帮助到有需要的小伙伴~

    2022年6月28日
    20
  • jsp调用getParameterValues获取表单信息

    jsp调用getParameterValues获取表单信息1.新建一个DynamicWebProject项目,里面新建两个jsp文件,整体的结构如下所示:2.one.jsp文件里面的代码如下所示:<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>example 选择你去过的城市:

    2022年7月22日
    11
  • 有效管理自己知识,多总结和分享——2018七月份的尾巴

    知道却做不到,等于不知道! –笔记侠 知道却讲不出来,也等于不知道! –dufy知道 ≠ 能做到 | 知道 ≠ 能讲出 ?昨天听了一个音频,里面说:“知道很多道理 却依然过不好这一生”!知道了这么多道理,能真正做到有多少呢?知道了这么多道理,真正用自己的理解或者自己的话能表达的道理又有多少呢?我在反思自己,希望与你共勉!分享:好的学习方法 — 费曼技巧…

    2022年2月27日
    40
  • 软件工程师业绩简要描述(优秀员工工作业绩和自我评价)

    1/9JAVA软件工程师简历自我评价具有很强的团队精神,有良好的组织和协调能力,有强烈的集体荣誉感。自学能力强,喜欢钻研新技术,敢于面对和克服困难。熟练使用spring+struts+hibernate整合开发。熟练使用jsp、servlet、jstl、jdbc下的编程开发。熟练使用eclipseide开发工具,熟练掌握tomcat等web容器以及j2ee容器的配置以及部署,能够使用junit进行…

    2022年4月13日
    375

发表回复

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

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