Spring MVC 是 Spring 框架中的一个模块,它基于 MVC(Model-View-Controller)设计模式,旨在帮助开发者构建灵活、松耦合的 Web 应用。主要目的是简化传统 Servlet+JSP 模式下的 Web 开发方式。下面将从工作流程、核心组件、代码示例三个方面进行详细解析。
其次, Spring MVC 的整体架构设计对 Java Web 里面的 MVC 架构模式做了增强和扩展,主要有几
个方面。
- 把传统 MVC 框架里面的 Controller 控制器做了拆分,分成了前端控制器 DispatcherServlet 和后
端控制器 Controller。
把 Model 模型拆分成业务层 Service 和数据访问层 Repository。
在视图层,可以支持不同的视图,比如 Freemark、velocity、JSP 等等
一、Spring MVC 的核心组件
- DispatcherServlet
所有请求首先进入DispatcherServlet
,它作为前端控制器,负责协调整个请求处理流程。 - HandlerMapping
DispatcherServlet
根据请求 URL 通过HandlerMapping
寻找对应的处理器(Controller)。 - Controller
控制器负责处理具体业务逻辑,并返回一个ModelAndView
对象,包含业务数据(Model)和逻辑视图名称(View)。 - ViewResolver
根据逻辑视图名称,通过ViewResolver
找到具体的视图模板(例如 JSP、Thymeleaf 等)。 - View
最终视图负责将 Model 数据渲染成 HTML 等格式,返回给客户端。
如图,我们来看一下工作流程:
二、Spring MVC 的工作流程
整个请求-响应流程可以概括如下:
- 请求进入
用户发送 HTTP 请求,首先到达DispatcherServlet
。 - 处理器映射
DispatcherServlet
调用HandlerMapping
根据请求信息查找对应的 Controller。 - 调用 Controller
找到 Controller 后,调用对应的方法执行业务逻辑,并返回ModelAndView
。 - 视图解析
DispatcherServlet
将ModelAndView
中的逻辑视图名称传递给ViewResolver
,解析出具体视图。 - 渲染视图
具体视图使用 Model 数据进行渲染,生成最终的响应内容返回给用户。
三、实战代码示例
下面是一个简单的 Spring MVC 示例代码,展示如何定义 Controller 以及如何返回 ModelAndView。
1.Controller 示例
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/hello")
public class HelloController {
// 处理 GET 请求 http://yourdomain/hello
@RequestMapping(method = RequestMethod.GET)
public ModelAndView sayHello() {
ModelAndView mv = new ModelAndView("helloView"); // 逻辑视图名称
mv.addObject("message", "Hello Spring MVC!");
return mv;
}
}
2. Spring 配置(基于 XML)
如果你使用 XML 配置,可以这样配置 DispatcherServlet 和视图解析器:
<!-- web.xml 中配置 DispatcherServlet -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- spring-servlet.xml 配置 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启用注解驱动 -->
<mvc:annotation-driven />
<!-- 扫描 Controller 包 -->
<context:component-scan base-package="com.example.controller" />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3. JSP 视图示例(helloView.jsp)
在 /WEB-INF/views/helloView.jsp
文件中,可以这样写:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
4.关键注解说明
四、总结
- 核心流程:请求经过
DispatcherServlet
->HandlerMapping
->Controller
->ViewResolver
->View
,每一步都发挥着关键作用。
YSO-1741608287752)]
。