`
javawl
  • 浏览: 28073 次
  • 性别: 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(Model-View-Controller)是一种软件设计模式,用于组织代码,使业务逻辑和数据显示分离。MVC 模式将应用程序分成三个核心部件:模型、视图、控制器。模型负责处理数据和业务逻辑,视图负责...

    mvc开发的概念及原理

    【MVC 开发的概念及原理】 MVC,全称Model-View-Controller,是一种软件设计模式,最初在桌面应用程序中应用,后来广泛应用于Web开发领域,尤其是Java、PHP、.NET等平台。MVC模式的主要目标是实现Web系统的职责分离...

    MVC基础概念

    #### 一、MVC概念与架构 **MVC**,即**模型-视图-控制器**(Model-View-Controller),是一种广泛应用于软件开发领域的设计模式,旨在通过清晰地划分应用程序的不同组件来提高代码的可维护性和可扩展性。 - **模型...

    基于mvc概念的音乐swift书写

    本项目"基于mvc概念的音乐swift书写"旨在通过实践来理解并应用MVC(Model-View-Controller)设计模式,这是一种在软件工程中广泛采用的架构模式,尤其在构建用户界面时。 **MVC模式详解** MVC模式是软件设计中的一...

    154-MVC概念讲解

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

    Spring MVC基本概念

    ### Spring MVC基本概念 在Java Web开发领域,Spring MVC框架是一种非常流行的模型-视图-控制器(Model-View-Controller,MVC)架构实现。它主要用于构建清晰、可维护的Web应用程序。对于初学者而言,了解Spring ...

    MVC设计模式概念及优缺点

    ### MVC设计模式概念及优缺点 #### 一、MVC设计模式的概念 MVC(Model-View-Controller)设计模式是一种广泛应用于软件工程中的架构模式,尤其在Web开发领域非常流行。该模式的核心理念在于将应用程序划分为三个...

    coremvc php mvc

    在IT行业中,`CoreMvc`通常指的是一个针对PHP框架的核心MVC(Model-View-Controller)实现。MVC模式是一种广泛应用于Web应用开发的设计模式,它将...了解和掌握其核心概念和技术,对于提升PHP Web开发能力非常有帮助。

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

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

    C++实现简单的MVC框架

    本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...

    mvc程序实例-mvc程序实例

    在“Mvc程序实例”中,我们将深入探讨 ASP.NET MVC 的核心概念和实践应用。 **一、Model(模型)** 模型是应用程序的核心部分,负责业务逻辑和数据管理。在 ASP.NET MVC 中,模型通常由实体类或业务对象组成,它们...

    中文版小MVC

    `中文版小MVC`是一个专为英语能力有限的开发者设计的简单MVC框架实现,其代码尽可能使用中文注释,以便于理解和学习MVC模式的基本概念。MVC(Model-View-Controller)是一种广泛应用于Web开发的设计模式,它将业务...

    Spring MVC jar包

    - **基本概念**:Spring MVC提供了一个灵活的MVC实现,包括请求映射、视图解析、模型绑定等功能。它通过DispatcherServlet作为前端控制器,负责接收请求并分发到相应的处理器。 - **组件**:主要包括Model、View、...

    asp.net mvc3

    #### 四、控制器概念 在传统的Web框架中,传入的URL通常直接映射到磁盘上的文件,例如“/Products.aspx”或“/Products.php”这类请求可能会被“Products.aspx”或“Products.php”文件处理。而在基于Web的MVC框架...

    s:mvcURL如何使用

    在Spring MVC 4.1.x框架中,`mvcURL`是一个关键的概念,它涉及到控制器(Controller)与视图(View)之间的交互。本篇将详细解释`mvcURL`的使用方法,以及它如何帮助我们构建高效、灵活的Web应用程序。 首先,`mvc...

    asp.Net mvc4 实例

    下面将详细介绍ASP.NET MVC4的一些核心概念和开发流程。 1. **模型(Model)**:模型是应用程序中的业务逻辑部分,它负责处理数据和业务规则。在ASP.NET MVC4中,我们通常使用Entity Framework与SQL2008数据库进行...

    基于ASP.NET MVC项目实例

    - **了解基本概念**:首先,你需要熟悉MVC模式的基本原理,以及ASP.NET MVC框架的关键组件。 - **安装环境**:确保你已安装了Visual Studio,并创建一个新的ASP.NET MVC项目。 - **分析项目结构**:查看...

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

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

    asp.net mvc博客Blog源码

    在本“asp.net mvc博客Blog源码”项目中,我们可以深入学习和理解ASP.NET MVC的核心概念和技术。 首先,我们要了解ASP.NET MVC的基本架构。它遵循模型-视图-控制器(MVC)设计模式,将应用逻辑分为三个主要组件:...

    MVC的基本介绍

    #### 一、MVC的概念与定义 MVC,即Model-View-Controller(模型-视图-控制器)模式,是一种广泛应用于软件工程中的架构模式,特别是Web开发领域。MVC的设计思想旨在将应用程序的不同部分进行分离,以此达到业务逻辑...

Global site tag (gtag.js) - Google Analytics