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