现在向大家介绍一下如果创建自己的拦截器并把它应用于Struts的动作。为了使用拦截器,需要做下面的工作。
1,创建一个日志拦截器
Java代码
1. /**
2. * 一个简单的日志记录拦截器
3. */
4. package cn.dip.struts.filter;
5.
6. import java.lang.reflect.Method;
7.
8. import org.springframework.aop.MethodBeforeAdvice;
9.
10. public class LoggingInterceptor implements MethodBeforeAdvice {
11.
12. public void before(Method method, Object[] args, Object target)
13. throws Throwable {
14. System.out.println("Logging before!");
15. System.out.println("method.getName():"+method.getName());
16. System.out.println("method.toString():"+method.toString());
17. System.out.println("args.length:"+args.length);
18. System.out.println("args[0].getClass().getName():"+args[0].getClass().getName());
19. System.out.println("target.getClass().getName():"+target.getClass().getName());
20. }
21.
22. }
2,注册日志拦截器
在Spring的配置文件中添加下面的代码
Java代码
1. <!--注册Struts的动作-->
2. <bean name="/register" class="cn.dip.struts.action.UserAction" scope="prototype">
3. <property name="userManager" ref="userManager"/>
4. </bean>
5. <bean name="/admin" class="cn.dip.struts.action.AdminAction" scope="prototype">
6. <property name="userManager" ref="userManager"/>
7. </bean>
8.
9. <!-- 注册了这个拦截器(1) -->
10. <bean name="logger"
11. class="cn.dip.struts.filter.LoggingInterceptor"/>
12. <!-- 创建了一个 bean 名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。 -->
13. <bean name="loggingAutoProxy"
14. class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
15. <property name="beanNames">
16. <!-- 将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作,则只需要在 "beanNames" 下面创建附加的 <value> 标记。 -->
17. <list>
18. <value>/register</value>
19. <value>/admin</value>
20. </list>
21. </property>
22. <property name="interceptorNames">
23. <!-- 当拦截发生时,执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于"beanNames"。 -->
24. <list>
25. <value>logger</value>
26. </list>
27. </property>
28. </bean>
到这里,日志记录拦截器的准备工作都已经做好了,接下来看执行了Struts动作后会得到什么样的结果。
在这个例子中,将Struts动作管理委托给Spring,通过在 struts-config
动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。
struts-config.xml
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
3.
4. <struts-config>
5. <form-beans >
6. <form-bean name="userForm" type="cn.dip.struts.form.UserForm" />
7.
8. </form-beans>
9.
10. <global-exceptions />
11. <global-forwards />
12. <action-mappings >
13. <action
14. attribute="userForm"
15. input="register.jsp"
16. name="userForm"
17. path="/register"
18. scope="request"
19. parameter="method"
20. type="org.springframework.web.struts.DelegatingActionProxy">
21. <forward name="error" path="/register.jsp" />
22. <forward name="success" path="/success.jsp" />
23. </action>
24.
25.
26. </action-mappings>
27.
28. <message-resources parameter="cn.dip.struts.ApplicationResources" />
29.
30. </struts-config>
UserAction的代码如下
Java代码
1. package cn.dip.struts.action;
2.
3. import javax.servlet.http.HttpServletRequest;
4. import javax.servlet.http.HttpServletResponse;
5.
6. import org.apache.struts.action.ActionForm;
7. import org.apache.struts.action.ActionForward;
8. import org.apache.struts.action.ActionMapping;
9. import org.apache.struts.actions.DispatchAction;
10.
11. import cn.dip.model.User;
12. import cn.dip.service.impl.UserManager;
13. import cn.dip.struts.form.UserForm;
14. import cn.dip.utils.DateUtil;
15.
16.
17. public class UserAction extends DispatchAction {
18. /**
19. * Method execute
20. * @param mapping
21. * @param form
22. * @param request
23. * @param response
24. * @return ActionForward
25. */
26. private UserManager userManager;
27. public ActionForward register(ActionMapping mapping, ActionForm form,
28. HttpServletRequest request, HttpServletResponse response) {
29. System.out.println("................");
30. UserForm userForm = (UserForm) form;
31. User user = new User();
32. try {
33. org.apache.commons.beanutils.BeanUtils.copyProperties(user, userForm);
34. } catch (Exception e) {
35. e.printStackTrace();
36. }
37. userManager.save(user);
38. return mapping.findForward("success");
39. }
40.
41. /**
42. * @param userManager the userManager to set
43. */
44. public void setUserManager(UserManager userManager) {
45. this.userManager = userManager;
46. }
47.
48. }
当页面的请求的URL为http://localhost:8080/onlinexam/register.do?method=register时, 将会执行UserAction中的register的方法。在register方法执行之前,定义的拦截器拦截到Struts的动作,执行before方 法。
具体的输出结果如下
Java代码
1. Logging before!
2. method.getName():execute
3. 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
4. args.length:4
5. args[0].getClass().getName():org.apache.struts.action.ActionMapping
6. target.getClass().getName():cn.dip.struts.action.UserAction
7. ................
这样,一个简单的日志记录拦截器就实现了。