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

       通过将 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的初学者,所以以上有什么遗漏和纰漏之处,还请大家多多指教。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值