struct2源码解读(1)之struts2启动

struct2源码解读(1)之struts启动

之前用struct2、spring、hibernate在开发一个电子商城,每天都在重复敲代码,感觉对struct2、spring、hibernate的理解都在使用层面上,虽然敲了几个月代码,但是技术水平还是得不到显著提高。于是就想着研究下struct2、spring、hibernate的源码,研究完后不仅对struct2、spring、hibernate加深了了解,同时也加强了java的学习,例如xml的解析,字符操作,线程等等,受益匪浅。想着当初我学习struct2、spring、hibernate源码的时候,网上的学习资源甚少而且杂乱无章,于是就想着把自己的学习心得分享出来,方便大家参考。因本人也在学习之中,如有什么不当之处,希望大家指出;如果大家对某个知识点有更通俗易懂的想法,也希望大家写出来分享。

好了,不多说了,直接上代码吧。特别注意:源码的解读都是建立在一定的基础上的,文中某些知识点我都是默认大家已懂的,就不做过多阐释了;如果大家有什么疑惑,请私信我,我会第一时间为大家做详细的解答。

一、源码准备

struct2是struct与webwork共同努力的成果,因此需要准备struct2的源码和xwork的源码。

因为struct2开发需要导入struct2-core-2.1.8.1.jar和xwork-core-2.1.6.jar 这两个jar包,因此我们需要导入这两个jar包的源码。

如何导入?

最简单的方法,就是在myeclipse去到你的项目,在【referenced libraries】中找到这两个jar包,然后随便双击一个类,双击之后会弹出一个窗口,窗口有个【attach source】按钮,点击然后选中源码资料路径就可以了。

源码资料地址:http://down.51cto.com/data/2113696

阅读源码有很多种办法,比如断点调试追踪、maven、svm等等,而我个人就比较喜欢输入输出法,也就是从struct2的起点开始追踪到它的终点来看。至于用什么方法,都是看个人习惯,没有什么好与不好的。

二、 structs2的启动

(1)struct2的起点

structs2是从哪里开始的呢?

我们在进行struct2开发的时候,需要在web.xml中配置以下一段代码:

        <filter>
	<filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

web.xml是tomcat启动时会加载的一个xml文件,这里配置的是一个过滤器,也就是说tomcat启动的时候,会运行StrutsPrepareAndExecuteFilter这个类的init()方法;这就是structs2的起点。

特别注意:FilterDispatcher是早期struts2的过滤器,后期的都用StrutsPrepareAndExecuteFilter了,如 2.1.6、2.1.8。StrutsPrepareAndExecuteFilter名字已经很能说明问题了,prepare与execute,前者表示准备,可以说是指filter中的init方法,即配制的导入;后者表示进行过滤,指doFilter方法,即将request请求,转发给对应的 action去处理。

(2)struct2的初始化

从上面分析可以知道,在tomcat启动的时候,会运行StrutsPrepareAndExecuteFilter这个类的init()方法,这个是struct2的起点,struct2会在这个方法中完成初始化,那么struct2初始化会做一些什么事情呢?

我们来找到这个类,来看下这个类的init()方法。

 public void init(FilterConfig filterConfig) throws ServletException {
         //实例化一个初始化对象
        InitOperations init = new InitOperations();
        try {
           FilterHostConfig config = new FilterHostConfig(filterConfig);
           init.initLogging(config);
           //实例化一个Dispatcher对象
           Dispatcher dispatcher = init.initDispatcher(config);
           //加载静态资源
           init.initStaticContentLoader(config, dispatcher);
           //实例化两个对象
           prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
           execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
           //url黑名单
	   this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
           postInit(dispatcher, filterConfig);
        } finally {
            init.cleanup();
        }

    }

InitOperations是struct2设计的 一个用来管理初始化的对象。例如initLogging()初始化日志信息,initDispatcher初始化Dispatcher对象(Dispatcher是struct2的核心对象,这个类准备了struct2运行的环境,包括初始化和action的转发)名字只是一个标记,标记里面的代码是用来干什么的,因此大家在读源码的时候千万不要钻牛角尖,一直纠结这个是什么,哪个又是什么。这些都是struct2设计者对每个代码块的命名罢了。

至于struct2初始化做了什么事情,下一篇博文再做详细的解释。

时间: 2024-10-09 20:23:32

struct2源码解读(1)之struts2启动的相关文章

struct2源码解读(8)之container原理

struct2源码解读之container原理 container翻译成中文的意思是容器,通俗地来说,就是struct2的运行环境.这个所谓的运行环境,有点类似于一个容器,里面装着各种对象,当struct2处理aciton请求的,就会容器中取相应的对象.下面探讨下container的实现原理.container是一个接口,主要有两个方法,一个是inject() 一个是getInstance():getInstance()是从容器取出对象,inject()是依赖注入.struts在启动的时候,就把

struct2源码解读(11)之执行action请求中篇

struct2源码解读之执行action请求(2) 上篇博文介绍了执行action请求前的一些准备工作,包括封装http参数到一个map中,获得一个值栈对象和配置信息configuration,并创建一个执行action请求的actionProxy对象,并对这个对象进行了初始化,包括指定默认执行方法和对actionName对应的类进行依赖注入以及调出拦截器. 然后就到了我们执行action请求的工作.  if (mapping.getResult() != null) {            

struct2源码解读(5)之解析bean标签

struct2源码解读之解析bean标签 上篇博文,我们大致分析了struct2是如何解析struct2配置文件的,包括default.properties和struct*.xml,但有些细节比较繁琐,如struct2是如何解析bean标签的和struct2是如何解析packag标签的,还没详细分析,这篇博文将详细解析struct2是如何解析bean标签的,package的解析将留在下篇博文进行讲解. 一.bean标签 我们先来看下bean标签是怎么样的? 代码清单:structs.xml <?

struct2源码解读(9)之处理Action请求

struct2源码解读之处理Action请求 我们前面讨论过了struct2的初始化,我们先来回顾下  public void init(FilterConfig filterConfig) throws ServletException {         InitOperations init = new InitOperations();         try {             FilterHostConfig config = new FilterHostConfig(fil

struct2源码解读(3)之解析配置文件

struct2源码解读之解析配置文件 上篇博文讲到struct2在初始化时,在创建Dispacher之后,会Dispacher.init()中会对配置文件进行解析,下面就让我们一起探讨下struct2是如何解析配置文件的. public Dispatcher initDispatcher( HostConfig filterConfig ) {           //创建Dispacher实例         Dispatcher dispatcher = createDispatcher(f

Spark学习之路 (十五)SparkCore的源码解读(一)启动脚本[转]

启动脚本分析 独立部署模式下,主要由master和slaves组成,master可以利用zk实现高可用性,其driver,work,app等信息可以持久化到zk上:slaves由一台至多台主机构成.Driver通过向Master申请资源获取运行环境. 启动master和slaves主要是执行/usr/dahua/spark/sbin目录下的start-master.sh和start-slaves.sh,或者执行 start-all.sh,其中star-all.sh本质上就是调用start-mas

Jfinal启动源码解读

本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JFinalConfig的继承类的Main方法为入口,实例代码继承类为:DemoConfig,Main方法如下: public static void main(String[] args) { /** * 特别注意:Eclipse 之下建议的启动方式 */ JFinal.start("WebRoot&

swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?

date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowft 启动阶段的那些事儿 小伙伴刚接触 swoft 的时候会感觉 压力有点大, 更直观的说法是 难. 开发组是不赞成 难 这个说法的, swoft 的代码都是 php 实现的, 而 php 又是 世界上最好的语言, swoft 的代码阅读起来是很轻松的. 之后开发组会用 系列源码 解读文章, 深入解析

structs2源码解读(6)之解析package标签

structs2源码解读之解析package标签 上面讨论过,在创建Dispacher对象时,调用dispacher.init()方法完成初始化,在这个方法中先创建各种配置文件的解析器(ConfigurationProvider),然后循环遍历这些解析器的register()方法解析各个配置文件.  for (final ContainerProvider containerProvider : providers)         {             containerProvider