servlet的生命周期一般包含4个阶段
1、加载和实例化
servlet容器负责加载和实例化 servlet
2、初始化
init() 方法初始化servlet 对象,只能调用一次
3、处理请求
servlet 容器调用service()方法处理请求,request 方法获取客户端相关信息和请求信息,response 方法设置响应信息。
由service方法调用对应的方法如doGet 、doPost
4、服务终止
destroy 方法,释放该servlet实例所使用的资源,只能调用一次
注意事项
1、不要使用servlet实例变量,否则坑你产生线程安全问题。
2、不要用init()方法获取数据库连接
3、@WebServlet(urlPatterns = "/ServletOne",loadOnStartup = -1)
Java EE中 loadOnStartup默认为-1;即servlet 不随容器启动而加载
loadOnStartup 为非负数时,servlet 岁容器启动而加载,且数字越小优先级越高。
关于servlet的service() 方法
在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏??
Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像HttpServlet等具体的servlet都是直接或者间接实现了这个接口)里面就有这个方法,所以不管是怎样的servlet类,都有service方法,没有service就不能称为一个Servlet了。
而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet,doPos以及其他的doXXXt方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。如果重写了service方法,那么servlet容器就会把请求交给这个方法来处理,倘若你重写的service方法没有调用doXXX,即使你在Servlet中又重写了其他doGet doPost等也是不回被调用的 因为Servlet的service被自动调用(就像init destory一样),所以如果你由于某种需要,需要重写service方法,并且更具不同的method调用doPost doGet等时,就要在末尾加上一句super.service(),这样就可以解决问题了。
参考链接