两种 MVC 模式
来源:互联网 发布:社交网络利弊英语作文 编辑:程序博客网 时间:2024/05/22 11:32
最近有些朋友一直在问我关于 Smart Framework 中 MVC 的问题,为什么和传统的 MVC 不一样?在传统的 MVC 中,由 Controller 接收请求,将数据封装为 Model 的形式,并将其传入 View 中。
可见,Model 是由 Controller 推送到 View 上的,不妨称它为“正向 MVC”,它是一种“推模式(Push Pattern)”。
与其相反,就有“反向 MVC”,它是一种“拉模式(Pull Pattern)”。
可见,Model 是由 View 从 Controller 中拉过去的。Smart Framework 目前就是选择的这种“反向 MVC”模式。直接在 HTML(也就是View)中发送 AJAX 请求,该请求由 Action(也就是 Controller)接收,随后将数据模型转为 JSON 格式返回到 HTML 中。
对于大多数用户而言,“反向 MVC”似乎有些别扭,但它确实有其价值。著名的 Ext JS 框架就推荐使用这种“反向 MVC”,因为所有的请求都由 View 来发出,响应也由 View 来渲染。可见,“反向 MVC”是实现富客户端 Web 应用程序的利器!
Push
Pull
Controller解释用户行为,产生相应的data并推送到View上
假设用户需要某种输出,因此View去访问Controller,拿到所需data后呈现给用户
适用于执行(用户)行为和任务
e.g. 添加用户评价
适用于响应显示data的需求
e.g. 显示客户信息及购物清单
通常涉及一个Controller及对应的View
通常涉及一个View和多个Controller
推送专门为某个View的data
e.g. JSP中用tag取得data
推送各个View都可以用的data
e.g. JSP中从Context中取得data
更好地分离View
分离View做的不太好
由于 Smart Framework 是一款易用的轻量级 Java Web 框架,却不能实现传统的“正向 MVC”,这岂不是有些说不过去了?也不符合大众胃口啊!
所有非常有必要对 MVC 框架进行扩展,同时满足“正向 MVC”与“反向 MVC”。
经与网友们沟通,现得出以下几种方案,用一个 Action 代码示例来说明这一切:
方案一
@Request("get:/foo")public Page index() { String aaa = "aaa"; String bbb = "bbb"; String ccc = "ccc"; return new Page("foo.jsp") .data("aaa", aaa) .data("bbb", bbb) .data("ccc", ccc);}
该 Action 方法返回一个 Page 对象,在 return 语句中创建 Page 对象,在构造器中传入 View,并通过一系列的 data() 链式方法传递 Model。
方案二
@Request("get:/foo")public Page index() { String aaa = "aaa"; String bbb = "bbb"; String ccc = "ccc"; Map<String, Object> data = new HashMap<String, Object>(); data.put("aaa", aaa); data.put("bbb", bbb); data.put("ccc", ccc); return new Page("foo.jsp", data);}
首先构造一个 Map<String, Object>,用于封装 Model,最后返回 Page 对象,在构造器同时传入 View 与 Model。
方案三
@Request("get:/foo")public Page index() { String aaa = "aaa"; String bbb = "bbb"; String ccc = "ccc"; return new Page("foo.jsp", "aaa", aaa, "bbb", bbb, "ccc", ccc );}
返回 Page 对象,无需构造 Map 与调用链式 data() 方法,第一个参数为 View,随后采用动态参数(Object …)方式,传入 Model 的 key-value 对,基数表示 key,偶数表示 value。
方案四
@Request("get:/foo")public String index(Model model) { String aaa = "aaa"; String bbb = "bbb"; String ccc = "ccc"; model.put("aaa", aaa); model.put("bbb", bbb); model.put("ccc", ccc); return "foo.jsp";}
不再返回 Page 对象,而是返回一个 String 类型的 View,将 Model 对象通过参数传递进来(其实就是一个 Map),并通过 put() 方法初始化 Model。注意:此时无需将 Model 返回,因为它是由框架进行管理的。
对于以上三种方案,均有利弊,还请广大网友提供进行评判,或给出更好的方案。期待您的反馈!
转载:http://www.kankanews.com/ICkengine/archives/62597.shtml
- 两种 MVC 模式
- MVC模式的两种不同解读
- 两种架构模式:分层与MVC
- 两种变现模式mvc和mvp的对比
- MVC和MVP两种框架设计模式
- MVC学习系列-WebForm与asp.net MVC两种设计模式区别、MVC设计模式基础了解
- MVC框架下工厂方法模式挑奇偶(视图与控制台两种view模式)
- Spring MVC 两种方式
- ASP.NET平台下MVC与WebForm两种模式区别(图解)
- EXTJS4.0 MVC 模式下 表格grid的两种更新方式
- Android中常用的两种框架设计模式 MVC和MVP,MVVM
- CDialog两种模式
- 两种赚钱模式
- EPOLL两种模式
- webserver 两种模式
- 两种适配器模式
- apache 两种模式
- Struts VS Spring 两种MVC框架
- UVa 1587 Box
- linux驱动之LED驱动_2
- 我的软考之路(七)——数据结构与算法(5)之查找
- java之多线程解决TCP服务端并发上传
- 黑马程序员——Java基础——GUI
- 两种 MVC 模式
- Android 拨打电话和发送短信
- Linux开发平台的搭建之Vim
- 利用DiskGenius三部扩展Windows系统盘大小(扩展C盘)
- 我的软考之路(六)——数据结构与算法(4)之八大排序
- 编译hadoop的eclipse
- FFT算法的完整DSP实现
- MyEclipseGen(7.0神器)
- Linux 系统安装