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

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



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

1,创建一个日志拦截器



Java代码
/**
* 一个简单的日志记录拦截器
*/
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());
}

}

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



Java代码
<!--注册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的动作-->
<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

Java代码
<?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>

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



Java代码
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;
}

}

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

具体的输出结果如下

Java代码
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
................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值