MVC
模型视图控制器模型 这是中文名称
原先是为桌面应用建立的框架, 后来转变成为 B/S 模型.
经典图如下
说一下 CGI, 是使用 CGI 和 apache 进行连接, 当发生一个请求的时候, 进入 apache, 即 web server, 由 Web server 执行事先编辑好的 CGI 程序, 由 CGI 程序读取 databases, 由 CGI 程序把读取到的 dtatBases 整合, 返回给 webserver 再由 webserver 返回给浏览器, 实现了该协议的由 PHP-CGI, 但是继续, 每次收到一个请求都会 fork 一个进程, 把 CGI 进行改良, 产生了 fast-CGI, 即, 每次处理完成以后, 不在清除掉这个进程, 而是保留这个进程. 再往后出现了 PHP-fpm, 为 fastCGI 的实现, 提供了进程管理的功能. 其中 PHP-fpm 是可以单独执行的, 不具有静态的文件处理功能, 此时加上 apahce, 用于对静态文件进行处理, 由于站点过多, 在加上 nginx 进行反向代理, 实现负载均衡. PHP-fpm 是可以单独执行的. 最后, apache 和 nginx 都可以实现负载均衡, 不过由于 nginx 是事件驱动的所以使用 nginx 用来做反向代理偏多
另外, 还有一种是异步机制, 属于 Node.JS, 即, 当事件发生的时候, 入栈, 然后, 有一个事件环, 进行循环处理, 其中, 事件环为单线程的. 此为异步
Node 中也有对象机制, 即, 先发出命名好的事件, 事件触发之前注册好的监听器, 在 Node.JS 下, 需要继承 EventEmitter 类, 并实例化生成.
PS: 事件 != 异步, 是在异步函数执行完成以后触发事件, 基于事件通信的回调机制.
即, 后台程序不需要任何修改, 只需要使用不同的视图, 用来呈现出不同的页面.
mvc 有两个版本, 在早期当中, jsp 页面融合了控制器和视图的功能. 即, 开发出一堆 jsp 页面, 然后一堆 java bean, 当用户访问的时候, 访问 jsp 的时候, 由 tomcat 生成对象, 送入 java bean 中进行执行, 由 java bean 负责业务处理, 包括数据库的读取, 然后返回给浏览器. 这里呢, jsp 负责控制器和视图, java bean 负责业务处理.
第二个 mvc 只是把 jsp 和 java bean 分开了.
在第二个版本当中, 视图和模型彻底分离.
栗子如下, 一个数据展示界面, 从一张表中把数据读取, 然后展示到页面上, 其中页面展示为视图 V, 从数据库取得数据是模型层 M, 控制器 C 是把浏览器接收到的请求, 执行模型层 M, 执行, 然后组合视图 V, 最后把数据返回给客户端.
图如下
首先, HTTP 协议发出请求, 然后控制器接收请求, 控制器接收请求以后, 发送给, 模型层处理, 模型层, 把数据提交给逻辑层, 逻辑层和持久层进行连接, 持久层用于和数据库, 进行一对一, 一对多, 多对多关系映射, 取出数据以后, 把数据返回给逻辑层, 进行业务处理, 处理完成以后, 返回给模型层, 模型层, 拿到数据, 返回给控制层, 控制层, 拿到数据, 控制器, 进行组装视图层, 把组装好的视图层, 转换成为浏览器可以接收的 html 数据, 然后最后再把数据返回给浏览器.
上方是 MVC 的数据的流的经过
特点, 高重用性, 低耦合, 快速开发, 便捷部署.
MVC 架构
MVC 模块有以上模块, 为核心控制器, 过滤器, 拦截器, 视图管理器, 模型管理器.
核心控制器
MVC 框架入口, 接收和反馈 HTTP 请求.
过滤器
用户过滤 HTTP 请求.
拦截器
对进出, 进入的数据进行拦截
模型管理器
例如 session, 线程池等
视图管理工具
对, 视图进行管理.
提供多种语言的视图
辅助工具
例如, 文件管理, 对象管理.
数据流
数据流是先通过核心控制器, 然后, 流到过滤器, 进行表单的过滤, 再流入拦截器, 对不通过的登录进行内拦截, 业务代码写在模型层中, 对业务进行处理, 处理完成以后, 返回给控制器, 视图管理器中由 jsp 文件, 对 jsp 文件进行渲染, 返回给客户端
大致总结
这是一个目前的大致总结, 首先有一个核心控制器, 数据进入以后, 再次进入拦截器, 过滤器, 过滤器, 和拦截器, 对于用户访问 Web 资源是否具有权限进行验证, 然后再次进入模型层取出数据, 此时通知视图层进行数据更新, 最后把视图层进行返回.
统一都注册在控制器中. 包括视图管理类, 模型管理类.
每次发生改变的时候, 通过调用管理类的方式来管理模型和视图, 并且加载进入内存.
对于访问资源来说, 放置到过滤器和拦截器中.
对于业务逻辑处理放入模型层中.
对于视图层和模型层来说, 每次控制器通知模型数据更改以后, 触发一个事件, 响应到视图管理类中, 视图管理类对于视图进行渲染, 即生成 HTML 文件, 把生成的 HTML 文件的 URL 直接返回给控制器, 控制器再次返回给浏览器.
大致总结
对于 MVC 来说, 首先有两个管理类, 即, 视图管理类和模型管理类, 注册在控制器中, 控制器基于 servlet, 每次发生请求的时候, 控制器接收到请求, 然后传递给拦截器, 和过滤器, 拦截器和过滤器, 用于进行身份验证, 和访问资源的验证, 然后通过管理类暴露在外的接口, 调用模型层, 以及书写在模型层中业务代码, 包括数据库的读取, 模型层数据更新以后, 通过观察者模式, 通知视图层的管理类, 对视图中的数据进行渲染成为 HTML 文件, 由 JSP 文件直接渲染成为 HTML 文件, 涉及到编译原理的一些知识, 最后把生成的 URL 直接返回给控制器, 控制器拿到 URL, 把 URL 返回给浏览器.
来源: https://yq.aliyun.com/articles/689843