要清楚认识一样东西了解它是如何产生,由谁产生,如何初始化,怎么销毁是很有必要的。
简单地说
1、Web应用启动时,Web容器会根据web.xml中的servlet配置创建实例对象并且加载到内存。
2、创建对象时会封装ServletConfig对象,该对象包含了对应servlet对象的参数信息,可以通过在servlet配置中添加初始参数,形式如下
<servlet> <servlet-name>.....</servlet-name> <servlet-class>.....</servlet-class> <init-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> </init-param> </servlet>
在初始化完毕后即可以通过servletConfig获取该参数,一般可以通过调用HttpServlet中的getInitParameter()方法间接调用servletConfig中的相关方法,传入名称参数获取value,配合上面的配置,获取value代码如下
//在实现的HttpServlet接口的类中
String value = getInitParameter("paramName");
//得到的字符串为上述xml配置中的"paramValue"
注意:所谓初始化完毕在Servlet初始化过程中,会调用init(servletConfig)方法,此时可以理解为已经初始化完毕,而该方法会调用无参数的init()方法,所以要调用servletConfig最好重写无参数的init();
应用:一般可以将同一servlet会用到的固有参数,例如固定模块(版头)的url,写进servletConfig中,可以避免写死,修改时只需要修改xml中的相关值就可以了。
3、Web应用运行后会产生一个代表对象ServletContext,包含了整个应用的相关信息,不难想到,同一应用下的所有servlet都可以访问ServletContext来得到一致的数据,具体方法的作用可以参考API。
常用的是先通过getServletContext()得到ServletContext对象,类似ServletConfig也可以通过getInitParameter()来读取初始参数,设置初始参数同样在xml中设置,方式如下
<context-param> <param-name>...</param-name> <param-value>...</param-value> </context-param>
需要注意的是,读取参数同样需要在对象初始化完毕后,这需要用到监听器(listerner)来监听才能保证不会出错。监听器首先需要在web.xml中配置监听器,代码百度即可,而监听器的类则需要实现ServletContextListener接口,具体实现查看API一目了然。
在ServletContext中的属性,除非你主动删除,否则会已知存活直至Web应用关闭。
遗憾的是,书中没有提到servlet合适销毁,不过不难想象,本质作为一个java对象,在没有引用后应该会被垃圾收集器销毁,仅是猜想,没有验证。