关于servlet生命周期和相关接口的理解
1、实例化创建servlet对象
由容器负责创建,默认情况下,请求到达容器,容器检检查是否有对象,没有则创建;对象创建的时机也可以在web.xml设置。
2、初始化
如何初始化参数:
涉及servlet接口规定了5种方法,与生命周期相关的三种方法分别是:
init(ServletConfig config);service(ServletRequest req,ServletResponse res);destroy();
我们写的servlet类继承了HttpServlet抽象类,而HttpServlet继承了GenericServlet抽象类,GennericServlet抽象实现servlet接口,重写了init(ServletConfig config)和destroy()方法,注意抽象类并不一定要实现接口所有的方法。
其中GennericServle重写的init(ServletConfig config):
但是我们写的子类如何获取父类方法中局部变量?定义了全局变量ServletConfig config,但是被private修饰了,
所以不能直接被子类使用,幸运的是GennericServlet类提供了public修饰getConfig()方法,子类可以直接this.getConfig()获取该对象,取得web.xml文件配置的初始化参数。
如:
ServletConfig config=getServletConfig();
String value=config.getInitParameter("version");
其中version是在web.xml文件配置的参数名。
3、就绪
容器调用service();在底层,容器会根据请求方式调用doGet()或者doPost()方法,因此作为子类,可以重写service();也可以重写doGet()或者doPost()。建议使用前者,因为可以处理get和post两种请求。
注意servlet接口定义的service方法是:service(ServletRequest req,ServletResponse res);而不是我们重写的service(HttpServletRequest req,HttpServletResponse res);那是因为在父类HttpServlet中有两个service方法。
4、销毁
容器调用destroy();容器会根据自身的算法,判断出需要销毁的servlet对象。参考垃圾回收机制,这样才能释放资源空间,防止内存泄露。