最近研究zipkin,在研究客户端brave的时候,才算开始理解servlet了。
    servlet只是tomcat被实例化一次;
    之后每次访问其实都是对同一个servlet示例操作;所以,不要在servlet的实现中创建什么全局变量(实例变量),并发可能会有问题。

通过下面的示例可以测试出只是被实例化一次(这里的全局遍量是为了测试使用)。
    public class Test extends HttpServlet {  
        private static int count = 0;  
        private int num = 0;  
         
        public Test() {  
        super();  
        count ++;  
        System.out.println("实例化了 "+count+" 次");  
        }  
       
         public void doGet(HttpServletRequest request, HttpServletResponse response)  
             throws ServletException, IOException {  
         response.setContentType("text/html");  
         num ++;  
         System.out.println("被访问了" + num+"次");  
         }  
     }

切换浏览器能够看到servlet只是被实例化一次。

servlet以及filter的定义是在web.xml里面定义的;那么到底什么是servlet?servlet其实是对于客户端请求(HttpRequest)的处理;处理继续细化就是要对处理进行分类处理;在spring的时候我们早已经把处理分配到了各个controller里面去做;web项目,servlet和controller之间的关系是1:m:n;于是我们看到在web.xml里面定义spring的类就是dispatcher你就知道:
    <servlet>
      <servlet-name>spring-webmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    web容器(比如tomcat)是servlet的容器;因为一个tomcat里面可以跑多个web项目,所以可以放置多个servlet;尽管只有一个servlet,但是web容器里面却有着N多线程来同时跑(N是可以配置的),所以一个servlet其实是有多个线程来跑;客户端发来一个请求,其实是由线程池里面选择一个线程来调用serlvet的service函数来进行处理;所以,对于servlet实现类里面的实例变量(全局变量)慎用。
    但是其实一个web项目也是可以指定多个servlet的(大多数情况下只需要一个servlet),这些都是在web.xml中配置的;有servlet节点,和servlet-mapping节点,后者就是用来定义指定的哪些url pattern映射到哪个servlet上面。
    除此之外,就是listener节点,可以监听Servet的各个生命周期的各个事件,从ContextListener可以监听Context的创建和销毁到SessionListener,可以监听Session的创建和销毁,到SessionAttributeListener可以监听Session的属性值的变化等等,可以进行非常细粒度的(生命周期)事件的监听。
    Context这个对象要注意一下,一个web工程只对应一个Context,这个环境里面封装了web工程的对象以及运行环境,session,servlet,engine等都在他的管理之下。我们在tomcat中配置web工程的时候也是配置context节点。

参考:
https://blog.csdn.net/kingxueyuf/article/details/8109651
https://www.cnblogs.com/binyue/p/4513577.html
https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
https://www.ibm.com/developerworks/cn/education/java/j-intserv/j-intserv.html
《深入分析Java Web技术内幕》

servlet运作机制的更多相关文章

  1. AsyncLocal的运作机制和陷阱

    这是今天帮柠檬分析一个AsyncLocal相关的问题时发现的. 试想这个代码输出的值是多少? using System; using System.Threading; using System.Th ...

  2. servlet运行机制、Request内置对象和服务器端跳转

    servlet运行机制: 当发送一个请求到服务器的时候,容器(Tomcat)会判断该路径属于哪一个 Servlet 进行处理,Servlet 有一个抽象父类“HttpServlet”,这个类是一个模板 ...

  3. JavaWeb之servlet管理机制

    一.什么是Servlet 简单的说,浏览器发出请求到tocat服务器,服务器就会初始化一个servlet实例(servlet采取生命托管的方式实现单例,不存在时才会创建实例),servlet示例会启动 ...

  4. 【SpringCloud技术专题】「Eureka源码分析」从源码层面让你认识Eureka工作流程和运作机制(上)

    前言介绍 了解到了SpringCloud,大家都应该知道注册中心,而对于我们从过去到现在,SpringCloud中用的最多的注册中心就是Eureka了,所以深入Eureka的原理和源码,接下来我们要进 ...

  5. Hadoop-Yarn-框架原理及运作机制(原理篇)

    文件为转载:http://blog.csdn.net/liuwenbo0920/article/details/43304243 一.YARN基本架构 YARN是Hadoop 2.0中的资源管理系统, ...

  6. Hadoop-Yarn-框架原理及运作机制

    一.YARN基本架构 YARN是Hadoop 2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager和每 ...

  7. Hadoop Yarn 框架原理及运作机制及与MapReduce比较

    Hadoop 和 MRv1 简单介绍 Hadoop 集群可从单一节点(其中所有 Hadoop 实体都在同一个节点上运行)扩展到数千个节点(其中的功能分散在各个节点之间,以增加并行处理活动).图 1 演 ...

  8. redis底层设计(五)——内部运作机制

    5.1 数据库 5.1.1 数据库的结构: Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示: typedef struct redisDb { // 保存着数据库以整数表 ...

  9. Redis的内部运作机制

    本文将分五个部分来分析和总结Redis的内部机制,分别是:Redis数据库.Redis客户端.Redis事件.Redis服务器的初始化步骤.Redis命令的执行过程. 首先介绍一下Redis服务器的状 ...

随机推荐

  1. 已经安装了node和npm,输入node -v 未找到命令

    昨天虚拟机上安装了nvm.node.npm,今天打开输入node -v,就显示未找到命令 输入nvm --version 发现还是有nvm版本的,不然都要以为刚配好的虚拟机又要重新安装... 再输入 ...

  2. springboot跳转jsp页面

    springboot支持jsp页面跳转 官方不推荐jsp的支持(jar包不支持jsp,jsp需要运行在servletContext中,war包需要运行在server服务器中如tomcat)官方推荐使用 ...

  3. MySQL使用通用二进制格式安装

      CentOS7安装MySQL的方法之通用二进制格式          

  4. ftp的虚拟用户的搭建

    虚拟的搭建在安装的根匿名的一样,在改配置文件之前需要创建虚拟的账号 路径为/etc/vsftpd/ 创建pam认证文件 然后修改配置文件其余的文件配置跟本地的一样. 然后重启vsftpd服务 想要实现 ...

  5. hdu 6113 度度熊的01世界(结构体的赋值问题)

    题目大意: 输入n*m的字符串矩形,判断里面的图形是1还是0,还是什么都不是 注意:结构体中放赋值函数,结构体仍旧能定义的写法 #include <iostream> #include&l ...

  6. CSS3 文本超出后显示省略号...

    纯用CSS实现,主要采用代码 overflow:hidden; text-overflow:ellipsis;//这是让文本溢出后,显示成省略号. white-space:nowrap;//禁止自动换 ...

  7. linux系统参数统计脚本

    #!/bin/sh clear if [[ $# -eq 0 ]] then #Define Variable Reset_terminal Reset_terminal=$(tput sgr0) # ...

  8. leetCode之Median of Two Sorted Arrays

    [题目描述] There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of ...

  9. [Linux] 使用rename批量重命名文件

    例如把所有png文件的后缀改为jpg $ rename 's/png/jpg/' *png

  10. flutter笔记1:VScode安装dart code插件踩坑记录

    新手菜鸟一枚,想从产品转入技术坑,目标:移动端APP开发.最近听技术达人 飞狐 说flutter beta发布了,支持跨平台APP开发,各种强大易上手,于是乎零基础入坑~话说想提高英文水平的同学,请移 ...