zoukankan      html  css  js  c++  java
  • spring AOP拦截器的配置使用

    通 过将 Struts 动作委托给 Spring 框架而整合 Struts 和 Spring 的一个主要的优点是:您可以将 Spring 的 AOP 拦截器应用于您的 Struts 动作。通过将 Spring 拦截器应用于 Struts 动作,您可以用最小的代价处理横切关注点。

           现在向大家介绍一下如果创建自己的拦截器并把它应用于Struts的动作。为了使用拦截器,需要做下面的工作。

           1,创建一个日志拦截器

    Java代码
    1. /** 
    2.  * 一个简单的日志记录拦截器 
    3.  */  
    4. package cn.dip.struts.filter;  
    5.   
    6. import java.lang.reflect.Method;  
    7.   
    8. import org.springframework.aop.MethodBeforeAdvice;  
    9.   
    10. public class LoggingInterceptor implements MethodBeforeAdvice {  
    11.   
    12.     public void before(Method method, Object[] args, Object target)  
    13.             throws Throwable {  
    14.         System.out.println("Logging before!");  
    15.         System.out.println("method.getName():"+method.getName());  
    16.         System.out.println("method.toString():"+method.toString());  
    17.         System.out.println("args.length:"+args.length);  
    18.         System.out.println("args[0].getClass().getName():"+args[0].getClass().getName());  
    19.         System.out.println("target.getClass().getName():"+target.getClass().getName());  
    20.     }  
    21.   
    22. }  
    /** * 一个简单的日志记录拦截器 */ package cn.dip.struts.filter; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class LoggingInterceptor implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Logging before!"); System.out.println("method.getName():"+method.getName()); System.out.println("method.toString():"+method.toString()); System.out.println("args.length:"+args.length); System.out.println("args[0].getClass().getName():"+args[0].getClass().getName()); System.out.println("target.getClass().getName():"+target.getClass().getName()); } }

       2,注册日志拦截器

        在Spring的配置文件中添加下面的代码

    Java代码
    1. <!--注册Struts的动作-->  
    2. <bean name="/register" class="cn.dip.struts.action.UserAction" scope="prototype">  
    3.         <property name="userManager" ref="userManager"/>  
    4.     </bean>  
    5.     <bean name="/admin" class="cn.dip.struts.action.AdminAction" scope="prototype">  
    6.         <property name="userManager" ref="userManager"/>  
    7.     </bean>  
    8.       
    9.     <!-- 注册了这个拦截器(1) -->  
    10.   <bean name="logger"      
    11.     class="cn.dip.struts.filter.LoggingInterceptor"/>   
    12.   <!-- 创建了一个 bean 名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。 -->  
    13.   <bean name="loggingAutoProxy"   
    14.         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
    15.     <property name="beanNames">  
    16.             <!-- 将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作,则只需要在 "beanNames" 下面创建附加的 <value> 标记。 -->  
    17.           <list>  
    18.               <value>/register</value>  
    19.               <value>/admin</value>  
    20.           </list>  
    21.     </property>  
    22.     <property name="interceptorNames">  
    23.         <!-- 当拦截发生时,执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于"beanNames"。 -->  
    24.         <list>  
    25.           <value>logger</value>  
    26.         </list>  
    27.     </property>  
    28.    </bean>  
    <!--注册Struts的动作--> <bean name="/register" class="cn.dip.struts.action.UserAction" scope="prototype"> <property name="userManager" ref="userManager"/> </bean> <bean name="/admin" class="cn.dip.struts.action.AdminAction" scope="prototype"> <property name="userManager" ref="userManager"/> </bean> <!-- 注册了这个拦截器(1) --> <bean name="logger" class="cn.dip.struts.filter.LoggingInterceptor"/> <!-- 创建了一个 bean 名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。 --> <bean name="loggingAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <!-- 将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作,则只需要在 "beanNames" 下面创建附加的 <value> 标记。 --> <list> <value>/register</value> <value>/admin</value> </list> </property> <property name="interceptorNames"> <!-- 当拦截发生时,执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于"beanNames"。 --> <list> <value>logger</value> </list> </property> </bean>

        到这里,日志记录拦截器的准备工作都已经做好了,接下来看执行了Struts动作后会得到什么样的结果。

       在这个例子中,将Struts动作管理委托给Spring,通过在  struts-config   动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。

        struts-config.xml

    Java代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">  
    3.   
    4. <struts-config>  
    5.   <form-beans >  
    6.     <form-bean name="userForm" type="cn.dip.struts.form.UserForm" />  
    7.   
    8.   </form-beans>  
    9.   
    10.   <global-exceptions />  
    11.   <global-forwards />  
    12.   <action-mappings >  
    13.     <action  
    14.       attribute="userForm"  
    15.       input="register.jsp"  
    16.       name="userForm"  
    17.       path="/register"  
    18.       scope="request"  
    19.       parameter="method"  
    20.       type="org.springframework.web.struts.DelegatingActionProxy">  
    21.       <forward name="error" path="/register.jsp" />  
    22.       <forward name="success" path="/success.jsp" />  
    23.     </action>  
    24.       
    25.       
    26.   </action-mappings>  
    27.   
    28.   <message-resources parameter="cn.dip.struts.ApplicationResources" />  
    29.     
    30.   </struts-config>  
    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans > <form-bean name="userForm" type="cn.dip.struts.form.UserForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action attribute="userForm" input="register.jsp" name="userForm" path="/register" scope="request" parameter="method" type="org.springframework.web.struts.DelegatingActionProxy"> <forward name="error" path="/register.jsp" /> <forward name="success" path="/success.jsp" /> </action> </action-mappings> <message-resources parameter="cn.dip.struts.ApplicationResources" /> </struts-config>

      UserAction的代码如下

    Java代码
    1. package cn.dip.struts.action;  
    2.   
    3. import javax.servlet.http.HttpServletRequest;  
    4. import javax.servlet.http.HttpServletResponse;  
    5.   
    6. import org.apache.struts.action.ActionForm;  
    7. import org.apache.struts.action.ActionForward;  
    8. import org.apache.struts.action.ActionMapping;  
    9. import org.apache.struts.actions.DispatchAction;  
    10.   
    11. import cn.dip.model.User;  
    12. import cn.dip.service.impl.UserManager;  
    13. import cn.dip.struts.form.UserForm;  
    14. import cn.dip.utils.DateUtil;  
    15.   
    16.   
    17. public class UserAction extends DispatchAction {  
    18.     /**  
    19.      * Method execute 
    20.      * @param mapping 
    21.      * @param form 
    22.      * @param request 
    23.      * @param response 
    24.      * @return ActionForward 
    25.      */  
    26.     private UserManager userManager;  
    27.     public ActionForward register(ActionMapping mapping, ActionForm form,  
    28.             HttpServletRequest request, HttpServletResponse response) {  
    29.                System.out.println("................");  
    30.         UserForm userForm = (UserForm) form;  
    31.         User user = new User();  
    32.         try {  
    33.             org.apache.commons.beanutils.BeanUtils.copyProperties(user, userForm);  
    34.         } catch (Exception e) {  
    35.             e.printStackTrace();  
    36.         }  
    37.         userManager.save(user);  
    38.         return mapping.findForward("success");  
    39.     }  
    40.       
    41.     /** 
    42.      * @param userManager the userManager to set 
    43.      */  
    44.     public void setUserManager(UserManager userManager) {  
    45.         this.userManager = userManager;  
    46.     }  
    47.   
    48. }  
    package cn.dip.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import cn.dip.model.User; import cn.dip.service.impl.UserManager; import cn.dip.struts.form.UserForm; import cn.dip.utils.DateUtil; public class UserAction extends DispatchAction { /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ private UserManager userManager; public ActionForward register(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { System.out.println("................"); UserForm userForm = (UserForm) form; User user = new User(); try { org.apache.commons.beanutils.BeanUtils.copyProperties(user, userForm); } catch (Exception e) { e.printStackTrace(); } userManager.save(user); return mapping.findForward("success"); } /** * @param userManager the userManager to set */ public void setUserManager(UserManager userManager) { this.userManager = userManager; } }

       当页面的请求的URL为http://localhost:8080/onlinexam/register.do?method=register时, 将会执行UserAction中的register的方法。在register方法执行之前,定义的拦截器拦截到Struts的动作,执行before方 法。

    具体的输出结果如下

    Java代码
    1. Logging before!  
    2. method.getName():execute  
    3. method.toString():public org.apache.struts.action.ActionForward org.apache.struts.actions.DispatchAction.execute(org.apache.struts.action.ActionMapping,org.apache.struts.action.ActionForm,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception  
    4. args.length:4  
    5. args[0].getClass().getName():org.apache.struts.action.ActionMapping  
    6. target.getClass().getName():cn.dip.struts.action.UserAction  
    7. ................  
    Logging before! method.getName():execute method.toString():public org.apache.struts.action.ActionForward org.apache.struts.actions.DispatchAction.execute(org.apache.struts.action.ActionMapping,org.apache.struts.action.ActionForm,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception args.length:4 args[0].getClass().getName():org.apache.struts.action.ActionMapping target.getClass().getName():cn.dip.struts.action.UserAction ................

      这样,一个简单的日志记录拦截器就实现了。

  • 相关阅读:
    kali linux 2019.1 替换burpsuite pro 1.7.37
    java反序列化漏洞实战
    我是一个997程序员
    清晨小悟
    vue webpack配置Error
    USSD 杂记
    WingMoney APP逆向,实现自动话费充值
    保持空杯心态
    解决python在命令行中运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"
    【转】Mac find 去除 “Permission denied” 信息的方法
  • 原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100571.html
Copyright © 2011-2022 走看看