Spring MVC 是 Spring 框架中用于构建 Web 应用程序 的模块,基于 MVC(Model-View-Controller)架构模式,旨在分离应用的输入、处理和输出逻辑,简化 Web 开发。
1. MVC 架构分离
Controller):处理用户请求,调用业务逻辑,返回模型数据和视图名称。Model):封装业务数据(如表单参数、数据库查询结果)。View):负责数据展示(如 HTML 页面、JSON/XML 数据)。2. 注解驱动开发
@Controller:标记控制器类。@RequestMapping:映射 URL 路径到处理方法。@PathVariable:获取 URL 中的动态参数(如 /user/{id})。@RequestParam:获取请求参数(查询参数、表单字段)。@ResponseBody:直接返回数据(如 JSON),跳过视图渲染。3. 灵活的请求处理
GET/POST/PUT/DELETE 等 HTTP 方法,映射同一 URL 到不同处理逻辑。User 对象)。4. 多种视图技术支持
@ResponseBody 返回 JSON/XML 数据,适配接口开发。View 接口,支持 Excel、PDF 等任意输出格式。5. 与 Spring 生态集成
Spring MVC 的核心组件围绕 DispatcherServlet(前端控制器) 设计,处理流程如下:
1. DispatcherServlet
web.xml 或 Spring Boot 中配置映射路径(如 /*)。2. HandlerMapping(处理器映射器)
@RequestMapping)、简单 URL 匹配、自定义规则。3. HandlerAdapter(处理器适配器)
HttpRequestHandler),调用处理器方法。4. Controller(控制器)
ModelAndView(包含模型数据和视图名称)或直接返回数据(通过 @ResponseBody)。5. Model(模型)
Model、ModelMap、Map 接口),供视图渲染使用。6. ViewResolver(视图解析器)
user/list)解析为具体的 View 对象(如 JSP 视图、JSON 视图)。7. View(视图)
1. 请求到达 DispatcherServlet
GET /user/1),请求被配置为前端控制器的 DispatcherServlet 拦截,作为整个请求处理流程的起点。2. 查找处理器(HandlerMapping)
DispatcherServlet 调用注册的 HandlerMapping(如 RequestMappingHandlerMapping)。HandlerMapping 根据请求 URL(如 /user/1)和 HTTP 方法(GET/POST 等),匹配到对应的 控制器方法(标记有 @RequestMapping 等注解的方法)。@RequestMapping("/user/{id}"),则路径 /user/1 会被正确映射。3. 调用处理器(HandlerAdapter)
DispatcherServlet 通过 HandlerAdapter 调用目标处理器(控制器方法)。HandlerAdapter 负责处理不同类型的处理器(如基于注解的控制器、传统 HttpRequestHandler),统一调用入口。@PathVariable)、请求参数(@RequestParam)、请求体(@RequestBody)等绑定到方法参数。4. 处理业务逻辑
Model 中(用于视图渲染),或直接返回数据(如 JSON)。ModelAndView:包含视图名称(如 user/detail)和模型数据(如 user 对象)。@ResponseBody 注解,返回 JSON/XML 等格式(如 @RestController 场景)。5. 解析视图(ViewResolver)
ModelAndView 或字符串视图名时,进入视图解析流程。ViewResolver(如 InternalResourceViewResolver)将逻辑视图名(如 userDetail)转换为物理视图(如 /WEB-INF/jsp/userDetail.jsp)。6. 渲染视图
Model 数据生成 HTML 页面。MappingJackson2HttpMessageConverter 将对象转为 JSON,无需视图解析(由 @ResponseBody 触发)。View 会读取 JSP 文件,结合 Model 数据渲染为最终 HTML 内容。7. 返回响应
DispatcherServlet 写回客户端(浏览器或接口调用方)。@ResponseBody 返回 JSON 数据,轻松构建 RESTful API。XML 配置(传统方式)
XML 配置(传统方式)
xml
<!-- web.xml 中配置 DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- springmvc-servlet.xml 配置组件 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> Java 配置(推荐,基于 @Configuration)
Java 配置(推荐,基于 @Configuration)
java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
return resolver;
}
// 自定义组件配置(如拦截器、消息转换器)
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**");
}
}
// 自定义组件配置(如拦截器、消息转换器) @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**"); } } 总之,Spring MVC 以 “MVC 架构” 为核心,通过注解驱动和灵活的组件设计,简化了 Web 开发流程,尤其适合需要细粒度控制请求处理和视图渲染的场景。其与 Spring 生态的深度集成,使其成为企业级 Java Web 开发的首选方案之一。结合 Spring Boot 的自动配置,可进一步减少样板代码,提升开发效率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。