`
javawl
  • 浏览: 26780 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MVC概念(转)

阅读更多

MVC的概念已经深入人心,是经常被大家经常提到的法宝利器。 
我感到有必要澄清MVC的概念和来龙去脉,以便大家有一个共识,有一个共同讨论的基础,以便能够把讨论更深入地进行下去,解决真正的问题,而不是在一些技术概念上绕圈子。 

一般来说,我不喜欢在名词概念上做文章,发表看法和评论。因为有更多的真正有挑战性的问题需要解决。但通过这段时间的讨论,我感到一种这样的危险: 
我们程序员是否过于迷信MVC之类的名词概念,是否可能因此而减弱了或丧失了独立思考的能力? 
所以我甘冒天下之大不韪,直言不讳了。 

先举一个例子。 
很多程序员言必讲,“和页面显示相关的逻辑,只应该存在于View里面,而不应该存在于任何其它部分的代码里面。” 
但很少有人真正思考,这个概念从何而来。大家隐约地觉得这个概念来自于MVC。但为什么会有这个概念?这个概念的真实来源是什么? 
其实,MVC中关于View的原意是这么说的,“View里面只应该存在和显示有关的逻辑,而不应该存在任何其它的逻辑——比如访问数据库,调用业务逻辑之类”。 
纠其源头,这是针对很多程序员在JSP中调用JDBC的现象。 

大家仔细比较一下这两句话的区别。可以看出对一个概念的执著和崇拜能够达到怎样的一种潜移默化的思维效果。 
本意是为了降低View的作用,只让View做这一件事情,不让View做越权的事情。结果成为:只有View才能做这件事情,其它部分没有权利做这件事情。 

那么我们来看,所有的MVC框架中,View部分做到了“只和显示逻辑相关” 吗?View能够脱离数据部分单独存在吗?不管是用JSP,Velocity,还是用TagLib,View都必须知道自己所使用的Object的数据结构,必须访问这些Object的各种属性,才能把它们显示出来。这个View和Model分开了吗?能分开吗? 
从概念来讲,MVC是一个完备的概念吗?能够自圆其说吗? 

Struts是最流行的Web框架,也正是Struts令MVC概念风靡世界,成为Web程序员的圣经。 
下面,我们来确认一下什么是MVC和MVC的来龙去脉。 
MVC要求,Model把数据填充到request.attribute里面,通过Controller转发,View再把这些数据从request.attribute里面拽出来显示。 
为什么需要这个过程呢?不知道大家想过这个问题吗?更深一步,有没有想过为什么Servlet规范需要request.attribute这个定义呢? 

因为你没有别的方式把数据从Model传到View里面去。 
MVC是为了解决JSP的天生缺陷而引入(原文为创造,错误)的。因为JSP是Servlet。你必须请求Web Server帮你定位并调用JSP/Servlet。 
你必须调用 request.getRequestDispatcher("your.jsp").include(). 
既然如此,如何在Servlet之间传输数据?只能通过request.attribute。 

Velocity本来和MVC毫无关系,你完全可以在Action里面直接定位调用Velocity Template。 
但为了支持MVC,Velocity不得已做了妥协,做了Velocity-tools,来支持MVC。 

有兴趣请阅读org.apache.velocity.tools.view.servlet的 
VelocityViewServlet类的代码。 
你可以看到,Velocity是如何支持MVC的,付出了如何的代价。 
Servlet规范又付出了怎样的代价。 
参见VelocityViewServlet类的一段代码。 
代码: 

Java代码   收藏代码
  1.  * @return Velocity Template object or null   
  2.  */   
  3. protected Template handleRequest(HttpServletRequest request,   
  4.                                  HttpServletResponse response,   
  5.                                  Context ctx)   
  6.     throws Exception   
  7. {   
  8.     // If we get here from RequestDispatcher.include(), getServletPath()   
  9.     // will return the original (wrong) URI requested.  The following special   
  10.     // attribute holds the correct path.  See section 8.3 of the Servlet   
  11.     // 2.3 specification.   
  12.     String path = (String)request.getAttribute("javax.servlet.include.servlet_path");   
  13.     if (path == null)   
  14.     {   
  15.         path = request.getServletPath();   
  16.     }   
  17.     return getTemplate(path);   
  18. }   



fastm不具有JSP + TagLib的缺陷,没有需要MVC结构的根本需求。 
我只把MVC看作一种可供参考的架构,从来不认为MVC是圣经。既然fastm本身就是离经叛道的。 

下面我们探究一下,fastm的Data和View分离做的更好?还是MVC的Data和View分离做的更好? 

MVC的View需要了解处理各种类型的Data Object。MVC的View需要知道它们的属性名,甚至需要知道这些Data Object的属性代表什么意义,根据这些属性的值,决定怎样的显示方式(比如,赤字,还是蓝字)。这不是业务逻辑是什么? 

fastm的View(我是指Template DOM)只需要处理一种类型的Data Object – ValueSet DOM。ValueSet DOM本身就是数据和模板之间的桥梁,ValueSet DOM同时存放了数据之间的层次关系和数据本身,这正是DOM结构的精华所在。 

另外,还有一个情况就是,似乎很少有人认识到DOM概念的重要性,大部分人都执著于Page Scripting技术(JSP,Velocity)。 

另一个很古怪的现象就是,TagLib和Page Compent的概念,天生就是和Page Scripting技术(JSP,Velocity)技术 是对立的思路,却共存在View中,也从来没有人质疑。大家都把这当作一种经典思路,努力消化接受了,还研究颇深。其实这不过是 技术自身“修修补补”的结果而已。

分享到:
评论

相关推荐

    MVC的概念与解释

    定义MVC概念,从全局把握MVC架构,参数MVC的优点与缺点

    mvc开发的概念及原理

    MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller)

    154-MVC概念讲解

    布尔商城PHP实战视频程公益课154-MVC概念讲解,老师讲的很好,深入浅出

    MVC基础概念

    私人精心准备的PPT文档,详细概述了MVC的初步概念、工作原理、请求处理过程、路由及MVC的特有属性及命名规则等!

    Spring MVC基本概念

    系统开发 Spring MVC框架的基本概念 初学适用

    基于mvc概念的音乐swift书写

    只是简单的代码结构的练习

    MVC2.0入门必读教程程序源码

    本系列文章作为一个ASP.NET MVC的入门教程,将不会长篇大论介绍其中的概念及理论。而是通过案例实践来学习ASP.NET MVC。在这系列文章中我将逐步完成一个“公告发布系统”。我的写作策略是:先动手做,遇到需要解释...

    MVC设计模式概念及优缺点

    MVC三层架构 MVC是 模型(Model),视图(View)和控制(Controller)的缩写,其目的实现Web系统的职能分工。其中Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现; View层用于与用户的交互,通常用JSP来实现...

    什么是MVC framework

    mvc概念描述,mvc model1 , mvc model2 mvc概念描述,mvc model1 , mvc model2 mvc概念描述,mvc model1 , mvc model2 mvc概念描述,mvc model1 , mvc model2

    CPW213-eCommerceSite:学习ASP.NET Core MVC概念的基本电子商务站点

    CPW213-eCommerceSite 学习ASP.NET Core MVC概念的基本电子商务网站,这是一个类项目,用于创建数据驱动网站的实践。先决条件 具有ASP.NET和Web Dev工作负载或VS代码的NuGet程序包要安装在Visual Studio上帮助创建...

    Spring MVC概述

    这是一篇关于Spring MVC 的简要概述

    MVC基本概念[借鉴].pdf

    MVC基本概念[借鉴].pdf

    ASP.NET MVC 1.0高级编程

     本书由ASP.NET小组成员编写,Scott Guthrie首先提供了一个说明如何构建应用程序的完整演示,然后深入介绍MVC的基本概念和历史,并快速过渡到讨论ASP.NET MVC模式如何实现这些概念。在学习本书的过程中,您将理解...

    MVC设计模式.ppt

    但是,将这些概念运用于基于Web的企业级多层应用领域也是很适合的。 在MVC结构中,模型(Model)代表应用程序的数据(data)和用于控制访问和修改这些数据的业务逻辑(business rule)。 当模型发生改变时,它会...

    Pro ASP.NET MVC 3 Framework

    掌握了本书所介绍的概念与技术之后,MVC开发的技术水平的提高就是时间积累的问题了。 贴出来供大家下载学习,本人在自己的博客里(http://blog.csdn.net/r01cn/article/details/6750743)有本书部分章节的翻译,有...

    MVC学习资料-网页

    学习MVC时在网上找的一些介绍MVC的网页。不过大多都是讲概念性的东西。想学MVC的话建议去下载赵劼《ASP.NET MVC框架开发系列课程》我看到第七个就对MVC框架有了一些了解。

    【免费】ASP.NET MVC5 高级编程[附源码].rar

    本书的作者加洛韦不是Microsoft的ASP.NET MVC专家,就是ASP.NET MVC领域的智者,所以作为一本实用的教程,不但强化开发人员对概念的认识,也帮助开发人员创建自己的应用程序。 主要内容 解释了ASP.NET MVC框架与...

    ASP.NETMVC5(网站)开发之美pdf

    全书从快速学会Model的概念入手,讲述LINQ以及Entity Framework开发技术;深度认识Controller以及如何灵活运用、使用Routing技术,让网站在搜寻引擎中拥有高排名;View+Bootstrap应用开发;丰富实用的网站安全性技术...

    BS基础概念学习MVC、MVP等

    BS基础概念学习MVC、MVP等

    ASP.NET MVC网站编程案例精解

    《ASP.NET MVC网站编程案例精解》面向的读者是熟悉Web开发的基本概念和ASENET的Web开发人员,《ASP.NET MVC网站编程案例精解》中的所有示例是用C#语言实现的。 内容提要 ASENETMVC整合了强大的新功能,可以帮助您...

Global site tag (gtag.js) - Google Analytics