展现层与业务数据纠缠在一起,无法进行良好的解耦
2008-04-02 13:26
225 查看
1. 概述长久以来,在Web编程中,一直很难克服的一个问题就是:展现层与业务数据纠缠在一起,无法进行良好的解耦, 从而造成应用系统的扩展性差,维护成本高。于是,出现了所谓的MVC框架,试图以 Model-View-Control 这种非常流行的设计模式,将两者有效的隔离开来。但回顾目前主流的 Web MVC 架构,它们所做的绝大部分工作无非是:将页面中控件的值取出打包成 Java Bean;再无非就是在帮助你完成页面导航的过程中,辅助你进行页面参数的传递与分析。这样一种“简单 MVC”架构,是无法完全解决“展现层与业务数据完全解耦”这个问题的。 一旦你的需求超越了框架的能力,那么,你将面对的依然是:不得不在展现层中嵌入大量的 Script 代码,可能是Java代码片断,也可能是大量tag-lib及EL表达式的引入。2. 什么是IoVCIoVC——“Inversion of View-Control”,即“视图控制反转”,换言之:它能够把对“View(即 UI 视图)的控制力”注入到你的后台业务逻辑中。这样一来,你在编写业务逻辑的过程中,对 View 拥有足够的控制力,从而能够将展现层与业务逻辑完全的解耦。举一个场景:页面中有一个文本输入框,它的值对应后台的一个JavaBean的属性。我们首先来看一下传统的编程模型: Java代码 页面: <w:textField value="#{myBean.value}"/> 后台: public class MyBean { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } 页面: <w:textField value="#{myBean.value}"/> 后台: public class MyBean { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } 此时,假设用户需要发生变化,我们需要设置文本输入框的tooltip,并且,它的值来自于后台 JavaBean 的另一个属性,那么,程序需要做如下调整: Java代码 页面: <w:textField value="#{myBean.value}" tooltip="#{myBean.tooltip}"/> 后台: public class MyBean { private String value; private String tooltip; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getTooltip() { return tooltip; } public void setTooltip(String tooltip) { this.tooltip = tooltip; } } 页面: <w:textField value="#{myBean.value}" tooltip="#{myBean.tooltip}"/> 后台: public class MyBean { private String value; private String tooltip; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getTooltip() { return tooltip; } public void setTooltip(String tooltip) { this.tooltip = tooltip; } } 我们可以观察:在传统的编程模型下,如果页面逻辑发生变化,我们首先需要修改UI展现层,加上 tooltip="#{myBean.tooltip}" 的语句,然后,再在后台Bean中设置此属性值。 那么,在IoVC编程模型下,情况又是怎样的呢? Java代码 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; } 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; } 如果需要扩展文本编辑框的tooltip属性,只需要: Java代码 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; @Bind(id="txt" att="tooltip") private String tooltip; } 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; @Bind(id="txt" att="tooltip") private String tooltip; } 在IoVC编程模型下,Web页面不需要发生任何变化,你只需要在后台 Java Bean 中写上这样一行属性声明即可@Bind(id="txt" att="tooltip") private String tooltip,甚至于你连传统的getter/setter都不需要。 换言之,在传统的编程模型下,页面美工通过网页设计工具“画”出来的页面,程序员看不懂; 而如果程序员对页面进行修改,则页面美工又无法理解; 并且,如果要更改业务逻辑,程序员需要不断的维护页面内容,最终造成页面美工与程序员无法协同工作。而在 IoVC 的编程思想下,页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。Web页面在美工完成之后,程序员再也无需因为需求的变更或者逻辑的变化,而再重新维护 Web页面内容。 简而言之,IoVC是一种更好的MVC,是对MVC的一种高层次抽象。 设想一下:日后美工人员画出来的页面(只要设置了正确的ID),程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界? 更多技术文章,请见:http://www.operamasks.org/ 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。 推荐链接 IBM受欢迎信息管理软件下载推荐 | |
返回顶楼 | |
rojazz1999 等级: 初级会员 性别: 文章: 35 积分: 0 | 时间:2008-03-26 引用 收藏 收入博客 这也算新思想? |
返回顶楼 | 初级会员无法投票 |
诺铁 等级: 性别: 文章: 255 积分: 368 | 时间:2008-03-26 引用 收藏 收入博客 还真是反转。。。。等于在定义领域类时也定义它的表现方式。但是应用场景似乎很狭窄,希望楼主继续发展,并在实际项目中应用。 |
返回顶楼 | 初级会员无法投票 |
fujohnwang 等级: 初级会员 文章: 105 积分: 32 | 时间:2008-03-26 引用 收藏 收入博客 你是在造一个更强大的formbean吗? |
返回顶楼 | 初级会员无法投票 |
抛出异常的爱 等级: 性别: 文章: 7174 积分: 2432 来自: 北京 | 时间:2008-03-26 引用 收藏 收入博客 用法太有点抽象了. 如果像这样子 还不如用Tapestry |
返回顶楼 | 初级会员无法投票 |
upheart 等级: 初级会员 性别: 文章: 1 积分: 30 来自: 北京 | 时间:2008-03-26 引用 收藏 收入博客 引用 页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。 程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界? 其实wicket之类的框架早就是这样了,而且页面还是纯html的,更利于和美工合作——既然金蝶的OperaMasks都把JSF改成这个样子了,为什么不再彻底一点,像Wicket、Tapestry直接用html而不是jsp的taglib呢? OperaMasks做到现在这个样子还是很值得肯定的。 至于IoVC,我看还算不上什么编程思想,更不是什么新东西。 |
返回顶楼 | 初级会员无法投票 |
icess 等级: 文章: 121 积分: 378 | 时间:2008-03-26 引用 收藏 收入博客 apusiczhang 写道 Java代码 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; } 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; } 如果需要扩展文本编辑框的tooltip属性,只需要: Java代码 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; @Bind(id="txt" att="tooltip") private String tooltip; } 页面: <w:textField id="txt"/> 后台: public class MyBean { @Bind(id="txt") private String value; @Bind(id="txt" att="tooltip") private String tooltip; } 其实 写成那样, 还不如直接使用JSF的组件binding, 这样可以在mbean中直接操作该组件的任何信息. 不需要其他扩展了. |
返回顶楼 | 初级会员无法投票 |
robbin 等级: 性别: 文章: 4422 积分: 1175 来自: 上海 | 时间:2008-03-26 引用 收藏 收入博客 upheart 写道 引用 页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。 程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界? 其实wicket之类的框架早就是这样了,而且页面还是纯html的,更利于和美工合作——既然金蝶的OperaMasks都把JSF改成这个样子了,为什么不再彻底一点,像Wicket、Tapestry直接用html而不是jsp的taglib呢? OperaMasks做到现在这个样子还是很值得肯定的。 至于IoVC,我看还算不上什么编程思想,更不是什么新东西。 没错,我也是这种感觉。看看现在Warp-MVC就知道,IoVC早已经不是新鲜玩意,当然到这个词造的还不错。老实说还不如扔掉JSF这个包袱、大胆的走模板语言、Annotation的路。 |
返回顶楼 | 初级会员无法投票 |
allenBen 等级: 初级会员 性别: 文章: 18 积分: 10 来自: 重庆 | 时间:2008-03-26 引用 收藏 收入博客 引用 这也算新思想? 虚心受教 |
返回顶楼 | 初级会员无法投票 |
allenBen 等级: 初级会员 性别: 文章: 18 积分: 10 来自: 重庆 | 时间:2008-03-26 引用 收藏 收入博客 感觉有点像WEB-work或者struts2,直接是页面从Action里边拉数据 |
相关文章推荐
- Android展现层与业务层的数据解耦
- Android展现层与业务层的数据解耦
- 线程同步(信号量,互斥,条件变量) 分类: linux应用程序 2008-04-08 09:43 2587人阅读 评论(1) 收藏 举报 进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法
- [置顶] 对AFN 进行进一步封装,再应用于具体的项目,这样可以将业务逻辑代码与网络框架进行解耦
- 结合centreon监控平台,对rrdtool的数据进行二次分析highchart展现
- PHP使用mcrypt进行AES加密后的数据NodeJS等无法解密的问题修复方案
- SQL Server 表中有重复的数据,无法对重复数据进行更新或删除。
- 调试问题:datatables进行搜索后,再次按下分页,表格数据无法改变
- 基于Geomesa服务查询轨迹数据无法根据空间和时间范围进行结果查询
- 安装程序检测到 HTML 帮助数据文件已损坏,无法继续进行
- Hibernate审计日志时业务数据无法同步问题解决
- 为什么有时候网络状态良好但是数据却没有正常进行传输?
- 数据库全备无法正常进行,通过在出现空块的表上添加数据的手段解决
- 在进行USB CDC类开发时,无法发送64整数倍的数据
- mysql数据库在不同的服务器,无法进行数据传输,或者导入导出数据错误,原因分析
- 跪求!利用深度信念网络工具箱对凯斯西出大学轴承数据进行分类错误率无法降低怎么办
- 关于DoDataExchange无法进行控件数据更新的问题
- iOS关于如何让<界面切换逻辑>与<数据业务逻辑>解耦的探讨
- 在进行USB CDC类开发时,无法发送64整数倍的数据(续)
- 配置一对多导致json转换错误,数据无法展现的问题