Servlet实例对象的生命周期
Servlet遵循严格的生命周期,在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:
- init()。当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Sevlet需要特殊的初始化需要。那么Servlet编写人员可以重写该方法来执行初始化任务。这是一个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它父类的init方法。系统保证,在init方法成功完成以前,是不会调用Servlet去处理任何请求的
- service()。这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象最为参数传递给它
- 常驻内存
- destroy()。这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源。
###Servlet技术的要点:
-
当前应用中的所有Servlet接口实现类的实例对象,只能由服务器负责创建,开发人不能不能手动创建
-
默认情况下以单实例多线程的方式对外提供服务
-
Servlet实例一旦创建则常驻内存,只有当服务器资源不足而导致当前Servlet对象被调度或者服务器关闭时才会被销毁
-
默认情况下,服务器接收到对于当前Servlet接口实现类的第一次请求时自动创建这个Servlet接口实现类的实例对象
- 可以手动配置要求服务器在启动时自动创建某个Servlet接口实现类对象
##核心对象
API和SPI 分散关注
ServletConfig对象
对应的是Servlet的配置参数信息,由服务器提供对应的具体实现。具体实现是在服务器调用init方法时传入到Servlet实例中
public void init(ServletConfig config) throws ServletException;
config对象由服务器提供实现,并在服务器调用该方法时传入Servlet实例
public interface ServletConfig {
public ServletContext getServletContext(); //用于获取Servlet上下文对象
public String getInitParameter(String name); //用于获取当前Servlet对象的配置参数
public Enumeration<String> getInitParameterNames();//用于获取当前Servlet对象的所有配置参数的迭代器
}
Servlet的配置 web.xml
<servlet>
<servlet-name>showServlet</servlet-name>
<servlet-class>com.yan.action.ShowServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>yanjun</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
在servlet中获取初始化参数
init(ServletConfig)是Servlet接口中定义的方法,需要自行编程处理config对象,因为Servlet接口中还有一个方法时和config对象相关的public ServletConfig getServletConfig();
public class MyServlet implements Servlet{
private ServletConfig config;
public void init(ServletConfig config){
this.config=config;
}
public ServletConfig getServletConfig(){
return config;
}
......
}
实际上HttpServlet已经提供了以上的实现
public abstract class HttpServlet extends GenericServlet {
private transient ServletConfig config; //父类提供
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init(); //提供一个扩展点
}
public void init() throws ServletException {
}
自定义Servlet接收初始化配置参数
@Override
public void init() throws ServletException {
//对应web.xml中init-param标签中定义的参数
String ss = this