启天JAVA培训社区's Archiver

junsan 发表于 2008-10-28 14:07

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

作者:softkid

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

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

       1,创建一个日志拦截器

/**  
* 一个简单的日志记录拦截器  
*/  
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的配置文件中添加下面的代码

<!--注册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

<?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的代码如下

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方法。

具体的输出结果如下

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

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

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.