📜  Struts 2 ActionInvocation教程(1)

📅  最后修改于: 2023-12-03 14:47:44.204000             🧑  作者: Mango

Struts 2 ActionInvocation教程

简介

ActionInvocation是Struts2框架中的一个核心组件,用于执行Action请求并处理拦截器链。在这个教程中,我们将深入了解ActionInvocation如何在Struts2中工作,以及如何使用它来扩展框架以满足我们的特定需求。

Struts2的Action执行过程

在了解ActionInvocation之前,我们需要先了解一下Struts2中Action的执行过程。下面是简单的执行流程:

  1. 浏览器向服务器发起请求。
  2. Struts2过滤器捕获请求,并将其传递给ActionMapper。
  3. ActionMapper根据请求的URL找到对应的Action。
  4. Struts2容器创建Action实例,并执行Action的execute方法。
  5. 执行Action时,ActionInvocation拦截器链被触发。
  6. 所有拦截器被执行后,Action的execute方法被调用。
  7. Action方法执行完成后,结果被返回到客户端。
ActionInvocation的作用

ActionInvocation在Struts2中的作用非常重要。当一个Action被调用时,ActionInvocation负责执行这个Action,并在执行前后调用Action拦截器链。

以下是ActionInvocation的工作原理:

  1. Struts2容器创建ActionInvocation实例。
  2. 使用当前请求中的InterceptorStack集合和策略来创建拦截器链。
  3. 对于新的ActionInvocation实例,容器将在拦截器链的开始处调用初始化拦截器。初始化拦截器使用Interceptor拦截器的init方法来处理特定任务。
  4. 当ActionInvocation调用invoke方法时,容器将依次调用所有拦截器。
  5. 当容器执行完所有拦截器后,最终的Action对象将被调用。
  6. 执行Action对象的方法后,容器会依次逆序调用所有的拦截器的destroy方法来处理特定任务。
使用ActionInvocation扩展Struts2框架

由于ActionInvocation的核心作用是将拦截器与Action关联在一起,因此我们可以使用ActionInvocation尝试扩展Struts2框架以满足我们的特定需求。

例如,如果我们想要更好地控制Action执行前的拦截器,我们可以使用ActionInvocation的invoke方法来选择性地调用这些拦截器。

以下代码片段将演示如何使用ActionInvocation来实现这个功能:

public class CustomInvocation extends ActionInvocation {
    // 可以被调用的拦截器名称
    private List<String> invokeInterceptors;

    public CustomInvocation(
        ActionProxy proxy,
        Map<String, Object> contextMap,
        boolean pushAction) throws Exception {
        super(proxy, contextMap, pushAction);
        invokeInterceptors = new ArrayList<String>();
    }

    // 将需要被调用的拦截器名称添加到列表中
    public void addInvokeInterceptor(String interceptorName) {
        if (!invokeInterceptors.contains(interceptorName)) {
            invokeInterceptors.add(interceptorName);
        }
    }

    // 重载invoke方法,只调用列表中的拦截器
    public String invoke() throws Exception {
        List<Interceptor> interceptors = getInterceptors();

        for (Interceptor interceptor : interceptors) {
            if (invokeInterceptors.contains(interceptor.getClass().getSimpleName())) {
                interceptor.intercept(this);
            }
        }

        return null;
     }
}

在这个示例中,我们重载了ActionInvocation中的invoke方法,并添加了一个列表,其中包含我们需要在Action调用前调用的拦截器名称。

在执行Action时,CustomInvocation类将只调用这些特定的拦截器,而忽略所有其他拦截器。这使得我们能够更好地控制拦截器的调用顺序,并更有效地处理我们的应用程序需求。

总结

在这个教程中,我们深入研究了ActionInvocation在Struts2中的作用,并了解了它如何处理Action请求和拦截器链。

我们还演示了如何使用ActionInvocation来扩展框架以满足我们的特定需求,使我们更好地控制拦截器的执行顺序和方法调用。