Spring MVC 是 Spring 框架的一个模块,用于构建基于 Java 的 Web 应用程序,它遵循了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式,帮助开发者将业务逻辑、数据和用户界面分离,从而提高代码的可维护性、可测试性和可扩展性。以下从几个方面详细介绍 Spring MVC:
核心组件
-
DispatcherServlet:作为 Spring MVC 的前端控制器,负责接收所有客户端请求,并将请求分发给相应的处理器进行处理。它是整个 Spring MVC 框架的核心,是请求的统一入口。
-
HandlerMapping:根据请求的信息(如 URL、请求方法等)将请求映射到相应的处理器(Handler)。常见的实现有
BeanNameUrlHandlerMapping
、RequestMappingHandlerMapping
等。 -
HandlerAdapter:由于处理器可以有多种形式(如实现不同的接口),HandlerAdapter 的作用是将请求适配到具体的处理器方法上进行调用。例如,
RequestMappingHandlerAdapter
用于处理使用@RequestMapping
注解的处理器。 -
Controller:处理器的一种实现,负责处理客户端请求,执行业务逻辑,并返回处理结果。通常使用
@Controller
或@RestController
注解来标识。 -
ViewResolver:根据处理器返回的逻辑视图名,解析出实际的视图对象(如 JSP、Thymeleaf 模板等),并将模型数据渲染到视图中返回给客户端。常见的实现有
InternalResourceViewResolver
、ThymeleafViewResolver
等。 -
View:负责将模型数据呈现给客户端,常见的视图技术有 JSP、Thymeleaf、FreeMarker 等。
工作流程
-
客户端请求:客户端(如浏览器)发送 HTTP 请求到
DispatcherServlet
。 -
请求映射:
DispatcherServlet
接收到请求后,通过HandlerMapping
查找处理该请求的处理器(Handler)。 -
处理器适配:找到处理器后,
DispatcherServlet
通过HandlerAdapter
调用处理器的具体方法进行业务处理。 -
业务逻辑处理:处理器执行相应的业务逻辑,并返回一个
ModelAndView
对象,其中包含模型数据和逻辑视图名。 -
视图解析:
DispatcherServlet
接收到ModelAndView
后,通过ViewResolver
将逻辑视图名解析为实际的视图对象。 -
视图渲染:将模型数据传递给视图对象,视图对象将数据渲染到页面中,并返回给客户端。
示例代码
1. 配置 Spring MVC
在 pom.xml
中添加 Spring MVC 依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
</dependencies>
2. 创建控制器
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
3. 配置视图解析器
在 Spring 配置文件(如 applicationContext.xml
)中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
4. 创建 JSP 视图
在 WEB-INF/views
目录下创建 hello.jsp
文件:
<!DOCTYPE html>
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
5. 配置 DispatcherServlet
在 web.xml
中配置 DispatcherServlet
:
<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/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>
优点
-
灵活性:支持多种视图技术(如 JSP、Thymeleaf、FreeMarker 等)和数据格式(如 JSON、XML 等),可以根据项目需求灵活选择。
-
可维护性:遵循 MVC 设计模式,将业务逻辑、数据和视图分离,使得代码结构清晰,易于维护和扩展。
-
可测试性:控制器可以独立进行单元测试,方便进行代码测试和调试。
-
集成性:可以与 Spring 框架的其他模块(如 Spring Boot、Spring Data 等)无缝集成,提供一站式的解决方案。