spring的AOP拦截器应用于Struts动作

通过将 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. }  

 

 

   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动作后会得到什么样的结果。

 

   在这个例子中,将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>  

 

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

 

   当页面的请求的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. ................  

 

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

 

 

  小弟是Spring  Struts的初学者,所以以上有什么遗漏和纰漏之处,还请大家多多指教。

基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性和分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力和稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算和蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值