SpringMVC快速入门之核心配置详解
-
- 一、SpringMVC的核心组件
- 二、SpringMVC的核心配置文件
-
- [2.1 Web容器配置(web.xml)](#2.1 Web容器配置(web.xml))
- [2.2 SpringMVC核心配置(spring-mvc.xml)](#2.2 SpringMVC核心配置(spring-mvc.xml))
- 三、核心配置详解与实战
-
- [3.1 注解驱动(<mvc:annotation-driven>)](#3.1 注解驱动(mvc:annotation-driven))
- [3.2 视图解析器配置](#3.2 视图解析器配置)
- [3.3 静态资源处理](#3.3 静态资源处理)
- [3.4 文件上传配置](#3.4 文件上传配置)
- 四、常见问题与避坑指南
-
- [4.1 中文乱码问题](#4.1 中文乱码问题)
-
- [4.1.1 POST请求参数乱码](#4.1.1 POST请求参数乱码)
- [4.1.2 JSON响应中文乱码](#4.1.2 JSON响应中文乱码)
- [4.2 静态资源404](#4.2 静态资源404)
- [4.3 视图解析器无法找到JSP](#4.3 视图解析器无法找到JSP)
- 总结:SpringMVC核心配置的核心要点
SpringMVC是基于Spring的MVC框架,用于构建Web应用,核心是通过配置将请求映射到处理器、处理数据绑定、渲染视图等,掌握SpringMVC的核心配置是快速开发Web应用的基础。
一、SpringMVC的核心组件
SpringMVC的核心是通过一系列组件协同工作,完成请求处理流程。了解这些组件是理解配置的基础。
组件 | 作用 | 核心配置点 |
---|---|---|
DispatcherServlet(前端控制器) | 接收所有请求,协调其他组件工作(核心入口) | web.xml中配置Servlet映射 |
HandlerMapping(处理器映射器) | 根据请求找到对应的处理器(Controller) | 配置请求映射规则(如@RequestMapping) |
HandlerAdapter(处理器适配器) | 执行处理器(Controller方法) | 配置适配器(默认适配注解控制器) |
Controller(处理器) | 处理请求的业务逻辑(如@Controller类) | 编写Controller方法并映射请求 |
ViewResolver(视图解析器) | 将逻辑视图名解析为物理视图(如JSP路径) | 配置前缀、后缀(如/WEB-INF/views/ + .jsp) |
ModelAndView | 封装处理结果和视图信息 | Controller方法返回ModelAndView或String |
二、SpringMVC的核心配置文件
SpringMVC的配置分为两部分:Web容器配置 (web.xml)和SpringMVC核心配置(spring-mvc.xml)。
2.1 Web容器配置(web.xml)
web.xml
用于配置DispatcherServlet
(前端控制器),这是SpringMVC的入口,所有请求都通过它转发。
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 1. 配置DispatcherServlet(前端控制器) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 2. 指定SpringMVC配置文件路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 3. 启动时加载(值越小优先级越高) -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 4. 配置Servlet映射(拦截所有请求,除了.jsp) -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 方式1:拦截所有请求(推荐) -->
<url-pattern>/</url-pattern>
<!-- 方式2:拦截特定后缀(如.do) -->
<!-- <url-pattern>*.do</url-pattern> -->
</servlet-mapping>
<!-- 5. 配置编码过滤器(解决POST请求中文乱码) -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
关键配置说明:
url-pattern>/</url-pattern>
:拦截所有请求(除JSP,容器默认Servlet处理.jsp);- 编码过滤器
CharacterEncodingFilter
:必须配置,否则POST请求中文参数会乱码; load-on-startup>1</load-on-startup>
:服务器启动时初始化Servlet,避免首次请求延迟。
2.2 SpringMVC核心配置(spring-mvc.xml)
spring-mvc.xml
配置处理器映射、视图解析器、注解驱动等核心组件,是SpringMVC的核心配置文件。
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 1. 扫描Controller包(自动注册@Controller注解的Bean) -->
<context:component-scan base-package="com.example.controller"/>
<!-- 2. 开启注解驱动(关键) -->
<mvc:annotation-driven>
<!-- 配置消息转换器(解决JSON响应中文乱码) -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 配置Jackson(返回JSON数据) -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 3. 配置视图解析器(JSP视图) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/> <!-- 视图前缀 -->
<property name="suffix" value=".jsp"/> <!-- 视图后缀 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 支持JSTL -->
</bean>
<!-- 4. 静态资源处理(放行CSS/JS/图片等,避免被DispatcherServlet拦截) -->
<mvc:resources mapping="/static/**" location="/static/"/>
<!-- 或使用默认Servlet处理静态资源 -->
<!-- <mvc:default-servlet-handler/> -->
<!-- 5. 配置文件上传解析器(可选,需添加commons-fileupload依赖) -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10485760"/> <!-- 最大上传大小10MB -->
</bean>
</beans>
关键配置说明:
<context:component-scan>
:扫描@Controller
注解的类,必须配置;<mvc:annotation-driven>
:开启注解驱动,自动注册处理器映射器和适配器,支持@RequestMapping
等注解;- 视图解析器:通过
prefix
和suffix
拼接视图路径(如逻辑视图名index
→/WEB-INF/views/index.jsp
); - 静态资源处理:
<mvc:resources>
用于放行静态资源(如/static/css/style.css
),否则会被DispatcherServlet
拦截导致404。
三、核心配置详解与实战
3.1 注解驱动(mvc:annotation-driven)
<mvc:annotation-driven>
是SpringMVC的"开关",作用:
- 自动注册
RequestMappingHandlerMapping
(处理器映射器)和RequestMappingHandlerAdapter
(处理器适配器); - 支持
@RequestMapping
、@RequestBody
、@ResponseBody
等注解; - 配置消息转换器(如JSON序列化、字符串编码)。
JSON响应配置 :
需添加Jackson依赖(用于将对象转为JSON):
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
在mvc:message-converters
中配置MappingJackson2HttpMessageConverter
,即可通过@ResponseBody
返回JSON:
java
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
@ResponseBody // 返回JSON
public User getUser(@PathVariable Integer id) {
return new User(id, "张三", 25); // 自动转为JSON
}
}
3.2 视图解析器配置
SpringMVC支持多种视图(JSP、Thymeleaf、Freemarker等),最常用的是JSP视图解析器InternalResourceViewResolver
。
JSP视图解析器配置
xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
使用示例:
java
@Controller
public class HomeController {
@GetMapping("/index")
public String index(Model model) {
model.addAttribute("message", "Hello SpringMVC");
return "index"; // 逻辑视图名,解析为/WEB-INF/views/index.jsp
}
}
JSP页面(/WEB-INF/views/index.jsp
):
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>${message}</h1> <!-- 显示模型数据 -->
</body>
</html>
3.3 静态资源处理
静态资源(CSS、JS、图片)若不配置,会被DispatcherServlet
拦截导致404,需通过以下方式处理:
方式1:mvc:resources(推荐)
xml
<!-- mapping:访问路径,**表示匹配所有子路径 -->
<!-- location:实际存储路径(Web应用根目录下) -->
<mvc:resources mapping="/static/**" location="/static/"/>
访问http://localhost:8080/app/static/css/style.css
时,会映射到/static/css/style.css
文件。
方式2:mvc:default-servlet-handler
使用容器默认Servlet处理静态资源(如Tomcat的DefaultServlet
):
xml
<mvc:default-servlet-handler/>
注意 :需放在<mvc:annotation-driven>
之前,否则可能覆盖注解驱动配置。
3.4 文件上传配置
实现文件上传需配置CommonsMultipartResolver
,步骤:
- 添加依赖:
xml
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
- 配置上传解析器:
xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
<property name="maxUploadSizePerFile" value="2097152"/> <!-- 单个文件最大2MB -->
</bean>
- 编写上传Controller:
java
@Controller
@RequestMapping("/upload")
public class UploadController {
@PostMapping
public String upload(@RequestParam("file") MultipartFile file, Model model) throws IOException {
if (!file.isEmpty()) {
// 保存文件到服务器
String path = "D:/upload/";
String filename = file.getOriginalFilename();
file.transferTo(new File(path + filename));
model.addAttribute("message", "上传成功:" + filename);
} else {
model.addAttribute("message", "上传失败:文件为空");
}
return "uploadResult"; // 跳转结果页面
}
}
四、常见问题与避坑指南
4.1 中文乱码问题
4.1.1 POST请求参数乱码
原因:未配置编码过滤器或配置错误。
解决方案 :确保web.xml
中配置CharacterEncodingFilter
,且forceEncoding
设为true
:
xml
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.1.2 JSON响应中文乱码
原因 :StringHttpMessageConverter
的默认编码不是UTF-8。
解决方案 :在mvc:message-converters
中配置编码:
xml
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
4.2 静态资源404
原因:
- 未配置静态资源处理,静态资源被
DispatcherServlet
拦截; <mvc:resources>
的mapping
和location
配置错误。
解决方案:
- 检查
mapping
和location
是否匹配(如mapping="/static/**"
对应location="/static/"
); - 确保静态资源实际路径正确(如
/static/css/style.css
确实存在); - 若使用
<mvc:default-servlet-handler>
,需放在<mvc:annotation-driven>
之前。
4.3 视图解析器无法找到JSP
错误信息 :Could not resolve view with name 'index' in servlet with name 'springmvc'
原因:
- 视图解析器的
prefix
或suffix
配置错误(路径拼接错误); - JSP文件未放在指定目录(如
/WEB-INF/views/
); - 逻辑视图名返回错误(如拼写错误)。
解决方案:
- 验证路径拼接是否正确(逻辑视图名
index
→prefix + "index" + suffix
); - 检查JSP文件是否存在(如
/WEB-INF/views/index.jsp
); - 确保返回的逻辑视图名正确(区分大小写)。
总结:SpringMVC核心配置的核心要点
SpringMVC的核心配置围绕"请求处理→业务逻辑→视图渲染"的流程:
-
基础配置:
web.xml
配置DispatcherServlet
和编码过滤器,是请求入口;spring-mvc.xml
配置组件扫描、注解驱动和视图解析器,是功能核心。
-
关键配置:
<context:component-scan>
:扫描Controller,必须配置;<mvc:annotation-driven>
:开启注解支持,不可或缺;- 视图解析器:正确配置
prefix
和suffix
,确保视图能被找到; - 静态资源处理:避免静态资源被拦截,否则会404。
-
避坑指南:
- 中文乱码:检查编码过滤器和消息转换器配置;
- 404错误:优先检查静态资源配置和视图路径;
- 注解不生效:确保
<mvc:annotation-driven>
已配置。
若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ