什么是MVC
Model 1时代
在最初的 JSP网页中,像数据库查询语句这样的数据层代码和像HTML这样的表示层代码是混在一起,更甚者还会在里面写一些Java代码来做业务逻辑的处理。(在 jsp中 <%
一写就可以在里面敲Java代码)虽然经验比较丰富的开发者会将数据从表示层分离开来,但这样的良好设计通常并不是很容易做到的。
这种老的架构模式,前后端互相依赖,耦合性过高。而且写这种代码还需要你对前端有一定的掌握程度,可以说是十分的痛苦。
但这种模式也要一些自己的好处
- 架构简单,适合小型项目的开发
- 但 jsp要做的事情太多了不是很便于维护
- 加上现在的开发中 jsp用的也越来越少了,这种模式也就慢慢淡出了我们的视线
Model 2时代
正是因为 model 1的种种弊端,Servlet + JSP + Java Bean 的开发模式就诞生了,也就是我们的Model 2
使用了这种架构模式后,我们会将程序分为三个部分 Model、View、Controller
模型(Model):
- 数据模型层,这一层即负责对数据的封装,也负责对数据进行一些逻辑操作。
Model
有对数据直接访问的权力,例如对数据库的访问。Model
不依赖View
和Controller
,也就是说, Model 不关心它会被如何显示或是如何被操作。Model
中数据的变化一般会通过一种刷新机制来实现。- 为了实现这种机制,那些用于监视此
Model
的View
必须事先在此Model
上注册,从而,View
可以了解在数据Model
上发生的改变。
视图(View):
- 负责数据模型的展示,一般就是我们看到的用户界面。
- 在
View
中一般没有程序上的逻辑 - 为了实现
View
上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据中注册。
控制器(Controller):
- 起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。
这样做有哪些好处呢
尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的
- 首先,多个 View 能共享一个 Model 。如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱。这就要求Web网站同时能提供Internet界面和WAP界面。在MVC设计模式中, Model 响应用户请求并返回响应数据,View 负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个 Model 可以被不同的 View 重用,所以大大提高了代码的可重用性。
- MVC三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种架构思想能构造良好的低耦合构件。
- Controller 提高了应用程序的灵活性和可配置性。Controller 可以用来连接不同的 Model 和 View 去完成用户的需求,也可以为构造应用程序提供强有力的手段。
- 给定一些可重用的 Model 、 View 和Controller 可以根据用户的需求选择适当的 Model 进行处理,然后选择适当的的 View 将处理结果显示给用户。
- MVC 架构强调职责分离,所以在发展 MVC 应用时会产生很多文件,在 IDE (集成开发环境) 不够成熟时它会是个问题,但在现代主流 IDE 都能使用类别对象的信息来组织代码编辑的情况下,多文件早已不是问题。
- MVC 架构会要求开发者进一步思考应用程序的架构 (Application Architecture),而非用大杂烩的方式开发应用程序,对于应用程序的生命周期以及后续的可扩展与可维护性而言有相当正面的帮助。
- MVC 职责分离也带来了一个现代软件工程要求的重要特性:可测试性,MVC-based 的应用程序在良好的职责分离的设计下,各个部分可独立行使单元测试,有利于与企业内的自动化测试、持续集成与持续发行流程集成,减少应用程序改版部署所需的时间。
以下引自维基百科
MVC架构应用程序的目的就是希望打破以往应用程序使用的大杂烩编写方式,并间接诱使开发人员以更高的架构导向思维来思考应用程序的设计,因此对于一个刚入门的初学者来说,架构导向的思考会有一定的门槛,需要较多的实现与练习才能具备相应的能力,大多数的初学者还是较习惯于大杂烩式的程序撰写,所以可能会对 MVC 模式抱持着排斥或厌恶的心态。
然而 MVC 是有助于应用程序长远的发展,虽然大杂烩式的程序也可以用来发展长生命周期的应用程序,但是相较于 MVC,大杂烩式的程序在可扩展性和可维护性 (尤其是可测试性) 上会远比 MVC 复杂很多,相反的,MVC 模式的应用程序是在初始开发时期必须先思考并使用软件架构,使得开发时期会需要花较多心力,但是一旦应用程序完成后,可扩展性、可维护性和可测试性反而会因为 MVC 的特性而变得容易。
MVC 模式在已有众多优秀框架的现代,早就已经没有不适合小型应用的问题,小型的应用还是可以由 MVC Framework 的应用来获取 MVC 的优点,同时它也能作为未来小型应用扩展到大型应用时的基础与入门砖。若一开始就想要做大型应用,那么 MVC 模式的职责分离以及要求开发的架构思考会更适合大型应用的开发。
SpringMVC
SpringMVC 是 Spring框架的一部分,它是基于Java实现的MVC轻量级 web框架
springMVC 围绕 DispatcherServle
t设计,它是一个请求分发器,所有的请求都会经过它。它来为这些请求寻找对应的处理器(Controller)。
DispatcherServle
t是一个实际的Servlet,它继承自HttpServlet的基类。
以下引自官方文档
Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet
, the DispatcherServlet
, provides a shared algorithm for request processing, while actual work is performed by configurable delegate components. This model is flexible and supports diverse workflows.
说了这么半天,想必大家也看累了。既然MVC框架这么厉害,也吹了这么久 总得实现一下看看效果是不是
(SpringMVC有哪些特点,使用SpringMVC有什么好处,这边就不再赘述了 网上文章也很多,再写下去也没什么意义。)
实现一个简单的MVC程序
下面的方式是比较老的MVC实现方式,在真实的开发中几乎不会这么写。但使用这种方式来理解MVC初始化流程还是可取的
- 创建maven项目
- 导入jar包依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>