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

By | 10月27日
Advertisement

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

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

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

Similar Posts:

  • PHP提供了几个拦截器,用于在访问未定义的方法和属性时被调用

    PHP提供了几个拦截器,用于在访问未定义的方法和属性时被调用,如下所示: 1.__get($property) 功能:访问未定义的属性是被调用 2.__set($property, $value) 功能:给未定义的属性设置值时被调用 3.__isset($property) 功能:对未定义的属性调用isset()时被调用 4.__unset($property) 功能:对未定义的属性调用unset()时被调用 5.__call($method, $arg_array) 功能:调用未定义的方法时被

  • 登录、项目-Spring mvc Session拦截器-by小雨

    最近用使开发的过程中出现了一个小问题,顺便记录一下原因和方法--登录.项目- 未登录,不允许拜访项目文件夹内的面页,那如何断判否是登录呢? 下面向大家细详分析spring mvc Session拦截器的用使,本文以登录为例,未登录无限权拜访项目内面页,session为空时返回项目首页. 代码如下: package com.sundear.sundearemm.interceptor; import com.sundear.sundearemm.model.User; import java.ut

  • [转载] Spring MVC - 处理器拦截器

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 5.1.1.常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在

  • Spring MVC的拦截器

    1.定义自己的spring mvc拦截器需要实现HandlerInterceptor 接口或者继承HandlerInterceptorAdapter 2.boolean preHandle()方法在controller被调用之前调用: 3.void postHandle()方法在controller被调用之后调用,可在modelandview中加入数据,比如当前时间: 4.void afterCompletion()在呈现视图之后调用,可用于清理资源等: 5.当设置多个拦截器时,先按顺序调用pr

  • 验证码的生成------------------------spring mvc 通过拦截器使用kaptcha

    下载kaptcha-2.3.2.jar http://code.google.com/p/kaptcha/downloads/list 1.spring 配置文件 applicationContext.xml <bean id="jcaptchaFilter" class="com.*.filter.JCaptchaMemcachedFilter"> <property name="captchaParamterName" va

  • Spring MVC 使用拦截器优雅地实现权限验证功能

    在上一篇 SpringAOP 实现功能权限校验功能 中虽然用AOP通过抛异常,请求转发等勉强地实现了权限验证功能,但感觉不是那么完美,应该用拦截器来实现才是最佳的,因为拦截器就是用来拦截请求的,在请求层面进行权限验证是最好的时机. 假设下面的请求需要进行权限验证,在请求中通过参数params指定必须带有Helper.PARAM_FUNCTION_ID参数,这样拦截器通过判断是否带有该参数,如果带有则进行权限验证,否则不作处理. @RequestMapping(value = "/moduleAc

  • spring mvc inteceptor 拦截器实现计算controller 的执行时间

    什么是 spring inteceptor , SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的

  • spring中事务拦截器代理

    代理主要实现哪些功能?

  • 用Spring更好地处理Struts动作三种整合

    为什么 Spring 这么了不起? Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java™ 企业软件开发,并且提议很多企业难题都能够通过战略地使用 IOC 模式(也称作依赖注入)来解决.当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了 Spring 框架.简言之,Spring 是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起.每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,

  • Struts 动作整合到 Spring 框架中的三种窍门

    使用 Spring 的 ActionSupport 类整合 Structs 使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor 将 Struts Action 管理委托给 Spring 框架 装载应用程序环境 无论您使用哪种技术,都需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境.就像添加任何其他插件一样,简单地

Tags: