原文: https://howtodoinjava.com/struts2/struts-2-custom-interceptor-with-interceptorref-example/

在以前的帖子中,我们了解了 helloworld 应用设置 Struts2 应用的结果路径。 现在,在这篇文章中,我将举一个使用注解的自定义或用户定义的拦截器配置示例。

拦截器是一个类,其每次访问已配置的服务器资源时都会调用其预定义方法。 这可以在资源访问之前或之后访问。 请注意,此处的资源访问也意味着 HTTP 请求处理。

  1. Steps summary:
  2. 1) Create custom interceptor class which implements com.opensymphony.xwork2.interceptor.Interceptor
  3. 2) Implement overridden methods
  4. 3) Give definition in struts.xml file
  5. 4) Apply on any Action class

重要:请注意,Struts2 随附了许多现成的拦截器实现,因此请确保您确实需要创建自己的拦截器,或者有什么适合您的。

1)& 2)创建自定义拦截器类并实现覆盖的方法

以下是自定义拦截器的示例代码,以及所有替代方法的实现。 请随时以适当的方法添加应用逻辑。

  1. package com.howtodoinjava.struts2.example.web;
  2. import com.opensymphony.xwork2.ActionInvocation;
  3. import com.opensymphony.xwork2.interceptor.Interceptor;
  4. public class DemoCustomInterceptor implements Interceptor
  5. {
  6. private static final long serialVersionUID = 1L;
  7. @Override
  8. public void destroy() {
  9. System.out.println("DemoCustomInterceptor destroy() is called...");
  10. }
  11. @Override
  12. public void init() {
  13. System.out.println("DemoCustomInterceptor init() is called...");
  14. }
  15. @Override
  16. public String intercept(ActionInvocation invocation) throws Exception
  17. {
  18. System.out.println("DemoCustomInterceptor intercept() is called...");
  19. System.out.println(invocation.getAction().getClass().getName());
  20. return invocation.invoke();
  21. }
  22. }

3)在struts.xml文件中给出定义

这是非常重要的一步,因为在这里您可以在 struts 上下文和运行时中注册拦截器类。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <package name="default" namespace="/" extends="struts-default">
  7. <interceptors>
  8. <interceptor name="demoCustomInterceptor" class="com.howtodoinjava.struts2.example.web.DemoCustomInterceptor" />
  9. <interceptor-stack name="customStack">
  10. <interceptor-ref name="demoCustomInterceptor"/>
  11. <interceptor-ref name="defaultStack" />
  12. </interceptor-stack>
  13. </interceptors>
  14. </package>
  15. <constant name="struts.convention.result.path" value="/WEB-INF/jsp/" />
  16. <constant name="struts.devMode" value="true" />
  17. <constant name="struts.action.extension" value="action," />
  18. <constant name="struts.custom.i18n.resources" value="test" />
  19. <constant name="struts.convention.default.parent.package" value="default"/>
  20. </struts>

4)应用任何动作类

我在一个这样的TestAction类中应用了上面的拦截器。

  1. package com.howtodoinjava.struts2.example.web;
  2. import java.util.Date;
  3. import org.apache.struts2.convention.annotation.Action;
  4. import org.apache.struts2.convention.annotation.Actions;
  5. import org.apache.struts2.convention.annotation.InterceptorRef;
  6. import org.apache.struts2.convention.annotation.Result;
  7. import org.apache.struts2.convention.annotation.Results;
  8. import com.opensymphony.xwork2.ActionSupport;
  9. @InterceptorRef(value="customStack")
  10. @Results({
  11. @Result(name="success", location="success.jsp"),
  12. @Result(name="input", location="index.jsp")
  13. })
  14. public class TestAction extends ActionSupport
  15. {
  16. private static final long serialVersionUID = 1L;
  17. private String name;
  18. private Date nowDate;
  19. @Override
  20. public void validate(){
  21. if (name==null || name.length()==0)
  22. addActionError(getText("error.enter.message"));
  23. }
  24. @Actions({
  25. @Action("/"),
  26. @Action("/test")
  27. })
  28. @Override
  29. public String execute() throws Exception {
  30. nowDate = new Date();
  31. return ActionSupport.SUCCESS;
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public Date getNowDate() {
  40. return nowDate;
  41. }
  42. }

请注意,我已经使用@InterceptorRef(value="customStack")定义应用了拦截器。 它可以帮助您一次性应用多个拦截器。 如果仅只需要特定的拦截器,请使用其名称,如下所示:@InterceptorRef(value="demoCustomInterceptor")

测试应用

当我运行上面的应用时。 我观察到服务器在控制台中的日志如下:

  1. INFO: Loading global messages from [test]
  2. DemoCustomInterceptor init() is called...
  3. //some logs
  4. INFO: Server startup in 1146 ms
  5. DemoCustomInterceptor intercept() is called...
  6. com.howtodoinjava.struts2.example.web.TestAction

请点击下面的链接下载该项目的源代码。

祝您学习愉快!