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 ................

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

原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100571.html