启天论坛软件硬件技术Java技术 → spring的AOP拦截器应用于Struts动作


  共有253人关注过本帖树形打印

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

帅哥,在线噢!
junsan
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 总掌门
等级:管理员 帖子:11764 积分:7955 威望:757 精华:24 注册:2005-7-14 15:13:00
spring的AOP拦截器应用于Struts动作  发帖心情 Post By:2008-10-28 14:07:00



作者: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  
................ 

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


 



主页:http://www.rsky.com.cn

培训论坛:http://www.javastar.org

Blog:http://blog.csdn.net/junnef

技术交流QQ:334620162

培训咨询QQ:66883074

合租咨询QQ:631066985

MSN:junsanjin@hotmail.com

Emial:junsanjin@263.net

传真:(010)950507转747393
启天合组-专业合租空间提供商 支持(0中立(0反对(0回到顶部