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 源码分析——核心机制的更多相关文章

  1. Struts2 源码分析——拦截器的机制

    本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...

  2. Struts2 源码分析——过滤器(Filter)

    章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...

  3. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  4. Struts2 源码分析——配置管理之PackageProvider接口

    本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...

  5. Struts2 源码分析——调结者(Dispatcher)之执行action

    章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...

  6. Struts2 源码分析——Hello world

    新建第一个应用程序 上一章我们讲到了关于struts2核心机制.对于程序员来讲比较概念的一章.而本章笔者将会亲手写一个Hello world的例子.所以如果对struts2使用比较了解的朋友,请跳过本 ...

  7. Struts2 源码分析——DefaultActionInvocation类的执行action

    本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...

  8. Struts2 源码分析——配置管理之ContainerProvider接口

    本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...

  9. springMVC源码分析--异常处理机制HandlerExceptionResolver执行原理(二)

    上一篇博客springMVC源码分析--异常处理机制HandlerExceptionResolver简单示例(一)中我们简单地实现了一个异常处理实例,接下来我们要介绍一下HandlerExceptio ...

随机推荐

  1. Windows Server 2008 系统设置集合

    1.禁用IPV6 netsh interface teredo set state disabled netsh interface 6to4 set state disabled netsh int ...

  2. IIS部署Nodejs步骤

    需要iis的url重写插件 安装iisnode 配置文件 rewrite 节点需要url重写插件支持 node.exe 路径是你安装的路径 interceptor.js 是你安装iisnode的路径 ...

  3. asp.net linux 环境部署, jexus

    cd /tmpwget linuxdot.net/down/jexus-5.8.1-x64.tar.gztar -zxvf jexus-5.8.1-x64.tar.gzsudo mv jexus /u ...

  4. 如何利用Github+Appveyor+Nuget打造自己的.net core开源库

    以下教程基于你有一个托管在Github上的.net core项目,如果没有的可以自己fork一个或者自己创建了默认的项目即可. 我们打开需要生成nuget包的项目中的project.json文件,有关 ...

  5. 一个空行引起的阿里云负载均衡上部署https证书的问题

    今天在阿里云上购买了WoSign的https证书,在证书签发后,在控制台下载证书文件,一共有2个文件,一个是.key文件(私钥文件),一个是.pem文件(证书文件). 然后在阿里云负载均衡“证书管理” ...

  6. Git 远程仓库搭建

    大名鼎鼎的git就不多做介绍了,总之.我们使用git来作为项目的一个版本控制工具,多人开发的项目的时候会轻松很多. 安装git whthomas@whthomas:~/workplace/gitOne ...

  7. 创业6&7

    周末两天泡咖啡店. 起不来,只好下午去. 周六5点到9点. 周日3点到12点. 1)整理直播课程讲义.完成50%. 2)修改GMTC演讲稿.完成. 招行的单子还是拒了,目前还没准备好高可用的App服务 ...

  8. Redis数据库的使用场景介绍(避免误用Redis)

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/122.html?1455854235 Redis 是目前 NoSQL 领域 ...

  9. 纯js实现复制到剪贴板功能

    在网页上复制文本到剪切板,一般是使用JS+Flash结合的方法,网上有很多相关文章介绍.随着 HTML5 技术的发展,Flash 已经在很多场合不适用了,甚至被屏蔽.本文介绍的一款JS插件,实现了纯J ...

  10. Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署

    基于Logstash跑通Kafka还是需要注意很多东西,最重要的就是理解Kafka的原理. Logstash工作原理 由于Kafka采用解耦的设计思想,并非原始的发布订阅,生产者负责产生消息,直接推送 ...