1. Spring MVC自动配置原理
核心机制:
Spring Boot通过DispatcherServletAutoConfiguration自动配置DispatcherServlet,无需手动在web.xml中声明。默认拦截所有请求(/),但排除JSP请求。
关键组件自动配置:
-
视图解析器 :默认使用
ContentNegotiatingViewResolver,支持多种视图解析策略(如JSP、Thymeleaf)。 -
静态资源管理 :默认映射
/webjars/**和classpath:/static/等路径。 -
消息转换器 :自动注册
MappingJackson2HttpMessageConverter(JSON处理)等转换器。 -
文件上传 :自动配置
MultipartResolver,支持multipart/form-data表单提交。
示例配置 (application.properties):
# 文件上传大小限制
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB
2. Spring MVC扩展配置
通过实现WebMvcConfigurer接口扩展Spring MVC功能:
2.1 视图控制器(请求转发)
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/tx").setViewName("success"); // /tx → success.html
}
}
2.2 拦截器注册
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("前置拦截");
return true; // 继续流程
}
}
// 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/hello2"); // 排除特定路径
}
2.3 消息转换器(Fastjson集成)
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
converter.setFastJsonConfig(config);
converters.add(converter);
}
实体类注解控制格式:
public class User {
@JSONField(format = "yyyy-MM-dd")
private Date createTime;
}
2.4 格式化器(日期处理)
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new Formatter<Date>() {
@Override
public Date parse(String text, Locale locale) throws ParseException {
return new SimpleDateFormat("yyyy-MM-dd").parse(text);
}
});
}
3. 静态资源管理
默认规则:
-
路径映射 :
/webjars/**→classpath:/META-INF/resources/webjars/ -
静态资源路径 :
classpath:/static/,classpath:/public/,classpath:/resources/ -
欢迎页 :自动映射
index.html到根路径(/)。
自定义配置 (application.properties):
spring.resources.static-locations=classpath:/custom-static/
spring.mvc.static-path-pattern=/static/**
4. 文件上传配置
Controller示例:
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
String path = "D:/uploads/" + file.getOriginalFilename();
file.transferTo(new File(path));
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
}
return "上传失败";
}
配置文件 (application.properties):
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=/tmp
5. 外置Servlet容器配置
步骤:
-
修改依赖 (
pom.xml):<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <scope>provided</scope> </dependency> -
打包为WAR:
-
修改
pom.xml打包类型:<packaging>war</packaging> -
创建
ServletInitializer类:public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder app) { return app.sources(YourApplication.class); } }
-
-
部署目录结构:
/WEB-INF web.xml (可选) classes/ /static /templates
6. 高级配置
6.1 自定义Servlet/Filter/Listener
@Bean
public ServletRegistrationBean<MyServlet> myServlet() {
return new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
}
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
FilterRegistrationBean<Filter> filterRegBean = new FilterRegistrationBean<>();
filterRegBean.setFilter(new MyFilter());
filterRegBean.addUrlPatterns("/api/*");
return filterRegBean;
}
6.2 跨域配置(CORS)
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST");
}
7. 总结
-
自动配置 :Spring Boot通过条件化配置简化Spring MVC集成,默认覆盖核心组件(如
DispatcherServlet、视图解析器)。 -
扩展性 :通过
WebMvcConfigurer接口灵活定制拦截器、消息转换器等。 -
外置容器:支持WAR包部署到Tomcat等Servlet容器,适用于生产环境。