狠狠撸

狠狠撸Share a Scribd company logo
MVC 详解:了解真正所谓的"框架"


 现在许许多多的初学者和程序员,都在趋之若鹜地学习 Web 开发的宝典级框架:
Struts2,Spring,Hibernate。似乎这些框架成为了一个人是否精通 Java,是否会写 J2EE
程序的唯一事实标准和找工作的必备基础。

 然而,如果在面试的时候问这些程序员,你们为什么要学习这些框架?这些框架的本质到底
是什么?似乎很少很少有人能够给我非常满意的答复。因为他们都在为了学习而学习,为了工
作而学习,而不是在真正去深入了解一个框架。其实所有的人都应该思考这样的问题:为什么
要学习框架?框架到底给我带来了什么?接下来,我们以登录作为一个最简单的例子,来看看
不同的年代,我们是怎么写 Web 程序的。

在很多年前,我们这么写程序的

 很多年前,那是一个贫苦的年代,如果我们要使用 Java 在网页上做一些动态的交互功能。
很多人会告诉你一个技术,叫做 JSP。在我还对 Java 非常困惑的时候,就有人告诉我,JSP 是
个好东西,它可以在 HTML 代码里面写 Java 代码来完成逻辑。

 Html 代码:




 作为一张 JSP,它可以接收从别的 JSP 发送过来的登录请求,并进行处理。这样,我们不需
要任何额外的配置文件,也不需要任何框架的帮忙,就能完成逻辑。

后来,我们放弃了在页面上写逻辑

 后来,程序写得越来越多,我们发现,这种在 HTML 代码中编写 Java 代码来完成逻辑的方
式存在着不少问题:
1. Java 代码由于混杂在一个 HTML 环境中而显得混乱不堪,可读性非常差。一个 JSP 文件
有时候会变成几十 K,甚至上百 K。要找一段逻辑,经常无法定位。

 2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不知道别人是不是已经曾经实
现过类似的功能,到哪里去引用。

 3. 突然之间,某个需求发生了变化。于是,每个人蒙头开始全程替换,还要小心翼翼的,
生怕把别人的逻辑改了。

 4. 逻辑处理程序需要自己来维护生命周期,对于类似数据库事务、日志等众多模块无法统
一支持。

 在这个时候,如果有一个产物,它能够将页面上的那些 Java 代码抽取出来,让页面上尽量
少出现 Java 代码,该有多好。于是许多人开始使用 servlet 来处理那些业务逻辑。

 Java 代码:




 在这里,我们需要在 web.xml 中为这个 servlet 配置 url 的请求关系。

 Xml 代码:
代码重构到这里,我们发现,其实我们的工作量本身并没有减少,只是代码从 JSP 移动到了
Servlet,使得整个流程看上去稍微清楚了一些。然而,为了这么点干净,我们付出的代价是
什么?为每个 servlet 都在 web.xml 里面去做一个 url 的请求配置!

再后来,出现框架

 时代进一步发展,人们发现简单的 JSP 和 Servlet 已经很难满足人们懒惰的要求了。于是,
人们开始试图总结一些公用的 Java 类,来解决 Web 开发过 程中碰到的问题。这时,横空出
世了一个框架,叫做 struts。它非常先进地实现了 MVC 模式,成为了广大程序员的福音。

 struts 的代码示例我就不贴了,网上随便搜搜你可以发现一堆一堆的。在一定程度
上,struts 能够解决 web 开发中的职责分配问题,使得显示与逻辑 分开。不过在很长一段时
间内,使用 struts 的程序员往往无法分别我们到底需要 web 框架帮我们做什么,我们到底需
要它完成点什么功能?

我们到底要什么

 在回顾了我们写代码的历史之后,我们回过头来看看,我们到底要什么?

 无论是使用 JSP,还是使用 Struts1,或是 Struts2,我们至少都需要一些必须的元素(如
果没有这些元素,或许我还真不知道这个程序会写成什么样子):

 1. 数据

 在这个例子中,就是 name 和 password。他们共同构成了程序的核心载体。事实上,我们
往往会有一个 User 类来封装 name 和 password,这样会使得我们的程序更加 OO。无论怎
么说,数据会穿插在这个程序的各处,成为程序运行的核心。

 2. 页面展示

 在这个例子中,就是 login.jsp。没有这个页面,一切的请求、验证和错误展示也无从谈
起。在页面上,我们需要利用 HTML,把我们需要展现的数据都呈现出来。同时我们也需要完
成一定的页面逻辑,例如,错误展示,分支判断等等。
3. 处理具体业务的场所

   在这里,不同阶段,处理具体业务的场所就不太一样。原来用 JSP 和 Servlet,后来用
Struts1 或者 Struts2 的 Action。

 上面的这些必须出现的元素,在不同的年代,被赋予了不同的表现形式,有的受到时代的束
缚,其表现形式非常落后,有的已经不再使用。但是拨开这些外在的表现形式,我们就可以发
现,这不就是我们已经熟门熟路的 MVC 嘛?

 数据 ———— Model

 页面展示 ———— View

 处理具体业务的场所 ———— Control

   所以,框架不重要,概念是王道。只要能够深刻理解 MVC 的概念,框架对你来说,只是一
个 jar 包而已。

 MVC 的概念其实就那么简单,这些概念其实早已深入我们的内心,而我们所缺乏的是将其
本质挖掘出来。我们来看看下面这幅图,这是一副流行了很多年的讲述 MVC 模型的图:




 在这幅图中,MVC 三个框框各司其职,结构清晰明朗。不过我觉得这幅图忽略了一个问
题,就是数据是动的,数据在 View 和 Control 层一旦动起来,就会产生许多的问题:

 1. 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串,转化成一个个生龙
活虎的 Java 对象

 2. 数据从 View 层传递到 Control 层,如何方便的进行数据格式和内容的校验?

 3. 数据从 Control 层传递到 View 层,一个个生龙活虎的 Java 对象,又如何在页面上以各
种各样的形式展现出来
4. 如果你试图将数据请求从 View 层发送到 Control 层,你如何才能知道你要调用的究竟
是哪个类,哪个方法?一个 Http 的请求,又如何与 Control 层的 Java 代码建立起关系来?

 除此之外,Control 层似乎也没有想象中的那么简单,因为它作为一个控制器,至少还需要
处理以下的问题:

 1. 作为调用逻辑处理程序的 facade 门面,如果逻辑处理程序发生了异常,我们该如何处
理?

 2. 对于逻辑处理的结果,我们需要做怎么样的处理才能满足丰富的前台展示需要?

 这一个又一个问题的提出,都基于对 MVC 的基本概念的挖掘。所以,这些问题都需要我们
在写程序的时候去一一解决。说到这里,这篇文章开头所提的问题应该可 以有答案了:框架是
为了解决一个又一个在 Web 开发中所遇到的问题而诞生的。不同的框架,都是为了解决不同
的问题,但是对于程序员而言,他们只是 jar 包 而已。框架的优缺点的评论,也完全取决于其
对问题解决程度和解决方式的优雅性的评论。所以,千万不要为了学习框架而学习框架,而是
要为了解决问题而学习框 架,这才是一个程序员的正确学习之道。
Ad

Recommended

十张叫做幸福的图片
十张叫做幸福的图片
wensheng wei
?
管理员必备的20个 Linux系统监控工具
管理员必备的20个 Linux系统监控工具
wensheng wei
?
信息时代的组合数学
信息时代的组合数学
wensheng wei
?
Ubuntu 下安装 svn 服务器
Ubuntu 下安装 svn 服务器
wensheng wei
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
wensheng wei
?
罢辞尘肠补迟源码学习1
罢辞尘肠补迟源码学习1
wensheng wei
?
【转】颁痴厂使用手册
【转】颁痴厂使用手册
wensheng wei
?
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
wensheng wei
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
The Most Important Algorithms
The Most Important Algorithms
wensheng wei
?
常用数据库的链接方法
常用数据库的链接方法
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
鲍产耻苍迟耻安装厂痴狈总结
鲍产耻苍迟耻安装厂痴狈总结
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
罢飞颈迟迟别谤新手使用教程
罢飞颈迟迟别谤新手使用教程
wensheng wei
?
PHP-Debug-Manual-public
PHP-Debug-Manual-public
wensheng wei
?
你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
几米语录(1)
几米语录(1)
wensheng wei
?
我的简历
我的简历
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?
Linux Security Quick Reference Guide
Linux Security Quick Reference Guide
wensheng wei
?

More Related Content

Viewers also liked (10)

础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
wensheng wei
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
The Most Important Algorithms
The Most Important Algorithms
wensheng wei
?
常用数据库的链接方法
常用数据库的链接方法
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
鲍产耻苍迟耻安装厂痴狈总结
鲍产耻苍迟耻安装厂痴狈总结
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
罢飞颈迟迟别谤新手使用教程
罢飞颈迟迟别谤新手使用教程
wensheng wei
?
PHP-Debug-Manual-public
PHP-Debug-Manual-public
wensheng wei
?
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
wensheng wei
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
The Most Important Algorithms
The Most Important Algorithms
wensheng wei
?
常用数据库的链接方法
常用数据库的链接方法
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
鲍产耻苍迟耻安装厂痴狈总结
鲍产耻苍迟耻安装厂痴狈总结
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
罢飞颈迟迟别谤新手使用教程
罢飞颈迟迟别谤新手使用教程
wensheng wei
?
PHP-Debug-Manual-public
PHP-Debug-Manual-public
wensheng wei
?

More from wensheng wei (20)

你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
几米语录(1)
几米语录(1)
wensheng wei
?
我的简历
我的简历
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?
Linux Security Quick Reference Guide
Linux Security Quick Reference Guide
wensheng wei
?
issue35 zh-CN
issue35 zh-CN
wensheng wei
?
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
wensheng wei
?
如何硬盘安装耻产耻苍迟耻8.10
如何硬盘安装耻产耻苍迟耻8.10
wensheng wei
?
ubunturef
ubunturef
wensheng wei
?
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
wensheng wei
?
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
wensheng wei
?
尘测蝉辩濒的字符串函数
尘测蝉辩濒的字符串函数
wensheng wei
?
你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?
Linux Security Quick Reference Guide
Linux Security Quick Reference Guide
wensheng wei
?
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
wensheng wei
?
如何硬盘安装耻产耻苍迟耻8.10
如何硬盘安装耻产耻苍迟耻8.10
wensheng wei
?
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
wensheng wei
?
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
wensheng wei
?
尘测蝉辩濒的字符串函数
尘测蝉辩濒的字符串函数
wensheng wei
?
Ad

惭痴颁详解:了解真正所谓的

  • 1. MVC 详解:了解真正所谓的"框架" 现在许许多多的初学者和程序员,都在趋之若鹜地学习 Web 开发的宝典级框架: Struts2,Spring,Hibernate。似乎这些框架成为了一个人是否精通 Java,是否会写 J2EE 程序的唯一事实标准和找工作的必备基础。 然而,如果在面试的时候问这些程序员,你们为什么要学习这些框架?这些框架的本质到底 是什么?似乎很少很少有人能够给我非常满意的答复。因为他们都在为了学习而学习,为了工 作而学习,而不是在真正去深入了解一个框架。其实所有的人都应该思考这样的问题:为什么 要学习框架?框架到底给我带来了什么?接下来,我们以登录作为一个最简单的例子,来看看 不同的年代,我们是怎么写 Web 程序的。 在很多年前,我们这么写程序的 很多年前,那是一个贫苦的年代,如果我们要使用 Java 在网页上做一些动态的交互功能。 很多人会告诉你一个技术,叫做 JSP。在我还对 Java 非常困惑的时候,就有人告诉我,JSP 是 个好东西,它可以在 HTML 代码里面写 Java 代码来完成逻辑。 Html 代码: 作为一张 JSP,它可以接收从别的 JSP 发送过来的登录请求,并进行处理。这样,我们不需 要任何额外的配置文件,也不需要任何框架的帮忙,就能完成逻辑。 后来,我们放弃了在页面上写逻辑 后来,程序写得越来越多,我们发现,这种在 HTML 代码中编写 Java 代码来完成逻辑的方 式存在着不少问题:
  • 2. 1. Java 代码由于混杂在一个 HTML 环境中而显得混乱不堪,可读性非常差。一个 JSP 文件 有时候会变成几十 K,甚至上百 K。要找一段逻辑,经常无法定位。 2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不知道别人是不是已经曾经实 现过类似的功能,到哪里去引用。 3. 突然之间,某个需求发生了变化。于是,每个人蒙头开始全程替换,还要小心翼翼的, 生怕把别人的逻辑改了。 4. 逻辑处理程序需要自己来维护生命周期,对于类似数据库事务、日志等众多模块无法统 一支持。 在这个时候,如果有一个产物,它能够将页面上的那些 Java 代码抽取出来,让页面上尽量 少出现 Java 代码,该有多好。于是许多人开始使用 servlet 来处理那些业务逻辑。 Java 代码: 在这里,我们需要在 web.xml 中为这个 servlet 配置 url 的请求关系。 Xml 代码:
  • 3. 代码重构到这里,我们发现,其实我们的工作量本身并没有减少,只是代码从 JSP 移动到了 Servlet,使得整个流程看上去稍微清楚了一些。然而,为了这么点干净,我们付出的代价是 什么?为每个 servlet 都在 web.xml 里面去做一个 url 的请求配置! 再后来,出现框架 时代进一步发展,人们发现简单的 JSP 和 Servlet 已经很难满足人们懒惰的要求了。于是, 人们开始试图总结一些公用的 Java 类,来解决 Web 开发过 程中碰到的问题。这时,横空出 世了一个框架,叫做 struts。它非常先进地实现了 MVC 模式,成为了广大程序员的福音。 struts 的代码示例我就不贴了,网上随便搜搜你可以发现一堆一堆的。在一定程度 上,struts 能够解决 web 开发中的职责分配问题,使得显示与逻辑 分开。不过在很长一段时 间内,使用 struts 的程序员往往无法分别我们到底需要 web 框架帮我们做什么,我们到底需 要它完成点什么功能? 我们到底要什么 在回顾了我们写代码的历史之后,我们回过头来看看,我们到底要什么? 无论是使用 JSP,还是使用 Struts1,或是 Struts2,我们至少都需要一些必须的元素(如 果没有这些元素,或许我还真不知道这个程序会写成什么样子): 1. 数据 在这个例子中,就是 name 和 password。他们共同构成了程序的核心载体。事实上,我们 往往会有一个 User 类来封装 name 和 password,这样会使得我们的程序更加 OO。无论怎 么说,数据会穿插在这个程序的各处,成为程序运行的核心。 2. 页面展示 在这个例子中,就是 login.jsp。没有这个页面,一切的请求、验证和错误展示也无从谈 起。在页面上,我们需要利用 HTML,把我们需要展现的数据都呈现出来。同时我们也需要完 成一定的页面逻辑,例如,错误展示,分支判断等等。
  • 4. 3. 处理具体业务的场所 在这里,不同阶段,处理具体业务的场所就不太一样。原来用 JSP 和 Servlet,后来用 Struts1 或者 Struts2 的 Action。 上面的这些必须出现的元素,在不同的年代,被赋予了不同的表现形式,有的受到时代的束 缚,其表现形式非常落后,有的已经不再使用。但是拨开这些外在的表现形式,我们就可以发 现,这不就是我们已经熟门熟路的 MVC 嘛? 数据 ———— Model 页面展示 ———— View 处理具体业务的场所 ———— Control 所以,框架不重要,概念是王道。只要能够深刻理解 MVC 的概念,框架对你来说,只是一 个 jar 包而已。 MVC 的概念其实就那么简单,这些概念其实早已深入我们的内心,而我们所缺乏的是将其 本质挖掘出来。我们来看看下面这幅图,这是一副流行了很多年的讲述 MVC 模型的图: 在这幅图中,MVC 三个框框各司其职,结构清晰明朗。不过我觉得这幅图忽略了一个问 题,就是数据是动的,数据在 View 和 Control 层一旦动起来,就会产生许多的问题: 1. 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串,转化成一个个生龙 活虎的 Java 对象 2. 数据从 View 层传递到 Control 层,如何方便的进行数据格式和内容的校验? 3. 数据从 Control 层传递到 View 层,一个个生龙活虎的 Java 对象,又如何在页面上以各 种各样的形式展现出来
  • 5. 4. 如果你试图将数据请求从 View 层发送到 Control 层,你如何才能知道你要调用的究竟 是哪个类,哪个方法?一个 Http 的请求,又如何与 Control 层的 Java 代码建立起关系来? 除此之外,Control 层似乎也没有想象中的那么简单,因为它作为一个控制器,至少还需要 处理以下的问题: 1. 作为调用逻辑处理程序的 facade 门面,如果逻辑处理程序发生了异常,我们该如何处 理? 2. 对于逻辑处理的结果,我们需要做怎么样的处理才能满足丰富的前台展示需要? 这一个又一个问题的提出,都基于对 MVC 的基本概念的挖掘。所以,这些问题都需要我们 在写程序的时候去一一解决。说到这里,这篇文章开头所提的问题应该可 以有答案了:框架是 为了解决一个又一个在 Web 开发中所遇到的问题而诞生的。不同的框架,都是为了解决不同 的问题,但是对于程序员而言,他们只是 jar 包 而已。框架的优缺点的评论,也完全取决于其 对问题解决程度和解决方式的优雅性的评论。所以,千万不要为了学习框架而学习框架,而是 要为了解决问题而学习框 架,这才是一个程序员的正确学习之道。