前言

写下这篇文章,我感觉很沉重,我见证了MVC的发展,有的框架曾经花费大量的时间深入的研究过源码。不光是人,就是没有生命的框架,当时代抛弃你时,连一声再见都不会说。本文让我们回归一下波澜壮阔的MVC发展史。

一、Model1 模式的出现,让混沌世界出现一丝曙光

Model1 模式十分简单,它使用 JSP 页面和 JavaBean 相结合的方式,由 JSP 页面来接收客户端请求,用 JavaBean 或其他服务完成业务逻辑、数据库操作和返回页面。JavaBean 是指能完成特定功能的 Java 类。

model1.png

1.1 Model1 模式的优缺点:

(1)优点:架构简单,比较适合小型项目开发

(2)缺点:JSP 职责不单一,职责过重,不便于维护

二、Model2(MVC)开发模式,让刀耕火种的原始时代迈入了石器时代,社会开始分工,生产更加有秩序

Model1 虽然在一定程度上实现了解耦,但 JSP 依旧即要负责页面控制,又要负责逻辑处理,职责不单一。此时 Model2 应运而生,使得各个部分各司其职。 Model2 基于 MVC 模式:

(1)Controller:应用程序中用户交互部分(Servlet)

(2)Model:应用程序数据逻辑部分(JavaBeans)

(3)View:数据显示部分(JSP)

model2.png

2.1 Model2 模式的优缺点:

(1)优点:职责清晰,较适合于大型项目架构

(2)缺点:分层较多,不适合小型项目开发

2.2 Model1 和 Model2 区别:

Model2 在 Model1 的基础上分离了控制,将 JSP 中的逻辑操作部分分离出来,这样做不仅减轻了 JSP 的职责,而且更有利于分工开发,耦合性降低。对于复杂的 Web 应用开发,更适合使用 Model2,而对于小型应用,使用Model1 比较简单。

三、Struts1 登上历史舞台,但又匆匆走过

3.1 Struts1 诞生背景:

Struts1 出现的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间,使用Struts1可以提高系统的维护和开发效率,我们只需要配置和编码实现Action和ActionForm就可以了。

3.2 Struts1 组成部分:

struct1.jpg

下面,对比一下Servlet和Struts1的执行过程,我们更能看清楚两者的区别。

3.3 Servlet执行过程:

需要再每个页面都设置一个Servlet类来处理请求和响应,再获取用户提交的数据和再把数据与持久化类对应起来。再做判断,决定跳转,再让JSP显示。

servlet.png

3.4 Struts1 执行过程:

使用Struts1时,通过运行时初始化ActionServlet,再把各个持久化类各个属性值设为null,当有请求来时,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把用户数据提交给它,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回,验证通过会根据请求的Action类型,实例化Action,执行Action的execute方法,根据传进来的ActionForm持久化对象可以取到传进来的数据,数据可以和数据库中的数据交互,再决定跳转。也就是说Struts1封装了用request.getParameter(),再把数据传给JavaBean持久化类。另外,Struts1弥补了JPS标签的不足,为开发提供了便利。

Struct1.png

四、Struts2 框架,雄心勃勃,但又毁誉参半

4.1 Struts2 诞生背景

Struts2和Struts1的差别巨大,Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开。

4.2 Struts1与Struts2的区别

下面主要从Action类,线程模式,Servlet依赖,捕获输入,以及表达式语言等五个方面来进行比较。

(1)Action类
Struts1要求Action类继承一个抽象基类;Struts2要求Action类可以实现一个Action接口,也可以实现其他接口。

(2)线程模式
Struts1是单例设计模式并且必须是线程安全的,因为仅有一个Action的实例来处理所有请求。而Struts2为每一个请求产生一个实例,因此没有线程安全问题。

(3)Servlet依赖
Struts1 Action依赖于Servlet API,因为当一个ACtion被调用时HttpservletRequest和HttpServletResponse被传递给execute方法。Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。

(4)捕获输入
Struts1 使用ActionForm对象捕获输入,所有的Actionform必须继承一个基类。而Struts2直接使用Action属性作为输入属性。
(5)表达式语言
Struts1 整合了JSTL El表达式。而Struts2不仅可以使用JSTL,也支持ognl表达式语言。

4.3 Struts2 的安全问题异常严峻

Struts2在前几年可谓是非常流行,不管你去哪个公司面试,都要求会SSH,这时的SS指的是Spring和Struts2,曾经风靡一时的Struts2最终被SpringMVC所取代。Struts2 的安全漏洞,让不少大小公司吃尽了苦头,慢慢磨掉了用户的信心。

五、SpringMVC 如日中天

5.1 SpringMVC 原理

spring.jpg

5.2 SpringMVC和Struts2的区别

(1)入口不同
SpringMVC入口是servlet,Struts2入口是filter。

(2)生命周期不同
SpringMVC Controller是单例的,所以效率更高,但是不能使用成员变量获取参数。
Struts2 Action是多例的,可以使用成员变量获取参数,导致效率比较低。

5.3 SpringMVC 中文官网

推荐一个SpringMVC中文网站:http://www.springmvc.cn/

标签: none

已有 2 条评论

  1. 梦马 梦马

    感觉意犹未尽,戛然而止啊

    1. 以梦为马 以梦为马

      在【如日中天】戛然而止。

添加新评论