zoukankan      html  css  js  c++  java
  • 【struts2】自定义更强大的logger拦截器

      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

  • 相关阅读:
    linux C程序中获取shell脚本输出(如获取system命令输出)
    Vue实现网页在线拍照和上传 幸福n
    c# thread数线程的创建多线程(一)
    C#开启异步 线程的四种方式(二)
    web学习网站
    C#中的set和get方法
    C# 多线程之Task任务(三)
    Taro3 扫描不同二维码参数不同,但是热启动之后参数不变
    Taro 弹窗阻止小程序滑动穿透(亲测有效) tabbar数据缓存不更新 入口场景值不同
    《Webpack+Babel入门与实例详解》出版了
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3735735.html
Copyright © 2011-2022 走看看