前记:现在还处于自己在摸索javaweb的过程,学习着一些基础知识,希望能赶快走过这一阶段。
Servlet Listener:作用? 开发与部署?
最近在看shiro的web集成时有如下的部署
<context-param>
<param-name>shiroEnvironmentClass</param-name>
<param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value>
</context-param>
<context-param>
<param-name>shiroConfigLocations</param-name>
<param-value>classpath:shiro.ini</param-value>
</context-param>
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
所以趁着此处的使用系统学习一下servlet listener基础
之前写安卓代码的时候经常也会遇到listener,当某某事A发生的时候(比如点击事件发生),就触发某某事B的执行。
在开发web时,我们或许想要在web应用程序启动或关闭时执行一些任务(比如数据库连接的建立和释放),或想要监控Session的创建与销毁,再如希望在ServletContext、HttpSession以及ServletRequest对象中的属性发生改变时得到通知,这些都可以通过监听器listener实现。
Servlet API提供了8个监听器接口,用于监听ServletContext、HttpSession和ServletRequest对象的生命周期事件,以及这些对象的属性改变事件。
这里着重介绍两个:ServletContextListener和HttpSessionBindingListener
1.javax.servlet.ServletContextListener
contextInitialized(ServletContextEvent sce)是当web应用程序初始化进程正开始时,Web容器调用这个方法,该方法将在所有的过滤器和Servlet初始化之前被调用
contextDestroyed(ServletContextEvent sce)是当Servlet上下文将要被关闭时,Web容器调用这个方法。该方法在所有的Servlet和过滤器销毁后被调用。
其中的参数ServletContextEvent:
再比如Shiro框架中的org.apache.shiro.web.env.EnvironmentLoaderListener
package org.apache.shiro.web.env;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.shiro.web.env.EnvironmentLoader;
public class EnvironmentLoaderListener extends EnvironmentLoader implements ServletContextListener {
public EnvironmentLoaderListener() {
}
public void contextInitialized(ServletContextEvent sce) {
this.initEnvironment(sce.getServletContext());
}
public void contextDestroyed(ServletContextEvent sce) {
this.destroyEnvironment(sce.getServletContext());
}
}
其中EnvironmentLoader类中有InitEnvironment()方法会创建WebEnvironment,并自动绑定到ServletContext。在web程序初始化时,就会去创建WebEnvironment。