zoukankan      html  css  js  c++  java
  • 源码分析——核心机制

    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机制之后。看源码才不会迷失方向。

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6552597.html
Copyright © 2011-2022 走看看