listener 监听 tomcat 容器的初始化和销毁


为了简单,就写个统计Action 请求数量的例子:

1、首先写个 listener

 1 public class TestServletContextListener implements ServletContextListener
 2 {
 3 
 4     @Override
 5     public void contextDestroyed(ServletContextEvent e)
 6     {
 7         System.out.println("--event--  context destoryed..");
 8         e.getServletContext().log("ssseeevvv");
 9         System.out.println(e.getServletContext().getAttribute("count"));
10         
11 //        System.out.println(ActionContext.getContext().getApplication().get("count")); //获取不到 ActionContext
12     }
13 
14     @Override
15     public void contextInitialized(ServletContextEvent evt)
16     {
17         System.out.println("--event--  context initialized..");
18         ServletContext ctx = evt.getServletContext();
19         
20         if(null == ctx.getAttribute("count"))
21         {
22        ctx.setAttribute("count",0); //为了简单起见,我就数数了
23 //ctx.setAttribute("count", new HashMap>()); 24 } 25 } 26 27 }

2、在拦截器中获取信息,保存在 ServletContext 的 count 对象里。

 1 public class TestInterceptor extends MethodFilterInterceptor
 2 {
 3     private static final long serialVersionUID = 1L;
 4 
 5     @Override
 6     protected String doIntercept(ActionInvocation invocation) throws Exception
 7     {
 8         System.out.println("-m- Enter into TestInterceptor...");
 9         countActionRequestNumber();
10         
11         invocation.invoke(); //一定要有这一句,不然请求走到这个拦截器之后就断了
12         return null;
13     }
14     
15     private void countActionRequestNumber()
16     {
17         //方式二: Spring 的listener是从ServletContext中获取的 getInitParameter 
18         ServletContext servletContext = ServletActionContext.getServletContext();
19         String parameter = servletContext.getInitParameter("test");
20         
21         if(Boolean.valueOf(parameter))
22         {
23             int count = (int)servletContext.getAttribute("count");
24             servletContext.setAttribute("count", ++count);
25         }
26     }
27 }

3、在 web.xml 中注册监听器

1   <context-param>
2         <param-name>testparam-name>
3         <param-value>trueparam-value>
4     context-param>
5     
6     <listener>
7         <listener-class>test.listener.TestServletContextListenerlistener-class>
8     listener>

4、在struts 文件中配置拦截器

 1   <package name="one" extends="struts-default">
 2         
 3         <interceptors>
 4             <interceptor name="test" class="test.interceptor.TestInterceptor">interceptor>
 5             <interceptor-stack name="selfDefaultIntcptorStack">
 6                 <interceptor-ref name="test">interceptor-ref>
 7                 <interceptor-ref name="defaultStack">interceptor-ref>
 8             interceptor-stack>
 9         interceptors>
10         
11         <default-interceptor-ref name="selfDefaultIntcptorStack">default-interceptor-ref>
12         
13         <action name="test1" class="test.action.TestAction" method="test1">
14         action>
15         <action name="test2" class="test.action.TestAction" method="test2">
16         action>
17         
18     package>

note: 如果是 eclipse 启动的 tomcat ,最好是使用右键 stopped 停止服务器,而不是直接点击红色按钮强制关闭。