在struts的开发文档有一个图,从这个官方的picture,你也能大致的看出struts到底是怎么样执行的。
说明:一个请求(HttpServletRequest)到来,它会经过FilterDispatcher(这个原来的,现在已经的是StrutsPrepareAndExecuteFilter)。当HttpServletRequest到达FilterDispatcher的时候,FilterDispatcher会帮我们创建ActionPproxy,ActionProxy通过ConfigurationManager从struts.xml配置文件中读出来相应的配置信息。ActionProxy拥有一个AcionInvocation的实例,接下来,它会调用ActionInvocation的invoke方法,在invoke方法里面,它会先调用第一个interceptor1,然后再调用第二个interceptor2,再调用第三个interceptor3,最后再调用action,action会返回一个result,根据result找到相应的视图(jsp,FreeMarker等)。然后再经过interceptor3,interceptor2,interceptor1,FilterDispatcher将用户请求的信息反馈给用户。
下面我们就来模拟Struts2的拦截器
工程目录结构以及文件如下:
1.ActionInvocation.java里面有action的引用和很多interceptor
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ActionInvocation { protected Object action;// action的引用 protected Iterator<Interceptor> interceptors; protected String resultCode;// 保存action执行的result ActionInvocation() { action = new Action(); List<Interceptor> interceptorList = new ArrayList<Interceptor>(); interceptorList.add(new FirstInterceptor()); interceptorList.add(new SecondInterceptor()); interceptors = interceptorList.iterator(); } public String invoke() { if (interceptors.hasNext()) {// 是否还有下一个interceptor resultCode = this.interceptors.next().intercept( ActionInvocation.this); } else {// 说明所有的interceptor都调用完了,通过反射调用Action中的方法 resultCode = this.invokeActionOnly(); } return resultCode; } public String invokeActionOnly() { Action ac = (Action) action; return ac.execute(); } }
2.所有的拦截器都实现的interceptor接口
public interface Interceptor { public String intercept(ActionInvocation actionInvocation); }
3.生成2个拦截器FirstInterceptor,SecondInterceptor,都实现了Interceptor接口
FirstInterceptor
public class FirstInterceptor implements Interceptor{ @Override public String intercept(ActionInvocation invocation) { String result; System.out.println(1); result = invocation.invoke(); System.out.println(-1); return result; } }
SecondInterceptor
public class SecondInterceptor implements Interceptor{ @Override public String intercept(ActionInvocation invocation) { String result; System.out.println(2); result = invocation.invoke(); System.out.println(-2); return result; } }
3.编写Action
public class Action { public String execute(){ System.out.println("------execute----------"); return "success"; } }
4.编写测试类
public class Test { public static void main(String[] args) { new ActionInvocation().invoke(); } }
相关推荐
本文将深入探讨Struts2拦截器的工作原理及其应用。 首先,我们要理解什么是拦截器。在Struts2中,拦截器是基于AOP(面向切面编程)思想的类,它们可以拦截用户的请求,执行预定义的操作,如日志记录、权限检查、...
本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述其工作原理。 首先,我们需要理解Struts2拦截器的基本概念。拦截器是一个实现了`Interceptor`接口的Java类,它位于动作调用之前和之后,...
首先,我们需要理解Struts2拦截器的工作原理。拦截器是基于Java的动态代理机制实现的,它们在Action调用之前和之后执行,形成一个拦截器链。开发者可以通过配置struts.xml或struts.properties文件来定义拦截器链和其...
首先,理解Struts2的拦截器工作原理。拦截器是基于Java的动态代理机制实现的,它们按照配置的顺序形成一个拦截器链,每个请求在执行动作之前会依次经过这些拦截器。在处理登录场景时,我们可以创建一个特定的拦截器...
本文将深入探讨“模拟一个拦截器”的主题,结合提供的标签“源码”和“工具”,我们将深入源代码层面理解拦截器的工作原理,并通过实际操作来模拟创建一个自定义的拦截器。 首先,我们需要了解什么是拦截器。在软件...
通过实践简单的Struts2模拟代码,可以更好地理解和体验Struts2框架的工作原理和优势。在实际开发中,还需要不断学习和熟悉Struts2的高级特性,如自定义拦截器、类型转换、插件使用等,以提升开发能力。
总之,Struts2是一个强大且灵活的MVC框架,它的工作原理涵盖了前端控制器、拦截器、Action、结果映射等多个关键组件,提供了高效、模块化的web应用开发解决方案。通过实际项目的学习,开发者可以更好地掌握其精髓,...
3. **拦截器(Interceptor)**:拦截器是Struts2的一个重要特性,它可以插入到Action调用的前后,执行一些预处理或后处理任务,如日志记录、权限检查等。Struts2提供了一系列内置的拦截器,同时允许自定义拦截器以...
Struts1是Apache组织开发的一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它简化了开发...实际开发中,虽然Struts1已经被Struts2和其他现代框架取代,但了解其工作原理对理解和使用其他框架仍然有裨益。
4. **日志拦截**:类似于Struts2的拦截器,我们可以创建一个Servlet Filter或者使用AOP(面向切面编程)来实现日志拦截。在处理请求前,记录请求信息;处理完成后,记录响应信息。这可以帮助我们跟踪应用的行为,对...
这个“Struts2的简单模拟”项目可能是为了帮助初学者理解Struts2的核心概念和工作原理,通过实际操作来深入学习。 在Struts2框架中,主要有以下几个关键知识点: 1. **Action类**:它是业务逻辑处理的主要载体,...
然后,Struts2的拦截器(Interceptor)机制是其一大特色,它可以对Action执行前后的逻辑进行增强。在模拟实现中,我们可以创建自定义的拦截器,例如日志拦截器、权限拦截器等,并在配置文件中声明它们。 ```xml ...
总之,调试Struts2应用需要全面理解其架构和工作原理,结合配置、日志、断点、拦截器等手段,逐步缩小问题范围,找到问题的根源。随着经验的积累,你将更加熟练地驾驭Struts2框架,解决各种开发难题。
2. **Struts2配置**:理解`struts.xml`配置文件,包括Action配置、结果类型配置、拦截器栈配置等。例如,我们可能会在Action配置中定义模拟登录的类,并指定对应的视图或结果。 3. **Ajax原理**:了解JavaScript中...
这个"模拟Struts2代码+文档"的压缩包很可能包含了一个简化的Struts2应用实例和相关的技术文档,帮助初学者理解Struts2的工作原理和实践操作。 Struts2的核心特性包括: 1. **Action类**:在Struts2中,Action类是...
Struts2引入了拦截器机制,它是一种AOP(面向切面编程)的概念,可以实现对Action执行前后的增强处理,如日志记录、权限检查等。 **8. 结果类型(Result Type)** 在Struts2中,结果不再仅仅是一个JSP页面,而是...
Struts2提供了丰富的特性,包括动作映射、结果类型、拦截器、插件支持以及与Spring等其他框架的集成,使得开发者能够构建出高效、可维护的Web应用。 标题提到的“struts2测试工具”可能是指用于测试Struts2应用程序...
1. 避免使用默认的Struts2拦截器栈,根据应用需求自定义拦截器配置。 2. 使用基于注解的配置,减少XML配置文件的复杂性。 3. 对敏感数据进行过滤和校验,防止SQL注入和跨站脚本攻击。 4. 使用最新的Struts2版本,...
1. **拦截器机制**:Struts2利用拦截器机制处理用户的请求,这使得Struts2能够更加灵活地扩展功能,并且易于与其他技术集成。 2. **松耦合**:通过将业务逻辑控制器与Servlet API解耦,Struts2实现了更高级别的松...