源码分析——核心机制
MVC和三层的看法 |
通过上一章我们明白我们要学习的知识点和目标。所以这章我将从使用者来讲struts2的机制原理。我们都清楚的知道struts2的核心思想是MVC思想。MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。说到MVC思想我就不得不讲到另一个可能让人迷糊的知识点(三层架构)。有多很面试官会问:MVC和三层架构是不是同一个东西。如果不是他们又别分是什么。我们来看一下下面的定义。
三层架构的定义
1.表现层:项目的界面UI相关的逻辑代码。你可以理解为Web界面。Winform等等都可以说为表现层。
2.业务层:项目相关业务逻辑代码。例如下单业务。我们最后一定要计算总的消费金额类似的逻辑。而计算这一步就是属于业务层的。当界面用户看到的数字就是表现层的。
3.数据层:根据数据库相关的逻辑代码。不管是什么样子的项目一般多要对数据进行增删改查的操作。这些代码都是属于数据层的。
MVC思想的定义
1.模型(model):你可以理解为业务相关的数据代码。笔者当年把模型对象和这边的模型相混在一起。这边的模型是大业务来讲。而模型对象只是某一个业务完成之后的数据存放而以。
2.视图(view):界面UI相关的显示代码。
3.控制器(controller):用于处理业务相关的交互代码。你可以理解为从视图或从用户那直接读取数据,控制用户输入的数据,向模型(model)发送数据。
从上面的定义来看的话,我相信还是有很多朋友会看不懂。笔者当年也为这些概念的东西思考了很久。也问我很多人,找了很多资料。可是还是有会有一点乱。来看一张图片。如下。
这张图是笔者自己的画的。不好看是必然。这不是重点。笔者想要讲的是MVC和三层之间的关系。从图片上我们就可以看到三层和MVC不是同一东西。其中视图(view)-控制器(controller)在笔者看来只是把表现层上面的代码更加的细节化,变得更加有组织。而模型(model)只是把业务层和数据层包在里面而以。而模型(model),视图(view),控制器(controller)之间的数据交流用模型对象来实现。这边的模型对象就是代码常常看到的Model类对象。图片上有俩个1红色圆形标志。就是笔者认为控制器(controller)可以从视图或从用户那直接读取数据。
小总结:
我们可以理解为三层和MVC对代码组织的方式不一样子。三层用的是UI显示相关的代码,业务相关代码,数据库相关代码的方式进行划分。而MVC用的是业务逻辑,数据(这里笔指的是模型对象),界面UI显示分离的方式来进行化划分。所以笔者认为他们的思想不冲突。硬要说的话,笔者认为MVC是二层,表现层和业务逻辑层(其中包含上的业务层和数据层)。在笔者看来只要把MVC+三层的思想引入任何一个项目的话,都会让这个项目整体结构上变得更新的清楚。这里讲一个搞笑的事情。记得当年我是这样子认为业务层就是一个dll或JAR,而数据层也是一个dll或JAR。而表现层就是应用的主要项目。比如 exe应用或是aspx/jsp应用。然后表现层应用引入业务层DLL ,业务层项目引用数据层DLL。没有别的意义了。呵呵呵。
struts2 的机制原理 |
不管是什么样子的文档说明。如果能有一个类似于流程图的图片来说明相关的业务细节的话。那真是太完美了。对笔者而来言,现在是复习struts2。所以有一张能说明struts2机制的图片的话,我只能说事半功陪。我找了很多张图片。而如下图片在笔者看来是最好的。
请把目光移到上面这张图片的底部。相信在看这张图片的时候,很多人会不明白这张图片要说明什么。主要原因笔者认为:一是对struts2的基本知识不是很了解;二是没有认真的看这张图片,只会看图片的上面部分,没有看底部的定义。我们来看一下底部是在说明什么。
橙黄色(Servlet Filters):struts2的过滤器。
蓝色(Struts core):表示struts2核心部分的知识点。
绿色(Interceptors):表示拦截器。如果不清楚拦截器的朋友。你们可以去看一下AOP思想。当然Spring在这方面做的非常棒了。
黄色(User Created):用于说明这部分是开发人员自己定义的部分。即是所为的开发代码。
其实图片上面应该还有一个定义:淡黑色,如HttpServletRespose和HttpServletRequest。用于表示 用户的一次请求。
好了。看了上面的定义之后,笔者就可以来讲解struts2的机制了。
1.每一次请求(HttpServletRequest)都会通过上面图片中的橙黄色(Servlet Filters)部分。即是struts2的过滤器。
2.当请求到FliterDispatcher的时候,它会去调用ActionProxy,ActionProxy会去判断是否调用过ConfigurationManager并加载过struts.xml。如果没有就调用ConfigurationManager并加载struts.xml,在跳入第三步。否则如果有就直接跳入第三步。
3.ActionProxy通过ActionInvocation来执行用户请求对应Acion的拦截器。
4.找到对应的Acion并执行对应的方法。
5.根据Acion执行的结果开始组装回返的结果信息。
6.把对应的结果信息放入HttpServletRespose并回返给用户显示出来。
上面值的注意是Filter过滤器和拦截器。他们会先执行上部分,然后去执行对应的Action,最后在去执行下部分。其中ActionProxy,ConfigurationManager,FliterDispatcher等等这里有,并不代表源码里面就有。可能会换个名字。这里更多的是用于表示一种机制概念而以。
文章总结 |
本章的内容比较概念,目的是为了让笔者进入源码的时候,对struts2框架有一个大概的认识。同时也讲了相关的三层。而struts2机制更是本章的重点。只有了解了struts2机制之后。看源码才不会迷失方向。