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

1、首先写个 listener

 public class TestServletContextListener implements ServletContextListener
{ @Override
public void contextDestroyed(ServletContextEvent e)
{
System.out.println("--event-- context destoryed..");
e.getServletContext().log("ssseeevvv");
System.out.println(e.getServletContext().getAttribute("count")); // System.out.println(ActionContext.getContext().getApplication().get("count")); //获取不到 ActionContext
} @Override
public void contextInitialized(ServletContextEvent evt)
{
System.out.println("--event-- context initialized..");
ServletContext ctx = evt.getServletContext(); if(null == ctx.getAttribute("count"))
{
22        ctx.setAttribute("count",0); //为了简单起见,我就数数了
//ctx.setAttribute("count", new HashMap<String,Set<String>>());
}
} }

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

 public class TestInterceptor extends MethodFilterInterceptor
{
private static final long serialVersionUID = 1L; @Override
protected String doIntercept(ActionInvocation invocation) throws Exception
{
System.out.println("-m- Enter into TestInterceptor...");
countActionRequestNumber(); invocation.invoke(); //一定要有这一句,不然请求走到这个拦截器之后就断了
return null;
} private void countActionRequestNumber()
{
//方式二: Spring 的listener是从ServletContext中获取的 getInitParameter
ServletContext servletContext = ServletActionContext.getServletContext();
String parameter = servletContext.getInitParameter("test"); if(Boolean.valueOf(parameter))
{
int count = (int)servletContext.getAttribute("count");
servletContext.setAttribute("count", ++count);
}
}
}

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

   <context-param>
<param-name>test</param-name>
<param-value>true</param-value>
</context-param> <listener>
<listener-class>test.listener.TestServletContextListener</listener-class>
</listener>

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

   <package name="one" extends="struts-default">

         <interceptors>
<interceptor name="test" class="test.interceptor.TestInterceptor"></interceptor>
<interceptor-stack name="selfDefaultIntcptorStack">
<interceptor-ref name="test"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <default-interceptor-ref name="selfDefaultIntcptorStack"></default-interceptor-ref> <action name="test1" class="test.action.TestAction" method="test1">
</action>
<action name="test2" class="test.action.TestAction" method="test2">
</action> </package>

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

listener 监听 tomcat 容器的初始化和销毁的更多相关文章

  1. 监听tomcat服务器启动/关闭并从配置文件中读取参数进行初始化

    监听tomcat服务器启动/关闭很简单(2步): 1. 建立一个类实现ServletContextListener接口,重写其中的方法(contextDestroyed和contextInitiali ...

  2. 监听Web容器启动与关闭

    在Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 要监听web ...

  3. javaWeb学习之Listener监听

    ] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  listener  filt ...

  4. java多个listener监听

    java 多个listener 监听方法 在class 名称上一行添加@Listeners 括号中用逗号隔开 @Listeners({com.example.MyListener.class,com. ...

  5. Listener 监听Session内的对象

    Listener用于监控Session内的对象,分别是HttpSessionBindingListener与HttpSessionActivationListener.它们的触发时机分别为: Http ...

  6. ServletContextListener使用详解(监听Tomcat启动、关闭)

    在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 当Serv ...

  7. Listener 监听对象的创建和销毁

    HttpSessionListener.ServletContextListener.ServletRequestListener分别用于控制Session.context.request的创建和销毁 ...

  8. Android Listener 监听的几种写法

    Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用 ...

  9. 怎样绕过oracle listener 监听的password设置

     怎样绕过oracle 监听的password设置: 1.找到监听进程pid ,并将它kill 掉 ps -ef|grep tns [oracle@lixora admin]$ ps -ef|gr ...

随机推荐

  1. 洛谷P1379 八数码难题

    传送门 1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了 2.朴素bfs,判重就用二分找hash:如果发现当前状态=要求状态,输出步数结束程序 上代码 # ...

  2. Python字符串的相关操作

    1.大小写转换 判断字符串 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.islower() #所有字 ...

  3. C/C++中的内存对齐问题和pragma pack命令详解

    这个内存对齐问题,居然影响到了sizeof(struct)的结果值.突然想到了之前写的一个API库里,有个API是向后台服务程序发送socket请求.其中的socket数据包是一个结构体.在发送soc ...

  4. Redis 中可以存储的五种基本类型

    具体介绍 数字还是字符? String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M --- Hash(字典) 键值对集合,即编程语言中的Map类型 ...

  5. Jenkins-权限管理

    一.要对用户进行管理首先下载一个权限管理插件(系统管理>>>插件管理) Role-based Authorization Strategy 系统管理   >>>全局 ...

  6. 加密传输:每位数字+6,然后用除以9的余数代替该数字, 在把第一位和第四位交换,第二位和第三位交换,例如3276->3840

    /** * @author:(LiberHome) * @date:Created in 2019/3/6 10:00 * @description: * @version:$ */ /*今日目标:5 ...

  7. c语言的二进制表示的是什么码

    int -1 的二进制是 1111 1111 1111 1111 1111 1111 1111 1111 int -2 的二进制是 1111 1111 1111 1111 1111 1111 1111 ...

  8. bootstrap-treeview分级展示列表树的实现

    html页面: 要引用 "/webapp/common/css/bootstrap-treeview.css" "/webapp/common/js/bootstrap- ...

  9. Python 学习笔记6 变量-元组

    我们在上一篇中了解了变量list(列表), 今天我们来介绍下元组.元组是由括号和逗号,组织起来的一个元素的集合.和list不同的是,它其中的元素是不能被修改的,和其他语言中的常量相类似. 需要注意的是 ...

  10. 对SDE中空要素类插入要素,完成后显示的图层特别小

    原因是缺少图层Extent或者Extent发生变化,插入完成后需要对图层的Extent进行更新. 调用IFeatureClassManage. UpdateExtent更新范围 参考链接: https ...