现在向大家介绍一下如果创建自己的拦截器并把它应用于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());
- }
- }
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动作后会得到什么样的结果。
在这个例子中,将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>
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;
- }
- }
当页面的请求的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
- ................
这样,一个简单的日志记录拦截器就实现了。