Servlet实现方式及生命周期

新增的注解支持@WebServlet

@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):
Servlet实现方式及生命周期_第1张图片


loadOnStartup

web服务器在启动阶段就实例化Servlet对象(通过servlet无参构造方法完成servlet实例化和调用servlet对象的init方法完成初始化。):

1. 在web,xml文件里加上 1
2. 或者在servlet3.0注解
@WebServlet(name="userservlet",urlPatterns="/servlrt/myservlet",loadOnStartup=1)


servlet实现的三种方式

  1. 实现servlet接口,重写里面的service方法,使用的时候需要引用servlet-api.jar。
  2. 继承GenericServlet ,重写里面的service方法。
  3. 通过继承HttpServlet,重写post或者get方法。

servlet生命周期

servlet从最初的建立、方法的调用、以及对对象的销毁,是由web容器管理的。默认情况下,servlet对象在web服务器启动阶段不会实例化。

描述生命周期

1 用户在地址栏输入URL:http://localhost:8080/servlet1/servlrt/myservlet。
2. web容器拦截请求路径:/servlet1/servlrt/myservlet。
3. web容器在容器上下文中找请求路径对应的servlet对象。
4. 若没有找到对应的servlet对象。
       4.1 通过web.xml文件相关的配置信息,得到路径对应的servlet类名。
        4.2 通过反射机制,通过servlet无参构造方法完成servlet实例化。
        4.3 web容器调用servlet对象的init方法完成初始化。
       4.4 web容器调用servlet对象的service(dopost,doget)方法提供服务。
5. 若找到对应的servlet对象。
       5.1 web容器调用servlet对象的service(dopost,doget)方法提供服务。
6. web容器关闭或重新部署时,web容器会将该servlet对象销毁,在销毁之前,web容器会调用destroy方法。

总结

  1. servlet类的构造方法只执行一次。
  2. servlet对象init方法只执行一次。
  3. servlet对象的service方法,用户请求一次,调用一次。
  4. servlet对象destroy方法只执行一次。

servlet对象是单例,但是不符合单例模式,只能称为伪单例。Tomcat支持多线程,所以servlet对象在单例多线程的环境下运行。那么servlet对象中若有实例变量(成员变量),实例变量涉及到修改操作,那么这个servlet对象一定会存在线程安全问题,所以尽量使用局部变量

你可能感兴趣的:(servlet)