Struts2自带的logger拦截器只是打印出了Action所对应的URL以及执行的方法名称,这对实际开发来说是肯定不够的。实际开发中为了调试方便,要记录的信息比较多,通常需要把这次请求相关的几乎所有信息都打印出来,比如:

  • 要访问哪个Action类
  • 要访问这个Action类的哪个方法
  • 打印出这次请求中所有的request中的parameter参数
  • 这次请求最后跳转到哪个页面。

  如果我们现在就要在拦截器中实现这样的功能,该怎么实现呢?

  1)ActionInvocation接口

  在实现拦截器的功能的时候,需要使用ActionInvocation接口,这个接口有很多的功能,这里并不打算全部讲到,只描述一下接下来我们要用到的功能,更多的功能请参见Struts2的API文档。

  • getAction方法:返回这次请求准备执行的Action对象。
  • getProxy方法:返回这次请求的ActionProxy对象,可以在这个对象上获得要运行Action的哪个方法。
  • getInvocationContext方法:返回这个Action执行的上下文(ActionContext),可以在这个上下文对象中获取到大量的数据,比如请求的parameter值、session的值等等。
    在ActionContext中取到的parameter值是一个Map<String,Object>,其中以String为key,以String[]为value。这个Map中记录了所有的request参数。
  • getResult方法:返回Result运行之后代表结果的Result对象。

  2)具体的LoggerInterceptor,示例代码如下:

package cn.javass.hello.struts2impl.action;

import java.util.Map;
import org.apache.struts2.dispatcher.ServletDispatcherResult;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.interceptor.Interceptor; public class LoggerInterceptor implements Interceptor{
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("=================begin=================");
//找到运行的Action对象,并打印其类名
System.out.println("Action:"+invocation.getAction().getClass().getName());
//找到运行的ActionProxy对象,并打印其要运行的方法名
System.out.println("Method:"+invocation.getProxy().getMethod());
//找到这次请求的request中的parameter参数,并打印
Map<String, Object> params = invocation.getInvocationContext().getParameters();
for (String key:params.keySet()){
Object obj = params.get(key); if(obj instanceof String[]){
String[] arr = (String[]) obj;
System.out.println("Param:"+key);
for (String value:arr){
System.out.println(value);
}
}
} //运行后续的拦截器、Action和Result
String resultCode = invocation.invoke(); //在Action和Result运行之后,得到Result对象
//并且可以强制转换成ServletDispatcherResult,打印其下一个JSP的位置
Result rresult = invocation.getResult();
if (rresult instanceof ServletDispatcherResult){
ServletDispatcherResult result = (ServletDispatcherResult) rresult;
System.out.println("JSP:"+result.getLastFinalLocation());
} System.out.println("=================end=================");
return resultCode;
}
}

  3)在struts.xml中配置和使用这个拦截器,示例如下:

<package name="helloworld"  extends="struts-default">
<interceptors>
<interceptor name="testInteceptor" class="cn.javass.hello.struts2impl.action.MyInterceptor"/>
<interceptor name="myLogger" class="cn.javass.hello.struts2impl.action.LoggerInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="myLogger"/>
<interceptor-ref name="testInteceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/> <global-results>
<result name="math-exception">/${folder}/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="math-exception" exception="java.lang.ArithmeticException"/>
<exception-mapping result="math-exception" exception="java.lang.Exception"/>
</global-exception-mappings> <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">
<result name="toWelcome">/${folder}/welcome.jsp</result>
<result name="input">/${folder}/login.jsp</result>
</action>
</package>

  4)测试一下,运行登录页面,填入用户名和密码,点击提交按钮。然后查看后台的输出,示例如下:

=================begin=================
Action:cn.javass.hello.struts2impl.action.HelloWorldAction
Method:execute
Param:submitFlag
login
Param:account
212
Param:password
222222222222
在acton执行之前
用户输入的参数为===account=212,password=222222222222,submitFlag=login
在Result运行之后
JSP:/s2impl/welcome.jsp
=================end=================
2014-5-18 21:37:37 com.opensymphony.xwork2.interceptor.TimerInterceptor info
信息: Executed action [//helloworldAction!execute] took 7 ms.

  参考资料:http://www.iteye.com/topic/1124526

【struts2】自定义更强大的logger拦截器的更多相关文章

  1. Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】

    什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...

  2. struts2.1.6教程五、拦截器

    在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传 ...

  3. struts2框架学习笔记6:拦截器

    拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...

  4. Struts2.0 封装请求数据和拦截器介绍

    1. Struts2 框架中使用 Servlet 的 API 来操作数据 1.1 完全解耦合的方式 Struts2 框架中提供了一个 ActionContext 类,该类中提供了一些方法: stati ...

  5. 开源基于docker的任务调度器pipeline,比`quartzs` 更强大的分布式任务调度器

    pipeline 分布式任务调度器 目标: 基于docker的布式任务调度器, 比quartzs,xxl-job 更强大的分布式任务调度器. 可以将要执行的任务打包为docker镜像,或者选择已有镜像 ...

  6. Struts2学习笔记四:深入拦截器

    一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...

  7. struts2学习笔记(六)—— 拦截器

    一.拦截器概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作.拦截器是AOP的一种实现策略. 在We ...

  8. Shiro 自定义登陆、授权、拦截器

    Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...

  9. Struts2的运行流程以及关键拦截器介绍

    Struts2的运行流程 1.ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方 ...

随机推荐

  1. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

    转自:http://www.jb51.net/article/100111.htm 首先我们需要安装好Nginx.jdk.Tomcat,安装方法已经在 上一篇 说过了,本篇不再赘述. 下来看一下我们的 ...

  2. linux ifconfig -a

    export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/i686-pc ...

  3. SWIFT学习笔记05

    1.Swift 无需写break,所以不会发生这样的贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answe ...

  4. Selenium2(WebDriver)总结(一)---启动浏览器、设置profile&加载插件

    本文主要记录下在使用selenium2/webdriver时启动各种浏览器的方法.以及如何加载插件.定制浏览器信息(设置profile)等 环境搭建可参考我的另一篇文章:http://www.cnbl ...

  5. 2721: [Violet 5]樱花|约数个数

    先跪一发题目背景QAQ 显然x,y>n!,然后能够设y=n!+d 原式子能够化简成 x=n!2d+n! 那么解的个数也就是n!的因子个数,然后线性筛随便搞一搞 #include<cstdi ...

  6. GDB 反向调试(Reverse Debugging)

    这个挺有意思 http://blog.csdn.net/CherylNatsu/article/details/6436570 使用调试器时最常用的功能就是step, next, continue,这 ...

  7. Oracle Data Integrator 12c-第一个映射

    一.创建"项目" 设计器->项目,点击插入项目图标, 在项目对话框的"定义"标签下输入项目名称如ODI_Exercise ,保存 二.导入知识模块 项目→ ...

  8. Java之创建对象>5.Avoid creating unnecessary objects

    String s = new String("stringette"); // DON'T DO THIS! The improved version is simply the ...

  9. 转:Ogre源码分析之Root类、Facade模式

    Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...

  10. Region使用全解

    代码地址如下:http://www.demodashi.com/demo/14799.html 前言 Region,即为区域,它表示的是canvas图层上的某一块封闭的区域.很多时候,我们会利用Reg ...