1. 三层架构与MVC
三层架构:表现层、业务层、持久层
MVC是表现层功能页面的组织方式,包括数据,页面控件,页面中的操作。
解释了为什么说一些js框架声称支持MVC。
2. 标准MVC
从Head First 设计模式一书中了解到,MVC是对多个设计模式的一种组合应用。
M封装了数据和业务逻辑方法。
V封装了页面控件,从M中获取数据,初始化控件的值,监听M中数据的变化,更新控件的值。使用了观察者模式。同时V中控件是一个组合过程,使用了组合模式。
C封装了页面控件的操作,监听控件的事件,进行一些行为处理,行为包括调用M中的业务逻辑方法,修改V中控件的状态。C代表行为,是可以替换的,使用了策略模式。
![](/qrcode.jpg)
3. CS的MVC与BS的MVC
CS的MVC
符合标准MVC的使用
表现层 <------------------http -----------------> 业务层,持久层
MVC同处于一个环境中,可以搭建标准MVC的对象依赖关系。
BS的MVC
不符合标准MVC的使用,是一个适应后的产品
表现层(浏览器) <-----------------http--------------------> 表现层(服务器),业务层,持久层
V(html) + C(js) C(struts) V(jsp) M
MVC没有处于同一个环境,不能搭建标准MVC的对象依赖关系,只能有所取舍,或者通过其他途径实现类似的效果。
封装数据的M没有了,初始化页面的数据直接来源于数据库表(也可以通过session缓存数据对象)。
V没有监听M中数据的变化,不会根据数据而更新视图(利用session + ajax也可以达到这种效果)。没有使用观察者模式。
C通过js监听按钮事件发起http请求,struts接收请求,可以调用M的业务逻辑方法,可以返回完整页面或通过ajax更新部分页面。没有使用策略模式。
4. 真实数据和克隆数据
这里讨论一下MVC中M缓存的数据。这个数据是从数据库查询出来的,如果数据库中的数据是真实数据,那么M中封装的数据是克隆数据,这份数据用于支持表现层页面中数据的编辑,如果表现层页面最终保存,则将该数据持久化到数据库中,如果表现层页面最终关掉了,则该临时数据直接丢掉。
但在BS程序中的M一般没有缓存该临时数据,对数据的查询,更新直接对数据库表,这样就没有刚才的灵活性,导致一些过程数据(可能保存,也可能不保存)被放入数据库表中,如果保存了,就认为是正式数据,如果是关掉了,就认为是垃圾数据,这样就不灵活。当然可以通过session来缓存一份克隆数据是比较好的,这样就和标准MVC中的使用类似了。