前言

什么是MVC

MVC英文是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计规范,本质上也是一种解耦。

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

什么是SpringMVC

而Spring Web MVC 则是一种基于Java 的实现了Web MVC 设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是为了简化开 发,Spring Web MVC 也是要简化我们日常Web 开发的。

说白了,Spring MVC 就是 【接收请求】【响应数据】

Spring MVC 下一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。

常用组件:

  • 前端控制器(DispatcherServlet):接收用户请求,给用户返回结果。

  • 处理器映射器(HandlerMapping):根据请求的url路径,通过注解或者xml配置,寻找匹配的Handler。

  • 处理器适配器(HandlerAdapter):Handler 的适配器,调用 handler 的方法处理请求。

  • 处理器(Handler):执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装到ModelAndView对象中。

  • 视图解析器(ViewResolver):将逻辑视图名解析成真正的视图View。

  • 视图(View):接口类,实现类可支持不同的View类型(JSP、FreeMarker、Excel等)

MVC案例

基于webxml

示例源码点击这里

maven引入

业务代码编写

  • entity的User类

  • dao层

  • service层

  • controller层

webapp下的web.xml

springmvc.xml

web.xml中配置初始化参数contextConfigLocation,路径是classpath:springmvc.xml,因此文件直接创建在resources目录下

JSP视图

创建userList.jsp

之后就是使用tomcat部署测试了,这块就不说了

纯注解版

无需配置xml文件,依靠注解和配置类完成配置,注意需要注意满足sevlet3.0规范

具体源码点击这里

这个不做过多讲解,真实项目的用得较少。因为若是老项目,就是基于webxml的,若是新项目,则直接上springboot了。

Spring MVC响应请求

直接返回ModelAndView对象

ModelAndView对象将数据模型和视图信息封装在一起。

返回视图名称(页面跳转)

该方法返回 "userDetail.jsp",并可以在页面上通过 ${user}获取数据

使用Map传递数据

该方法返回 "userDetail.jsp",并可以在页面上通过 ${user}获取数据

返回void

这种方式绕过了SpringMVC的视图解析,提供了最大灵活性,但需要自行处理响应细节,与Servlet API耦合度高,一般不推荐作为主要方式

重定向跳转

redirect:会让浏览器地址栏变为新的URL。注意,重定向是两次请求,原始请求域(request scope)中的数据会丢失。若要传递参数,可使用 RedirectAttributes

使用HttpServletResponse

此方式适用于文件下载、输出特定二进制内容等需要精细控制输出流的场景。它完全绕过了SpringMVC的视图解析机制

直接返回数据(如JSON)

@ResponseBody注解是核心,它告诉Spring将方法返回值直接写入响应流。若项目中配置了消息转换器(如Jackson),可直接返回对象,Spring会自动将其转为JSON

SringMVC接收数据

基本数据类型接收

接收路径参数

对象接收(自动绑定)

接收简单对象参数

接收嵌套对象参数

数组接收

数组在表单中的应用

集合接收(通过包装对象)

SpringMVC 不能直接在方法参数中接收集合,但可以通过对象包装的方式来接收。

自定义转换器

  • 日期格式转换器

  • 枚举类型转换器

  • 注册自定义转换器

  • 在控制器中使用自定义转换

SpringMVC其它使用

视图解析器添加前后缀

配置视图解析器可以免去重复书写视图文件路径的前后缀。

  • xml 或者Java Config

  • 控制器代码

此配置后,控制器返回的 "index"会被自动补全为 /views/index.jsp,极大简化了视图管理

中文乱码问题处理

静态资源处理

默认情况下,DispatcherServlet 会拦截所有请求,包括静态资源请求,这会导致静态资源无法正常访问。因此,我们需要配置 Spring MVC 以允许容器直接提供静态资源。

有两种主要方式来处理静态资源:

  1. 使用 <mvc:resources />标签(XML 配置)

  2. 使用 WebMvcConfigureraddResourceHandlers方法(Java 配置)

另外,还可以使用 <mvc:default-servlet-handler />来允许容器默认的 Servlet 处理静态资源。

  • XML 配置方式-使用默认Servlet处理(简单方式)

  • XML 配置方式-使用资源映射(推荐方式)

  • JavaConfig 配置方式