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

原文地址:https://www.cnblogs.com/youwuyi/p/10248195.html