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 ...
随机推荐
- 如何参与一个 GitHub 开源项目?
最近一年开源项目特别的热,很多技术大会或论坛都以开源项目作为主题进行探讨,可见这是一种趋势.而Github作为开源项目的著名托管地,可谓无 人不知,越来越多的个人和公司纷纷加入到Github的大家族里 ...
- [.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern)
一.前言 在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容.本专题作为一个准备专题,因为在后面一个专题中将会网上书店中的仓储实现引入 ...
- 超出TCP连接端口数限制(MaxUserPort)引起的服务器问题
昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80 ...
- MySql学习(MariaDb)
资料 http://www.cnblogs.com/lyhabc/p/3691555.html http://www.cnblogs.com/lyhabc/p/3691555.html MariaDb ...
- Android(蓝牙)
因近期项目需求调试了Android蓝牙通讯接口,主要是两个终端作为服务端和客户端的通信,本文将部分重要知识点记录如下. 蓝牙是短距离无线通信,通常分经典蓝牙和低功耗蓝牙(即蓝牙4.0),两类蓝牙协议各 ...
- java 多线程(synchronized)
package com.example; public class App { public static void main(String[] args) { doRunable dr = new ...
- 由一篇文章引发的思考——多线程处理大数组
今天领导给我们发了一篇文章文章,让我们学习一下. 文章链接:TAM - Threaded Array Manipulator 这是codeproject上的一篇文章,花了一番时间阅读了一下.文章主要是 ...
- 手把手教你用python打造网易公开课视频下载软件5-python生成exe程序
python程序生成exe文件,使用的是py2exe扩展包,下面写下具体的步骤: 第一步:新建conver2exe.py,内容如下: #coding:utf-8 from distutils.core ...
- JavaScript获取两个数之间的任意随机数
通过JavaScript的Math.random()方法可以获取0到1之间的任意随机数,那如何获取任意给定的两个数之间的随机数呢?如获取2和5之间的随机数,5和10之间的随机数等. 由于Math.ra ...
- EF架构~在T4模版中自定义属性的getter和setter
回到目录 T4模版为我们在ORM操作上提供了便捷,它很方便的可以对实体进行全局性的修改,之前我介绍过通过T4来为属性加默认性,而今天我主要告诉大家如何使用T4模版将getter,setter块改为自己 ...