首页 > 代码库 > 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生命周期工作原理