`

拦截器中invocation.invoke()的解释

 
阅读更多
  1. public abstract class AroundInterceptor extends AbstractInterceptor {  
  2.       
  3.     /* (non-Javadoc) 
  4.      * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 
  5.      */  
  6.     @Override  
  7.     public String intercept(ActionInvocation invocation) throws Exception {  
  8.         String result = null;  
  9.   
  10.         before(invocation);  
  11.         // 调用下一个拦截器,如果拦截器不存在,则执行Action  
  12.         result = invocation.invoke();  
  13.         after(invocation, result);  
  14.   
  15.         return result;  
  16.     }  
  17.       
  18.     public abstract void before(ActionInvocation invocation) throws Exception;  
  19.   
  20.     public abstract void after(ActionInvocation invocation, String resultCode) throws Exception;  
  21.   
  22. }  

 

 

我在这里需要指出的是一个很重要的方法invocation.invoke()。这是ActionInvocation中的方法,而ActionInvocation是Action调度者,所以这个方法具备以下2层含义: 

1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。 

2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。 

所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论: 

1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。 

2. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。 

由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP。 

分享到:
评论

相关推荐

    自定义拦截器

    通常,调用`invocation.invoke()`会继续执行下一个拦截器或Action。 通过以上步骤,我们便可以创建和使用自定义拦截器了。在实际项目中,可以根据需要组合多个拦截器,以达到灵活、高效地处理请求的目的。此外,还...

    运用struts2技术的拦截器实现的页面检测和用户注册

    在Struts2中,拦截器扮演着至关重要的角色,它们允许我们在动作执行前后插入自定义逻辑,提升代码的可复用性和模块化。本篇文章将深入探讨如何使用Struts2的拦截器技术来实现页面检测和用户注册功能。 首先,我们...

    创建自己struts2拦截器

    这个接口只有一个方法`intercept(ActionInvocation invocation)`,在这个方法中我们可以编写拦截器的核心逻辑。 - 在`intercept`方法中,我们可以通过`invocation.getAction()`获取当前Action对象,通过`invocation...

    自定义拦截器的实现以及拦截器的详细配置

    在Java Web开发中,拦截器(Interceptor)是一个重要的概念,特别是在使用MVC框架如Struts2时。拦截器可以理解为一种预处理和后处理机制,它在请求到达控制器之前和离开控制器之后进行操作,例如日志记录、权限检查...

    Struts2 拦截器详细配置过程

    - 如果有多个拦截器,`invocation.invoke()`会顺序执行下一个拦截器,直到最后调用Action本身。 - 执行完成后,结果会按照Action配置的Result返回给视图。 通过上述配置,开发者可以灵活地定义和管理拦截器,以...

    struts2自定义拦截器.pdf

    `invocation.invoke()`是必须调用的,它会继续执行后续的拦截器以及Action本身。以下是一个简单的例子: ```java import com.opensymphony.xwork2.ActionInvocation; import org.apache.struts2.interceptor....

    信息系统软件设计:第3章 Struts2.0-拦截器.ppt

    【信息系统软件设计】中的【Struts2.0-拦截器】是软件开发中非常关键的概念,特别是对于基于Java的企业级Web应用。Struts2作为一款流行的MVC框架,它的核心特性之一就是拦截器(Interceptor)。拦截器允许在Action...

    struts2拦截器应用小例子

    当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...

    拦截器,实用型

    总结起来,登录检查拦截器和Logger拦截器都是Struts2框架中非常实用且重要的组成部分。登录检查确保了应用的安全性,而Logger拦截器则提高了应用的可维护性和可调试性。正确地实现和配置这两种拦截器,能够显著提升...

    Struts2.0拦截器总结

    其中`invocation.invoke()`调用下一个拦截器或最终的Action。 #### 四、拦截器的执行过程 1. **初始化阶段**:当应用启动时,框架会加载拦截器并调用其`init()`方法。 2. **请求处理阶段**: - 用户发起请求...

    struts2 日志拦截器

    日志拦截器在Struts2中扮演着至关重要的角色,它允许开发者记录和控制应用程序中的各种操作,以便于调试、性能分析和日志记录。在本篇文章中,我们将深入探讨Struts2的日志拦截器,以及如何使用`LoginfoInterceptor....

    Struts拦截器

    Struts拦截器是Java Web开发中的一个重要概念,尤其在基于MVC框架的Struts2中,它是实现业务逻辑控制和视图分离的关键组件。拦截器是AOP(面向切面编程)思想的一种体现,用于在动作执行前后进行额外的操作,如日志...

    Struts2(4)拦截器与验证框架

    6. **反向执行拦截器**:执行拦截器栈中剩余的拦截器,直到所有拦截器执行完毕。 7. **响应返回**:最终响应返回给客户端。 通过以上步骤,可以清晰地了解Struts2拦截器及其栈的配置与工作原理,这对于开发基于...

    struts2.X 拦截器源码

    这些拦截器按照它们在配置文件中声明的顺序执行,每个拦截器都可以决定是否允许请求继续传递到下一个拦截器或直接返回结果。如果所有拦截器都允许通过,请求最终会到达Action,执行相应的业务逻辑,然后返回一个结果...

    浅谈Struts2拦截器的原理与实现.docx

    Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加或删除功能。拦截器是可插拔的,可以在请求到达Action之前或之后执行...

    struts2的自定义拦截器例子

    在这个"struts2的自定义拦截器例子"中,我们将深入探讨如何创建和使用自定义拦截器。 首先,拦截器的本质是Java的面向切面编程(AOP)思想在Struts2中的体现。它们允许开发者在动作执行前后插入自定义的逻辑,例如...

    Struts2拦截器及其用法详细说明

    - XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml ...

    Struts2 拦截器 Interceptor

    配置拦截器**:在`struts.xml`中添加新的拦截器和拦截器栈。 ```xml <interceptor name="anotherInterceptor" class="com.example.AnotherInterceptor" /> <action name="anotherTest" class="com....

    struts2拦截器实现拦截不文明字迹

    我们需要在struts.xml配置文件中声明这个拦截器,并将其加入到默认的拦截器栈或者特定Action的拦截器配置中。例如: ```xml <!-- 添加自定义拦截器 --> <interceptor name="profanityFilter" class="com....

Global site tag (gtag.js) - Google Analytics