新增的注解支持@WebServlet
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):
loadOnStartup
web服务器在启动阶段就实例化Servlet对象(通过servlet无参构造方法完成servlet实例化和调用servlet对象的init方法完成初始化。):
1. 在web,xml文件里加上 <load-on-startup>1</load-on-startup>
2. 或者在servlet3.0注解
@WebServlet(name="userservlet",urlPatterns="/servlrt/myservlet",loadOnStartup=1)
servlet实现的三种方式
- 实现servlet接口,重写里面的service方法,使用的时候需要引用servlet-api.jar。
- 继承GenericServlet ,重写里面的service方法。
- 通过继承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方法。
总结
- servlet类的构造方法只执行一次。
- servlet对象init方法只执行一次。
- servlet对象的service方法,用户请求一次,调用一次。
- servlet对象destroy方法只执行一次。
servlet对象是单例,但是不符合单例模式,只能称为伪单例。Tomcat支持多线程,所以servlet对象在单例多线程的环境下运行。那么servlet对象中若有实例变量(成员变量),实例变量涉及到修改操作,那么这个servlet对象一定会存在线程安全问题,所以尽量使用局部变量