zoukankan      html  css  js  c++  java
  • servlet的生命周期,调用流程,tomcat装载servlet

    调用流程

    servlet创建后是需要在web.xml里注册的:

      例如:  

    <servlet>
      <servlet-name>df</servlet-name>     <!-- 第三步 -->
      <servlet-class>df</servlet-class>   <!-- 第四步 -->
    </servlet>

    <servlet-mapping>
      <servlet-name>df</servlet-name>      <!-- 第二步 -->
      <url-pattern>/servlet/df</url-pattern> <!-- 第一步 -->
    </servlet-mapping>

    上面就是写在web.xml里的注册信息,访问servlet就是通过这个信息完成的。

     

    比如jsp里通过超链接  访问  <a   href = "/servlet/df">     .

       1.超链接里写的是servlet的url,也就是<servlet-mapping>里面的<url-pattern>的值。

       2.通过<url-pattern>找到<servlet-mapping>里对应的<servlet-name>

       3.通过<servlet-name>去<servlet>里面找对应的<servlet-name>(因为<servlet>标签里面可以包含很多个servlet,上面的代码里就一个。)

       4.在<servlet>里通过<servlet-name>找到对应的<servlet-class>。这个就是servlet对应的Java类。至此就找到要调用的class文件了。

    jsp里有说过,jsp会被转换成servlet,生成了一个Java类,其实servlet都有其对应的Java类。访问servlet就是通过web.xml里的注册信息,找到对应的Java类

    生命周期:

      和jsp页面的生命周期类似。都是先调用init()初始化。

      然后客户的请求过来,调用service()方法。

      根据请求方法,调用doGet或者dePost方法。这两个方法也是创建servlet时需要重写的(service方法不用重写,service方法是调用这两个方法)。

      最后服务器关闭,调用destory()方法。

    注意:

    1.

      项目终止是不会调用destory()方法的。

      点击这个按钮不会调用destory()。

      必须是  点击    tomcat-----stop  server  才会调用destory()。(不过这个好像在写代码时也用不到)

    2.

      在servlet的生命周期里,init只被调用一次(这一点涉及以前jsp里不明白的那句 “ jsp转换成 servlet,驻留在服务器内存,所以可以对请求快速反应”   。 下面有说明),service则是由请求过来,就被调用,然后分配一个线程(不是进程,驻留在内存里的应该就是进程,然后根据请求分配线程)处理。

    tomcat装载servlet

      tomcat是web容器,web项目需要运行在web容器里(可以不是tomcat,也有其他的web容器)。

      servlet也是一样需要容器的。tomcat里其实就有servlet容器(被包含的关系)。

      所以tomcat会装载servlet(其实是tomcat里的servlet容器装载servlet)。

    servlet容器装载servlet的情况:

      1. web.xml里的注册信息<servlet>标签里写上<loadon-startup>1</loadon-startup>(数字越小说明优先级越高)。有了这个标签,servlet容器启动时,被标记的servlet就会自动装载。

      2. servlet容器启动后,用户对servlet发送了请求(比如上面通过超链接访问),这些servlet就会被装载。

      3.servlet的类文件修改(对应的Java文件被修改)了,这时算是一个新的servlet,再次被访问,就是重新装载(正常情况是装载一次,就一直在服务器的内存里了?这也是我前面不理解的那句话,为什么说servlet一直驻留在服务器内存?

      

       servlet被装载后,servlet容器首先创建一个servlet实例,然后调用init初始化。

    注意:

    1.

      init只被调用一次,是针对的servlet的实例,如果servlet的Java代码修改,重新装载时,会重新创建实例,肯定也会再次init。因为这是另一个生命周期了。所以servlet的生命周期是针对的servlet的示例??

    2.

      servlet驻留服务器的内存,其实是指servlet的实例驻留在内存。所以前面说   servlet一旦被创建就驻留在内存,其实是在servlet的一个生命周期里,创建的实例驻留在内存里

      这里的实例感觉可以理解为servlet的一个生命周期有实例,其实就是对应一个进程,驻留在内存里的应该是这个进程?毕竟进程驻留内存更容易理解,生命周期结束(代码被修改或者项目终止),进程也就死亡了,从内存的调度队列里消失。这个理解我感觉更符合操作系统里的知识。

  • 相关阅读:
    java基础英语---第十九天
    java基础英语---第十六天
    java基础英语---第十七天
    java基础英语---第十四天
    java基础英语---第十五天
    java基础英语---第十三天
    设计模式
    设计模式
    设计模式
    设计模式
  • 原文地址:https://www.cnblogs.com/youwuyi/p/10248195.html
Copyright © 2011-2022 走看看