东汉末年分三国 MVC模式的演进

许许多多的 java 初学者和程序员,都在趋之若鹜地学习 JavaWeb 开发的经典三大框架:无论是 SSH(Struts2,Spring,Hibernate) 还是 SSM(Spring,SpringMVC,Mybatis)似乎这些框架成为了一个人是否精通 Java,是否会写 JavaEE 程序的唯一事实标准和找工作的必备基础。

然而,很多人只是单纯为了学习而学习,为了工作而学习,并没有多少人想去深入了解一个框架。其实所有的人都应该思考这样的问题:为什么要学习框架?框架到底给我带来了什么?

其实这些框架都是在开发过程中,不断 迭代 重构 总结 出的”套路”,是一套约定俗成的设计方式。

让我们回顾过去的历史,看一下 MVC 的演化过程,希望能帮助你更好的理解 MVC...

JavaEE 发展过程中经历的模式

model1模式

原始的 JSP

技术构成: JSP + JavaBean

在很多年前,那是一个贫苦的年代,要使用 Java 在网页上做一些动态的交互功能 是通过 JSP 实现的,它可以在 HTML 代码里面写 Java 代码来完成逻辑。

Html代码:

<%  
    String name = request.getParameter("name");  
    String password = request.getParameter("password");  
    UserHandler userHandler = new UserHandler();  
    if(userHandler.authenticate(name, password)) {  
%>  
恭喜你,登录成功
<%  
     } else {  
%> 
对不起,登录失败
<%  
     }  
%>  

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

弊端:随着业务的复杂性急剧增加,如果在 JSP 页面中添加大量 Java 代码,会让整个 JSP 变得十分复杂混乱,而且不容易维护

model2模式

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

技术组成: JSP + Servlet + JavaBean 优势: 能让各个技术发挥自己擅长的方面 JSP: 页面数据动态显示 Servlet: 处理业务逻辑,处理Java代码

程序写得越来越多,这种在 HTML 代码中编写 Java 代码来完成逻辑的方式存在着不少问题:

Java代码由于混杂在一个HTML环境中而显得混乱不堪,可读性非常差。一个JSP文件有时候会变成几十K,甚至上百K。要找一段逻辑,经常无法定位。

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

在这个时候,许多人开始使用 servlet 将页面上的那些 Java 代码抽取出来,处理那些业务逻辑。 让页面上尽量少出现Java代码,于是:

Java代码

public class LoginServlet extends HttpServlet {  
   @Override  
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
       
       String message = null;  
       RequestDispatcher dispatcher = req.getRequestDispatcher("/result.jsp");  
       String name = req.getParameter("name");  
       String password = req.getParameter("password");            
       UserHandler userHandler = new UserHandler(); 
        
       if(userHandler.authenticate(name, password)) {  
           message = "恭喜你,登录成功";  
       } else {  
           message = "对不起,登录失败";  
       }  
       req.setAttribute("message", message);  
       dispatcher.forward(req, resp);  
   }  
} 

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

Xml代码

    <servlet>  
      <servlet-name>Login</servlet-name>  
        <servlet-class>  
          com.demo.servlet.LoginServlet  
      </servlet-class>  
    </servlet>


    <servlet-mapping>  
      <servlet-name>Login</servlet-name>  
      <url-pattern>/Login</url-pattern>  
    </servlet-mapping> 

其实我们的工作量本身并没有减少,只是代码从 JSP 移动到了 Servlet,使得整个流程看上去稍微清楚了一些。

model3模式

MVC

M : Model,即模型,主要作用是封装数据(JavaBean) V : View,即视图,主要作用是页面数据显示(JSP) C : Controller,即控制器,主要作用: 获取数据进行封装业务处理传递数据指定显示的页面

时代进一步发展,简单的 JSP 和 Servlet 已经很难满足人们的要求了。于是,人们开始试图总结一些公用的 Java 类,来解决 Web 开发过程中碰到的问题。这时 MVC 模式出现了,成为了广大程序员的福音。

注:MVC 不是 Java 独有 , 几乎所有 B/S 架构软件都采用(只是可能名称不同你可能听说过组件模型,也有称之为事件模型。 )

JavaEE 三层架构 只有JavaEE采用三层架构

三层的分类

Web层: 表现层.---- 与客户端交互 Service层: 业务层 ---- 负责复杂的业务处理 Dao: 数据层(持久层) ---- 与数据库交互

我们到底要什么

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

无论是使用 JSP,还是使用 Web框架,我们至少都需要一些必须的元素:

1、数据 在这个例子中,就是name和password。他们共同构成了程序的核心载体。

2、页面展示 在这个例子中,就是 login.jsp。没有这个页面,一切的请求、验证和错误展示也无从谈起。

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

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

数据 ———— Model

页面展示 ———— View

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

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

MVC的概念其实就那么简单,这些概念其实早已深入我们的内心,而我们所缺乏的是将其本质挖掘出来。我们来看看下面这幅图:

1、数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串,转化成一个个生龙活虎的 Java对象? 2、数据从 Control 层传递到 View 层,一个个生龙活虎的 Java对象,又如何在页面上以各种各样的形式展现出来? 3、如果你试图将数据请求从 View 层发送到 Control 层,你如何才能知道你要调用的究竟是哪个类,哪个方法? 4、一个Http的请求,又如何与 Control 层的 Java代码 建立起关系来? 5、Control 作为调用逻辑处理程序的门面,如果逻辑处理程序发生了异常,我们该如何处理? 6、对于逻辑处理的结果,我们需要做怎么样的处理才能满足丰富的前台展示需要?

这一个又一个问题的提出,都基于对 MVC 的基本概念的挖掘。所以,这些问题都需要我们在写程序的时候去一个个解决。

框架是为了解决一个又一个在Web开发中所遇到的问题而诞生的。

不同的框架,都是为了解决不同的问题,但是对于程序员而言,他们只是jar包而已。

框架的优缺点的评论,也完全取决于其对问题解决程度和解决方式的优雅性的评论。所以,千万不要为了学习框架而学习框架,而是要为了解决问题而学习框架,这才是一个程序员的正确学习之道。

让我们透过现象,看到本质。做好准备下次将从 Servlet 开始,重游三国历史,参悟设计思想。。。

原文发布于微信公众号 - 程序员阿凯(AKBC159)

原文发表时间:2018-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试复习大纲2.0(持续更新)

想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面...

4417
来自专栏斑斓

编码修炼 | 快速了解Scala技术栈

我无可救药地成为了Scala的超级粉丝。在我使用Scala开发项目以及编写框架后,它就仿佛凝聚成为一个巨大的黑洞,吸引力使我不得不飞向它,以至于开始背离Java...

2886
来自专栏nimomeng的自我进阶

Kiwi上手体验

听说Kiwi,是来自于我在进行模块化构建的时候,执行 pod lib create xxxPods 的时候会有一个问题:

1012
来自专栏老码农专栏

一场版本升级引发的性能血案的追凶过程

1155
来自专栏FreeBuf

揭秘黑客是如何在60秒内偷车的

简介 要知道街上最多的不是美女帅哥,而是私家车。从电影《危情谍战》中我获得一丝灵感,接下来我们就谈谈如何与远程设备之间进行通信,从而打开车锁,然后启动一部汽车...

2188
来自专栏Android 研究

Retrofit解析1之前哨站——理解RESTful

本篇文章是Retrofit的前哨站——理解RESTful。因为retrofit是基于RESTful架构。所以在讲解Retrofit之前,先来复习一下RESTfu...

753
来自专栏一枝花算不算浪漫

订单的处理原理及代码实现.

70911
来自专栏Golang语言社区

go sync.Mutex 设计思想与演化过程 (一)

go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰。学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库。最好的办法就是将...

2806
来自专栏Golang语言社区

go sync.Mutex 设计思想与演化过程 --转

go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰。学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库。最好的办法就是将整...

2985
来自专栏BestSDK

不知道这21 款插件,别说你用过Eclipse

Darkest Dark 如果你也是那种讨厌白色背景的人,那么肯定不会问我为什么黑屏更好,也不会觉得使用“darkest”修改“dark”是多余的。我相信你一旦...

42310

扫码关注云+社区