zoukankan      html  css  js  c++  java
  • servlet运作机制

        最近研究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技术内幕》

  • 相关阅读:
    Java HashMap 和 ConcurrentHashMap
    递归算法应用
    二叉树基础知识
    自动删除qq空间说说
    移动APP测试的22条军规--笔记
    SQL Server数据库状态监控
    SqlSugar-事务操作
    详解第一范式、第二范式、第三范式、BCNF范式
    SQL 日期
    2019年世界各国gdp排名对比
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/8723161.html
Copyright © 2011-2022 走看看