一、概述
struts框架的入口是一个filter(StrutsPrepareAndExecuterFilter),filter在学习jsp/servlet的时候最先引入,其主要是由一个filter接口中的三个方法和三个参数——init和doFilter、destory方法,FilterConfig(web.xml中filter配置参数)和协议无关的ServletRequest、ServletResponse。纵观struts2出现的前世今生,其实整个框架由两部分组成,一部分是和HTTP协议有关的struts部分,另一部分则与协议无关、与业务逻辑紧密相连的xwork部分,因此运行主线还可以再细致分一下,分成HTTP预处理(由struts完成)过程和HTTP执行过程(由xwork完成)。
查看StrutsPrepareAndExecuterFilter源码,整个struts框架可以分成三条主线:
1. 初始化主线:init(FilterConfig)方法驱动;
2. 运行主线:doFilter(ServletRequest, ServletResponse)方法驱动;
2.1 HTTP预处理过程:和struts有关;
2.2 HTTP执行过程:和xwork有关;
3. 销毁主线:destory()方法驱动;
至此,struts2的所有主线列举完成,本次主要分析struts框架的初始化主线。
推荐阅读:《struts技术内幕》——陆舟 《struts in action》
二、初始化主线
web容器的初始化顺序,ServletContext>listener>filter>servlet,对应着web.xml中配置的读取顺序context-param会最先读取,接着才是listener、filter、servlet标签中配置的init-param。因此,想要使用struts框架,拷贝jar也好,配置struts.xml文件也好,最重要还是在web.xml中配置StrutsPrepareAndExecuterFilter,否则就算你做好一切准备工作,也不能把struts接入你的项目。
写到这里决定不写了,还是亲自去看源码吧,直接查看filter里面的init方法,里面主要初始化日志工厂、HTTP预处理对象Prepare、HTTP请求处理对象Executer,最重要的是整个Struts作为MVC框架的Controller——Diapatcehr的建立及其init方法,而整个struts的核心容器(Struts IOC/DI)也在Dispatcher中初始化完成,另外,Dispatcher还负责default.properties、struts-default.xml、struts.xml、struts-plugin.xml的加载,等等。
需要明确的是,struts是由两部分组成的,这一点尤为重要,其中Dispatcher类作为粘合剂,将struts和xwork粘合在一起,从而形成struts2 web框架和web容器解耦的基点。要想弄明白struts2框架,一个Filter和一个Dispatcher的了解首当其冲。
三、至此结束
struts2作为展示层的MVC框架还是太“重”了,当前Spring MVC也逐渐占有更多的市场。
我们说分层开发,其实是面向一个应用而言的分层:表示层、业务层和持久层,struts2和Spring MVC作为表示层的MVC框架。下面撸一下各层常用框架和技术。
展示层:servlet/jsp、Spring MVC、struts2
业务层:Spring
持久层:JDBC、DButils、Spring JDBC、Mybatis、hibernate
此外,如果你还有精力,研究一下java.util.concurrent[.*]包和NIO,这些和机器硬件原理打交道太多了,是你进阶必备的只是,譬如并发编程里面的JMM(java内存模型,不是简单的JVM的内存分类),抽空研究一下ThreadLocal也很有必要。
附注:
本文偷懒没写完,如有需要,请加群讨论(QQ:323849607),谢谢!