1、介绍
1.1简介
- Spring MVC 是 Spring Framework 中的一个模块,它基于 Java 实现了 Web MVC 设计模式,用于构建 Web 应用程序。
- Spring MVC 提供了清晰的职责划分,使得开发者能够更加简洁和直观地开发 Web 层。
1.2优点
- 松耦合:基于Spring框架的依赖注入(DI)和面向切面编程(AOP)等特性,Spring MVC的各个组件之间耦合度低,易于维护和扩展。
- 灵活性:支持多种视图技术,如JSP、Thymeleaf、Freemarker等,并且提供了多种处理器映射器、处理器适配器等,可以根据实际需求进行选择和配置。
- 易于测试:由于各个组件之间的松耦合特性,可以很方便地对各个组件进行单元测试、集成测试等。
- 易于集成:与Spring框架的其他模块(如Spring Security、Spring Data等)无缝集成,可以快速构建功能强大的Web应用程序。
- 高性能:使用基于注解的控制器、Spring IoC容器、面向切面编程等技术,提高Web应用程序的性能。
2、核心组件
2.1 DispatcherServlet(前端控制器)
- 它是Spring MVC的入口点和核心。
- 负责接收所有的HTTP请求,并根据请求信息调用相应的处理器(Controller)进行处理。
- 它还负责调用视图解析器(ViewResolver)来解析视图名称,并返回给客户端。
2.2 HandlerMapping(处理器映射器)
- 负责根据请求的URL和其他条件来确定哪个控制器(Controller)应该处理该请求。
- 它将请求的URL映射到对应的控制器方法上。
- Spring MVC提供了多种HandlerMapping的实现,如基于注解的RequestMappingHandlerMapping等。
2.3 Controller(控制器)
- 负责处理客户端请求并生成相应的响应。
- 它接收来自DispatcherServlet的请求,调用相应的业务逻辑进行处理,并返回Model和视图名称给DispatcherServlet。
- 在Spring MVC中,控制器通常是一个实现了特定接口的Java类,或者是一个标注了@Controller注解的类。
2.4 HandlerAdapter(处理器适配器)
- 负责将请求交给相应的控制器进行处理。
- 它根据控制器的类型和配置的规则来选择适当的适配器来执行控制器的方法。
- 处理器适配器是连接DispatcherServlet和控制器之间的桥梁。
2.5 ViewResolver(视图解析器)
- 负责将逻辑视图名称解析为实际的视图对象。
- 它根据视图名称找到对应的视图实现,并将其返回给DispatcherServlet进行渲染。
- Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等,每种视图技术都有对应的视图解析器实现。
2.6 Model(模型)
- 表示应用程序的数据和业务逻辑。
- 它可以是一个POJO(Plain Old Java Object)或一个JavaBean,用于封装数据并提供业务处理方法。
- 控制器在处理请求时,会将数据填充到模型中,并将模型传递给视图进行渲染。
2.7 View(视图)
- 负责呈现模型的数据给用户。
- 它可以使用JSP、Thymeleaf、FreeMarker等模板技术来实现。
- 视图接收来自控制器的模型数据,并将其渲染为HTML页面或其他类型的响应返回给客户端。
3、工作流程
- 客户端发送请求到DispatcherServlet。
- DispatcherServlet根据请求信息调用HandlerMapping,找到处理该请求的Handler。
- DispatcherServlet调用HandlerAdapter,执行Handler中的方法。
- Handler处理请求并返回ModelAndView对象给DispatcherServlet。
- DispatcherServlet调用ViewResolver,将ModelAndView中的视图名称解析为具体的视图实现。
- 视图根据Model数据渲染页面,并返回给DispatcherServlet。
- DispatcherServlet将渲染后的页面返回给客户端。
4、使用和配置
以下是使用Spring MVC时的一个简单示例,包括配置和控制器代码。
1. 添加Spring MVC依赖
首先,确保pom.xml(Maven项目)中已经包含了Spring MVC的依赖:
<!-- Spring MVC 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>你的Spring版本</version>
</dependency>
<!-- 如果你使用的是Spring Boot,则会自动包含Spring MVC -->
<!-- Spring Boot 依赖(可选) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>你的Spring Boot版本</version>
</dependency>
2. 配置Spring MVC(非Spring Boot项目)
在web.xml中配置DispatcherServlet:
<web-app>
...
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
...
</web-app>
在mvc-dispatcher-servlet.xml中配置Spring MVC组件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.controller" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3. 编写控制器(Controller)
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
// 返回一个逻辑视图名,由视图解析器解析为实际的JSP页面
return "hello";
}
}
4. 创建视图(View)
在/WEB-INF/views/目录下创建hello.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
5. 如果使用Spring Boot(简化配置)
在Spring Boot项目中,你可以通过@SpringBootApplication和@RestController(或@Controller配合@ResponseBody)来快速构建Web应用程序,而无需手动配置web.xml和mvc-dispatcher-servlet.xml。
// Spring Boot的主应用程序类
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
// 控制器类