首页 > 代码库 > Servlet生命周期工作原理

Servlet生命周期工作原理

开发一个Servlet:

1.1 步骤:

                                     1)编写java类,继承HttpServlet类

                                     2)重新doGet和doPost方法

                                     3)Servlet程序交给tomcat服务器运行!!

                                                        3.1 servlet程序的class码拷贝到WEB-INF/classes目录

                                                        3.2 在web.xml文件中进行配置

<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
      <!-- servlet的内部名称,自定义。尽量有意义 -->
      <servlet-name>FirstServlet</servlet-name>
      <!-- servlet的类全名: 包名+简单类名 -->
      <servlet-class>servlet.FirstServlet</servlet-class>
  </servlet>
  
  
  <!-- servlet的映射配置 -->
  <servlet-mapping>
      <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
      <servlet-name>FirstServlet</servlet-name>
      <!-- servlet的映射路径(访问servlet的名称) -->
      <url-pattern>/first</url-pattern>
  </servlet-mapping>

 

/first    资源名称。

 

                                     1)在day10的web.xml中查找是否有匹配的url-pattern的内容(/first)

                                     2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的   

servlet配置

 

                                     3)如果找到,则取出对应的servlet配置信息中的servlet-class内容: 字符串:servlet.FirstServlet

 

 

              通过反射:

 

                  a)构造FirstServlet的对象

 

                  b)然后调用FirstServlet里面的方法

      Servlet映射路径

 

<servlet-mapping>
  	<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
  	<servlet-name>FirstServlet</servlet-name>
  	<!-- servlet的映射路径(访问servlet的名称) -->
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>

 

 Servlet缺省路径

 

<url-pattern>为Servlet内的一个默认路径,对应一个DefualtServlet .用于解析静态文件。如果最后文件名输入错误,没有匹配的url-pattern,就执行Tomcat默认路径,default自动寻找如果找不到,就返回404页面

 

Servlet 生命周期由Tomcat服务器控制

构造方法:创建Servet第一次访问时创建一次

init:只调用一次创建完Servlet方法后调用

service:调用多次。调用n次

destroy:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

 

Servlet 生命周期演示:Tomcat内部调用过程(理解):

1)通过通过映射找到Servlet-class内容,刚才代码中的     servlet.FirstServlet

2) 通过反射构造FirstServlet对象

                   2.1得到字节码对象 class clazz=class.forName("Servlet.FirstServlet");

                  2.2 调用无参数的构造方法来构造对象

                  Object obj = clazz.newInstance();            --1.servlet的构造方法被调用

 3)创建ServletConfig对象,通过反射调用init方法

                  3.1 得到方法对象

                  Method m = clazz.getDeclareMethod("init",ServletConfig.class);

                  3.2 调用方法

                  m.invoke(obj,config);                             --2.servlet的init方法被调用

 4)创建request,response对象,通过反射调用service方法

               4.1得到方法对象

Method m=clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

               4.2调用方法

                   m.invoke(obj.request,response);            --3.servlet service方法调用

5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法

                  5.1 得到方法对象

                  Method m = clazz.getDeclareMethod("destroy",null);

                  5.2 调用方法

                  m.invoke(obj,null);                                    --4.servlet的destroy方法被调用

Servlet自动加载

默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。

                            改变servlet创建对象的时机: 提前到加载web应用的时候!!!

                            在servlet的配置信息中,加上一个<load-on-startup>即可!!

Servlet生命周期工作原理