![SpringMVC架构图]
(示意图:SpringMVC请求处理流程)
一、SpringMVC核心组件解析
SpringMVC的配置体系围绕其核心组件展开,理解这些组件是掌握配置的关键。根据最新资料,核心组件主要包括:
1. DispatcherServlet
- 作用:前端控制器,负责请求的统一分发(所有请求的入口)
- 配置位置:
web.xml中定义Servlet映射 - 关键参数:
contextConfigLocation指定Spring配置文件路径
<!-- 示例配置 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2. HandlerMapping
- 作用:建立请求URL与Controller方法的映射关系
- 实现方式:
- XML配置(如
SimpleUrlHandlerMapping) - 注解驱动(
@RequestMapping)
- XML配置(如
- 配置示例:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
3. ViewResolver
- 作用:将逻辑视图名转换为物理视图路径
- 常用实现:
InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
其他重要组件如HandlerAdapter(方法调用适配器)、MultipartResolver(文件上传处理)、ExceptionResolver(异常统一处理)的配置方式详见。
二、配置全流程详解(XML与注解双模式)
步骤1:基础环境搭建
- 依赖管理(Maven示例):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.25</version>
</dependency>
- web.xml配置:
- 配置DispatcherServlet拦截规则(
/*与/的区别) - 字符编码过滤器设置(解决中文乱码)
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
步骤2:Spring MVC配置文件
<!-- spring-mvc.xml -->
<!-- 注解驱动 -->
<mvc:annotation-driven/>
<!-- 组件扫描 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 静态资源处理 -->
<mvc:resources mapping="/static/**" location="/static/"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
步骤3:Controller开发(注解方式)
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public String getUserInfo(@RequestParam("id") Long id, Model model) {
model.addAttribute("user", userService.getById(id));
return "user/detail";
}
@PostMapping("/update")
@ResponseBody
public ApiResponse updateUser(@Valid UserDTO dto) {
// 业务处理
return ApiResponse.success();
}
}
运行
三、配置中的"坑"与解决方案
典型问题1:404错误排查
- 症状:请求路径正确但返回404
- 排查步骤:
- 检查
@Controller是否被扫描(包路径配置) - 验证视图解析器前缀/后缀是否匹配物理路径
- 查看静态资源是否被错误拦截(
<mvc:resources>配置) - 确认JSP文件是否存放在
WEB-INF目录下(安全最佳实践)
- 检查
典型问题2:拦截器失效
- 常见原因:
- 未实现
HandlerInterceptor接口 - 配置类未添加
@EnableWebMvc - 与其他WebMvc配置冲突(如自定义
WebMvcConfigurer)
- 未实现
- 正确配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**");
}
}
运行
四、高级配置与优化技巧
1. RESTful API最佳实践
- 使用
@RestController代替@Controller+@ResponseBody - 配置统一响应格式:
@ControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
// 统一包装响应体
}
运行
2. 文件上传优化
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/> <!-- 100MB -->
</bean>
3. 性能优化策略
- 启用异步处理:
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
// 配置线程池
}
运行
- 缓存静态资源(配置HTTP缓存头)
五、版本演进带来的配置变化
Spring 5.x+ 重要变化
| 特性 | 旧版本 | 5.x+新方案 |
|---|---|---|
| 配置方式 | XML为主 | Java Config优先 |
| Servlet支持 | 最低3.0 | 必须4.0+ |
| 响应式编程 | 不支持 | WebFlux模块支持 |
| 路径匹配 | Ant风格 | 新增PathPattern解析器 |
配置迁移示例(传统XML → Java Config):
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
AnnotationConfigWebApplicationContext context =
new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
servletContext.addServlet("dispatcher",
new DispatcherServlet(context)).addMapping("/");
}
}
运行
结语:配置哲学思考
SpringMVC的配置演进体现了"约定优于配置"的设计哲学。从早期的XML繁琐配置,到注解驱动的简洁,再到Spring Boot的自动配置,开发者需要:
- 理解原理:掌握组件生命周期与交互机制
- 善用工具:IDE的配置验证、Actuator的健康检查
- 保持更新:关注Spring官方文档的版本变化
"好的框架应该让常见任务变得简单,困难任务变得可能。" —— Spring创始人Rod Johnson
168万+

被折叠的 条评论
为什么被折叠?



