Struts2 源码分析——核心机制
| 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机制之后。看源码才不会迷失方向。
Struts2 源码分析——核心机制的更多相关文章
- Struts2 源码分析——拦截器的机制
本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...
- Struts2 源码分析——过滤器(Filter)
章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...
- Struts2 源码分析——Action代理类的工作
章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...
- Struts2 源码分析——配置管理之PackageProvider接口
本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...
- Struts2 源码分析——调结者(Dispatcher)之执行action
章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...
- Struts2 源码分析——Hello world
新建第一个应用程序 上一章我们讲到了关于struts2核心机制.对于程序员来讲比较概念的一章.而本章笔者将会亲手写一个Hello world的例子.所以如果对struts2使用比较了解的朋友,请跳过本 ...
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
- Struts2 源码分析——配置管理之ContainerProvider接口
本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...
- springMVC源码分析--异常处理机制HandlerExceptionResolver执行原理(二)
上一篇博客springMVC源码分析--异常处理机制HandlerExceptionResolver简单示例(一)中我们简单地实现了一个异常处理实例,接下来我们要介绍一下HandlerExceptio ...
随机推荐
- .NET JSON对象序列化和反序列化
class Program { static void Main(string[] args) { Console.WriteLine("========================== ...
- 深入理解openstack网络架构(2)----Basic Use Cases
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture1 译文转自: http:// ...
- 在Linux上以服务的方式运行ASP.NET Core站点
更新:用supervisor是更好的解决方法,详见 Linux下为 dotnet 创建守护进程 要在生成环境下在Linux服务器上跑ASP.NET Core站点,首先要解决的问题是以服务的方式运行AS ...
- 算法:Astar寻路算法改进,双向A*寻路算法
早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...
- 为自己搭建一个鹊桥 -- Native Page与Web View之间的JSBridge实现方式
说起JSBridge,大家最熟悉的应该就是微信的WeixinJSBridge,通过它各个公众页面可以调用后台方法和微信进行交互,为用户提供相关功能.我们就来说说UWP下怎么样实现我们自己的JSBrid ...
- 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解
原作者:PG 整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...
- AngularJS快速入门指南20:快速参考
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"
最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local, 查出本地ruby安装的所有的包 这里可以看到i1 ...
- Atitit 桌面软件跨平台gui解决方案 javafx webview
Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...
- ftp下载目录下所有文件及文件夹内(递归)
ftp下载目录下所有文件及文件夹内(递归) /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...