核心配置
对于Java的Web应用来说,启动时会根据web.xml文件来装载相关信息,Struts2的核心配置就是一个Filter,这一点与Struts(版本一核心是一个Servlet)有所区别。
在Struts2早期版本,org.apache.struts2.dispatcher.FilterDispatcher,但自2.1.3版本开始该类被org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter取代。OK,转入正题,开始分析整个Struts2的启动流程!
StrutsPrepareAndExecuteFilter的生命周期
先回想一下javax.servlet.Filter的生命周期,首先是初始化的init方法,它会随着应用程序启动而启动;然后是用于服务的doFilter方法,每次请求到达都会走入这个方法;最后是用于资源清理的destory,当应用退出时会,该方法会被调用。整个过程就是:init -> doFilter -> destory 过程,对于 StrutsPrepareAndExecuteFilter 来说也是如此。
StrutsPrepareAndExecuteFilter.init方法分析
在本节我们只对初始化部分进行详细分析,分析过程基本如下图所示,按程序执行顺序来进行分析
下面为init方法的实现,请结合图中第一列分析:
我们先看看这个方法涉及到的几个类:InitOperations、FilterHostConfig、Dispatcher、PrepareOperations和ExecuteOperations。其中InitOperations是一个用于初始化操作的工具类,而Filter相关信息则是保存在FilterHostConfig中,之后就用生成的FilterHostConfig来创建Dispatcher对象,这个对象比较重要,因为它与xwork结合非常紧密,可以认为是Struts2与xwork结合的核心组件。PrepareOperations和ExecuteOperations在这里没有什么实质性工作,只是对象实例化,它们真正的作用是在应用程序进行服务时才发挥的,我们留在下一节分析。
接下来逐句分析:
以上两句为对象实例化,没什么特别处理,继续。
从方法注释可以看出,是一个日志初始化功能,如果我们在StrutsPrepareAndExecuteFilter配置了一个名为loggerFactory的参数,值为一个实现了com.opensymphony.xwork2.util.logging.LoggerFactory(抽象类)的类,那Struts2就会使用我们提供的这个日志类进行日志输出,这样我们就可以随意使用各种Log第三方jar包了。
接下来就是重点内容了,createDispatcher方法比较简单,利用Filter中配置的相关参数创建一个Dispatcher对象而已,而Dispatcher.init就开始读取struts.xml
[2]部分就是读取struts.xml,正常情况下只能处理默认的xwork.xml配置文件,Struts2重写了这个方法,引入了对struts.xml的支持。
Dispatcher处理之后,就是关于静态内容处理
在定义web.xml时可以指定哪些存于WEB-INF中的内容可以对外访问的,如果有多个包名需用空格分隔。这个功能对于访问资源保护来说相当不错,WEB-INF下内容是禁止访问的,通过这个功能我们就可以访问classes中内容。
最后通过URL http://localhost:8080/struts2/static/readme.html 就可以访问到包 demo 中定义的readme.html文件!
下面这句并没有出现在时序图中,感觉与StaticContentLoader类似,就是让StrutsPrepareAndExecuteFilter放弃处理某些URL,这样就可以直接访问web-app下除WEB-INF以外的内容。否则所有内容都得通过action间接访问,即send request -> action -> JSP。
cleanup,这个留到下节说吧,Struts1非线程安全,多少跟这个实现有关。终于结尾了~~~
分享到:
相关推荐
从 org.apache.struts2.dispatcher.FilterDispatcher 开始 Java 代码阅读,我们可以看到 FilterDispatcher 的 init 方法,它负责初始化 Dispatcher 对象,并创建了一个 ActionMapper 实例,以便对请求进行处理。...
本文将深入探讨Struts2的源码分析,特别是关于StrutsPrepareAndExecuteFilter的初始化过程,这是Struts2的核心组件之一,负责处理HTTP请求。 首先,我们来看`StrutsPrepareAndExecuteFilter`的初始化。这个过滤器...
struts2源码详细解析51CTO下载-struts2源代码分析(个人觉得非常经典)
`Dispatcher`类在Struts2中扮演着重要角色,它负责框架的初始化和Action的执行。`FilterDispatcher`则是一个Servlet Filter,根据配置文件来决定哪些请求需要经过Struts2处理。如果配置不当,可能会导致问题,如将...
Interceptor链是由用户自定义的拦截器和Struts2内置的拦截器组成,例如PrepareInterceptor会确保Action实例被正确初始化。Action执行完成后,Result对象会根据配置的类型和值来决定如何处理返回的结果。 此外,...
本资料包包含的是《Struts2深入详解》一书的源码分析,涵盖了从第一章到第五章的内容,并附带了相关的jar包,方便读者结合理论与实践进行学习。 首先,让我们从第一章开始,Struts2的基础知识。这一章通常会介绍...
`ActionProxy`创建并初始化`ActionInvocation`对象,`ActionInvocation`则负责执行Action,并管理拦截器(Interceptors)的调用。 在请求流程中,`ActionInvocation`会按照预定义的顺序调用拦截器,然后执行Action...
- **StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,负责初始化Struts2框架并处理所有的HTTP请求。 - **ActionContext**:存储了请求期间的上下文信息,包括值栈、session、request和response对象等。...
通过对Struts2源码的分析,我们可以更深入地理解框架内部的工作机制。Struts2不仅在技术上有所突破,在设计理念上也更加成熟和完善。对于开发者来说,熟悉Struts2的源码有助于提高开发效率,解决实际开发过程中遇到...
源码分析是提升编程技能和解决问题的关键,特别是对于复杂的框架如Struts2,理解其内部工作原理能够帮助我们优化应用性能,修复潜在问题,并进行定制化开发。 首先,Struts2的核心组件包括Action、Result、...
通过分析这个Struts2项目源码,你可以学习以下技能: 1. 如何创建Action类,并定义其方法与用户请求对应。 2. 理解配置文件`struts.xml`的结构和作用。 3. 掌握Action与视图的交互,了解结果类型的应用。 4. 学习...
1. **org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,它初始化并调用Struts2的生命周期。 2. **com.opensymphony.xwork2.DefaultActionProxy**:ActionProxy...
struts2源代码及API帮助文档。...跟读struts2源码的时候注意两条主线:一条是初始化;另外一条是监听http请求。学习初始化过程是如何获取配置构造容器,其中的巧妙构思和设计模式的运用非常值得学习。
通过上述步骤和知识点,你可以对Struts 2有更深入的理解,并且能够利用Eclipse的强大工具进行调试和代码分析,提升开发效率。同时,熟悉源码也有助于定制化开发和解决实际问题。在实践中不断探索和学习,才能更好地...
压缩包中的"org"目录可能包含了Struts2框架的源码文件,按照包结构组织。这通常包括核心组件、拦截器、结果类型、动作支持、配置处理等模块的源代码。开发者可以深入研究这些源码,了解其工作原理,进行自定义扩展...
6. **Plug-in机制**:Struts2支持插件化开发,可以通过添加插件来扩展框架功能,如报表、图表、富文本编辑器等。 7. **Freemarker / JSP 视图技术**:Struts2支持多种视图技术,如Freemarker模板语言和JSP,允许...
3. StrutsPrepareAndExecuteFilter:这是Struts2的过滤器,用于初始化和处理请求。它在web.xml中配置,负责拦截请求并将其交给Struts2的Dispatcher。 4. ActionMapper:ActionMapper根据请求URL映射到相应的Action...
1. **初始化过程**:了解Struts2如何加载配置文件,初始化ActionMapping和Interceptor链。 2. **请求处理流程**:跟踪一个HTTP请求从进入Struts2到返回响应的整个过程,重点关注ActionInvocation、Interceptor的...
Struts2是Java Web开发中一个非常重要的框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了一种结构化、易于维护的Web应用开发方式。《轻松掌握Struts2》这本书旨在帮助读者深入理解并熟练运用...