【第1章】 初识SpringMVC
参考视频:SpringMVC教程,SpringMVC从零到精通,老杜SpringMVC,动力节点SpringMVC
0. 学习前的知识储备
- JavaSE
- HTML+CSS+JavaScript
- Vue
- AJAX + axios
- Thymeleaf
- Servlet
- Maven
- Spring
1. 什么是MVC
MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块:
- M:Model(模型)
- V:View(视图)
- C:Controller(控制器)
应用为什么要被分为三块,优点是什么?
- 低耦合,扩展能力增强
- 代码复用性增强
- 代码可维护性增强
- 高内聚,让程序员更加专注业务的开发
MVC将应用分为三块,每一块各司其职,都有自己专注的事情要做,他们属于分工协作,互相配合:
- Model:负责业务处理及数据的收集。
- View:负责数据的展示
- Controller:负责调度。它是一个调度中心,它来决定什么时候调用Model来处理业务,什么时候调用View视图来展示数据。
MVC架构模式如下所示:
MVC架构模式的描述:前端浏览器发送请求给Web服务器,Web服务器中的Controller接收到用户的请求,Controller负责将前端提交的数据进行封装,然后Controller调用Model来处理业务,当Model处理完业务后会返回处理之后的数据给Controller,Controller再调用View来完成数据的展示,最终将结果响应给浏览器,浏览器进行渲染展示页面。
什么是三层模型?MVC架构模式与三层模型有什么区别?
三层模型:
MVC和三层模型都采用了分层结构来设计应用程序,都是降低耦合度,提高扩展力,提高组件复用性。区别在于:他们的关注点不同,三层模型更加关注业务逻辑组件的划分。
MVC架构模式关注的是整个应用程序的层次关系和分离思想。现代的开发方式大部分都是MVC架构模式结合三层模型一起用。
2. 什么是SpringMVC
2.1 SpringMVC概述
SpringMVC是一个实现了MVC架构模式的Web框架,底层基于Servlet实现。
SpringMVC已经将MVC架构模式实现了,因此只要我们是基于SpringMVC框架写代码,编写的程序就是符合MVC架构模式的。(MVC的架子搭好了,我们只需要添添补补)
Spring框架中有一个子项目叫做Spring Web,Spring Web子项目当中包含很多模块,例如:
- Spring MVC
- Spring WebFlux
- Spring Web Services
- Spring Web Flow
- Spring WebSocket
- Spring Web Services Client
可见SpringMVC是Spring Web子项目当中的一个模块。因此也可以说SpringMVC是Spring框架的一部分。
所以学习SpringMVC框架之前要先学习Spring框架中的IoC和AOP等内容。
另外,使用SpringMVC框架的时候同样也可以使用IoC和AOP。
以下就是Spring官方给出的Spring架构图,其中Web中的servlet指的就是Spring MVC:
2.2 SpringMVC帮我们做了什么
SpringMVC框架帮我们做了什么,与纯粹的Servlet开发有什么区别?
- 入口控制:SpringMVC框架通过DispatcherServlet作为入口控制器,负责接收请求和分发请求。而在Servlet开发中,需要自己编写Servlet程序,并在web.xml中进行配置,才能接受和处理请求。
- 在SpringMVC中,表单提交时可以自动将表单数据绑定到相应的JavaBean对象中,只需要在控制器方法的参数列表中声明该JavaBean对象即可,无需手动获取和赋值表单数据。而在纯粹的Servlet开发中,这些都是需要自己手动完成的。
- IoC容器:SpringMVC框架通过IoC容器管理对象,只需要在配置文件中进行相应的配置即可获取实例对象,而在Servlet开发中需要手动创建对象实例。
- 统一处理请求:SpringMVC框架提供了拦截器、异常处理器等统一处理请求的机制,并且可以灵活地配置这些处理器。而在Servlet开发中,需要自行编写过滤器、异常处理器等,增加了代码的复杂度和开发难度。
- 视图解析:SpringMVC框架提供了多种视图模板,如JSP、Freemarker、Velocity等,并且支持国际化、主题等特性。而在Servlet开发中需要手动处理视图层,增加了代码的复杂度。
总之,与Servlet开发相比,SpringMVC框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。
2.3 SpringMVC框架的特点
- 轻量级:相对于其他Web框架,Spring MVC框架比较小巧轻便。(只有几个几百KB左右的Jar包文件)
- 模块化:请求处理过程被分成多个模块,以模块化的方式进行处理。
- 控制器模块:Controller
- 业务逻辑模块:Model
- 视图模块:View
- 依赖注入:Spring MVC框架利用Spring框架的依赖注入功能实现对象的管理,实现松散耦合。
- 易于扩展:提供了很多口子,允许开发者根据需要插入自己的代码,以扩展实现应用程序的特殊需求。
- Spring MVC框架允许开发人员通过自定义模块和组件来扩展和增强框架的功能。
- Spring MVC框架与其他Spring框架及第三方框架集成得非常紧密,这使得开发人员可以非常方便地集成其他框架,以获得更好的功能。
- 易于测试:支持单元测试框架,提高代码质量和可维护性。(对SpringMVC中的Controller测试时,不需要依靠Web服务器。)
- 自动化配置:提供自动化配置,减少配置细节。
- Spring MVC框架基于约定大于配置的原则,对常用的配置约定进行自动化配置。
- 灵活性:Spring MVC框架支持多种视图技术,如JSP、FreeMarker、Thymeleaf、FreeMarker等,针对不同的视图配置不同的视图解析器即可。
自用软件相关版本
- JDK版本:Java17
- Maven版本:3.6.1
- Tomcat版本:10
- Spring版本:6.1.4
- SpringMVC版本:6.1.4
- IDEA版本:2022.2
- Thymeleaf版本:3.1.2
3. 第一个SpringMVC程序
3.1 创建Maven模块
1、创建Empty Project,起名为springmvc (PS:记得设置项目JDK版本和Maven仓库)
2、创建Maven模块,起名为springmvc-001
3、将pom.xml
文件中的打包方式修改为war
1 | <groupId>com.muyoukule</groupId> |
4、添加如下依赖
1 | <dependencies> |
3.2 添加web支持
1、在main目录下创建一个webapp目录
2、添加web.xml配置文件
注意web.xml
文件的位置:\springmvc-001\ src\main\webapp\
WEB-INF\web.xml
添加web支持后的目录结构:
3.3 配置web.xml文件
Spring MVC是一个Web框架,在JavaWeb中谁来负责接收请求、处理请求、以及响应呢?
当然是Servlet。在SpringMVC框架中已经为我们写好了一个Servlet,它的名字叫做:DispatcherServlet
,我们称其为 前端控制器
既然是Servlet,那么它就需要在web.xml文件中进行配置:
1 |
|
DispatcherServlet
是SpringMVC框架为我们提供的最核心的类,它是整个SpringMVC框架的前端控制器,负责接收HTTP请求、将请求路由到处理程序、处理响应信息,最终将响应返回给客户端。DispatcherServlet是Web应用程序的主要入口点之一,它的职责包括:
- 接收客户端的HTTP请求:DispatcherServlet监听来自Web浏览器的HTTP请求,然后根据请求的URL将请求数据解析为Request对象
- 处理请求的URL:DispatcherServlet将请求的URL(Uniform Resource Locator)与处理程序进行匹配,确定要调用哪个控制器(Controller)来处理此请求
- 调用相应的控制器:DispatcherServlet将请求发送给找到的控制器处理,控制器将执行业务逻辑,然后返回一个模型对象(Model)
- 渲染视图:DispatcherServlet将调用视图引擎,将模型对象呈现为用户可以查看的HTML页面
- 返回响应给客户端:DispatcherServlet将为用户生成的响应发送回浏览器,响应可以包括表单、JSON、XML、HTML以及其它类型的数据
3.4 编写控制器FirstController
DispatcherServlet接收到请求之后,会根据请求路径分发到对应的Controller,Controller来负责处理请求的核心业务。在SpringMVC框架中Controller是一个普通的Java类(一个普通的POJO类,不需要继承任何类或实现任何接口)。
需要注意的是:POJO类要纳入IoC容器来管理,POJO类的生命周期由Spring来管理,因此要使用注解标注:
1 | package com.muyoukule.controller; |
3.5 配置springmvc-servlet.xml文件
SpringMVC框架有它自己的配置文件,该配置文件的名字默认为:<servlet-name>-servlet.xml
,默认存放的位置是WEB-INF目录下:
1 |
|
在WEB-INF目录下新建springmvc-servlet.xml
文件,并且提供以上配置信息:
以上配置主要两项:
- 组件扫描。Spring扫描这个包中的类,将这个包中的类实例化并纳入IoC容器的管理。
- 视图解析器。视图解析器(View Resolver)的作用主要是将Controller方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给DispatcherServlet,并最终由DispatcherServlet将该视图对象转化为响应结果,呈现给用户。
PS:如果采用了其它视图,请配置对应的视图解析器。例如:
- JSP的视图解析器:InternalResourceViewResolver
- FreeMarker视图解析器:FreeMarkerViewResolver
- Velocity视图解析器:VelocityViewResolver
3.6 提供视图
在WEB-INF目录下新建templates
目录,在templates目录中新建html文件。例如:first.html,并提供以下代码:
1 |
|
对于每一个Thymeleaf文件来说 xmlns:th="http://www.thymeleaf.org"
是必须要写的,为了方便后续开发,可以将其添加到html模板文件中:
3.7 控制器FirstController处理请求返回逻辑视图名称
1 |
|
测试
1、配置Tomcat服务器
2、部署Web模块到Tomcat服务器
3、启动Tomcat服务器
如果在控制台输出的信息有中文乱码,修改Tomcat服务器配置文件:apache-tomcat-10.1.19\conf\logging.properties
,将下面的 GBK
全部修改为 UTF-8
即可。
4、在浏览器地址栏上输入地址:http://localhost:8080/springmvc/haha
5、后端控制台输出:
3.8 执行流程总结
- 浏览器发送请求:http://localhost:8080/springmvc/haha
- SpringMVC的前端控制器DispatcherServlet接收到请求
- DispatcherServlet根据请求路径 /haha 映射到 FirstController#名字随意(),调用该方法
- FirstController#名字随意() 处理请求
- FirstController#名字随意() 返回逻辑视图名称 first 给视图解析器
- 视图解析器找到
/WEB-INF/templates/first.html
文件,并进行解析,生成视图解析对象返回给前端控制器DispatcherServlet - 前端控制器DispatcherServlet响应结果到浏览器
3.9 Controller编写多个方法
一个Controller可以提供多个方法,每个方法通常是处理对应的请求。例如:
1 |
|
提供 other.html 文件
1 |
|
在 first.html 文件中,添加超链接,用超链接发送 /other
请求:
1 |
|
启动Tomcat,打开浏览器,输入请求路径:http://localhost:8080/springmvc/haha
点击超链接:other请求
4. 第二个SpringMVC程序
4.1 创建Maven模块
1、pom.xml
文件中添加依赖
- springmvc依赖
- logback依赖
- servlet依赖(scope为provided)
- thymeleaf与spring6整合依赖
2、打包方式 war
4.2 添加web支持
webapp目录没有小蓝点怎么办?
添加Web支持:
4.3 配置web.xml文件
PS:SpringMVC配置文件的名字和路径是可以手动设置的。😮 如下:
1 |
|
通过<init-param>
来设置SpringMVC配置文件的路径和名字,在DispatcherServlet的init
方法执行时设置的。<load-on-startup>1</load-on-startup>
建议加上,这样可以提高用户第一次访问的效率。表示在web服务器启动时初始化DispatcherServlet。
4.4 编写IndexController
1 |
|
表示请求路径如果是:http://localhost:8080/springmvc/ ,则直接进入 /WEB-INF/templates/index.html
页面。
这就是项目的首页效果!!!!!
4.5 在resources目录下配置springmvc.xml文件
配置内容和之前一样,一个是视图解析器,一个是组件扫描。
4.6 提供视图
在WEB-INF目录下新建templates
目录,在templates目录中新建index.html文件:
1 |
|
测试
部署到web服务器,启动web服务器,打开浏览器,在地址栏上输入:http://localhost:8080/springmvc/