一、SpringMVC 简介
SpringMVC 是基于 MVC 设计模式的轻量级 Web 框架,核心功能包括:
- 请求分发:通过
DispatcherServlet
统一处理请求。 - 注解驱动:使用
@Controller
、@RequestMapping
简化开发。 - 视图解析:支持 JSP、Thymeleaf 等多种视图技术。
在三层架构中的位置:
- 表现层:SpringMVC 负责处理用户请求(如
/user/login.form
)。 - 业务层:Spring 的 Service 层处理业务逻辑。
- 持久层:MyBatis 或 Hibernate 操作数据库。
二、项目快速搭建
1. 创建 Maven 项目
添加以下依赖(以 Spring 5.3.10 为例):
<dependencies>
<!-- SpringMVC 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
2. 配置 web.xml
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 手动指定配置文件路径(推荐) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!-- 拦截规则配置 -->
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
3. 创建 SpringMVC 配置文件
文件:src/main/resources/springmvc-config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="...">
<!-- 扫描控制器包 -->
<context:component-scan base-package="com.example.controller" />
<!-- 开启注解驱动 -->
<mvc:annotation-driven />
<!-- 放行静态资源(可选) -->
<mvc:resources mapping="/static/**" location="/static/" />
</beans>
三、核心配置详解
1. servlet-name
与配置文件的对应关系
- 默认规则:SpringMVC 默认加载
WEB-INF/[servlet-name]-servlet.xml
(如dispatcher-servlet.xml
)。 - 自定义路径:通过
contextConfigLocation
参数指定配置文件路径(推荐)。
2. url-pattern
拦截模式
模式 | 行为 | 适用场景 | 注意事项 |
---|---|---|---|
*.form |
仅拦截以 .form 结尾的请求 |
传统 Web 项目 | 需手动放行静态资源 |
/ |
拦截所有非 JSP 请求(包括静态资源) | 前后端分离项目 | 需配置静态资源映射 |
/* |
拦截所有请求(包括 JSP) | 不推荐使用 | 导致 JSP 无法渲染 |
3. 静态资源处理
在 springmvc-config.xml
中添加:
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />
四、最佳实践与常见问题
1. 配置推荐
- 传统 Web 项目:使用
*.form
拦截模式,JSP 直接访问。 - RESTful API 项目:使用
/
拦截模式,放行静态资源。
2. 常见问题解决
问题 | 原因 | 解决方案 |
---|---|---|
静态资源 404 | 未配置资源映射 | 添加 <mvc:resources> |
JSP 无法访问 | 误用 /* 拦截模式 |
改为 / 或 .form 模式 |
Controller 未生效 | 包扫描路径错误 | 检查 component-scan 配置 |
五、完整配置示例
web.xml
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="...">
<!-- 控制器包扫描 -->
<context:component-scan base-package="com.example.controller" />
<!-- 开启注解驱动 -->
<mvc:annotation-driven />
<!-- 静态资源放行 -->
<mvc:resources mapping="/static/**" location="/static/" />
</beans>
六、扩展内容
- RESTful 支持:使用
@GetMapping
、@PostMapping
简化请求映射。 - 数据绑定:通过
@RequestParam
获取参数,@RequestBody
接收 JSON。 - 视图解析器:配置
InternalResourceViewResolver
简化视图路径:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>