Spring_MVC 快速入门指南
一、Spring_MVC 简介
1. 什么是 Spring_MVC?
Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,使代码结构更加清晰,便于维护和扩展。
2. Spring_MVC 的优势
清晰的分离:将业务逻辑、数据和视图分离,使代码更易于管理和测试。
灵活的配置:支持多种配置方式,包括 XML 和注解。
丰富的功能:提供了许多内置功能,如数据绑定、类型转换、国际化等。
与其他 Spring 模块集成:可以无缝地与其他 Spring 模块(如 Spring Data、Spring Security)集成。
二、创建 Spring_MVC 应用
1. 依赖导入
在项目的 pom.xml
文件中添加以下依赖:
xml
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.12</version>
</dependency>
2. 创建配置类
创建一个配置类 SpringMvcConfig.java
,用于替代传统的 XML 配置:
java
package com.itheima.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan("com.itheima.Controller") // 指定要扫描的包
@EnableWebMvc // 启用 Spring_MVC 的功能
public class SpringMvcConfig {
}
3. 创建启动类
创建一个继承自 AbstractDispatcherServletInitializer
的类 ServletConfig.java
,用于配置和启动 Spring_MVC 应用:
java
package com.itheima.config;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import org.springframework.web.servlet.support.AnnotationConfigWebApplicationContext;
import javax.servlet.Filter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
public class ServletConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(SpringMvcConfig.class); // 注册配置类
return context;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; // 所有请求都由 Spring_MVC 处理
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter};
}
}
4. 创建控制器
创建一个控制器类 UserController.java
,使用 @Controller
注解标记,并通过 @RequestMapping
注解设置请求路径:
java
package com.itheima.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
public class UserController {
@RequestMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello, Spring_MVC!";
}
@RequestMapping(value = "/user/save", method = RequestMethod.POST)
@ResponseBody
public String saveUser() {
System.out.println("User saved successfully");
return "{\"status\": \"success\", \"message\": \"User saved\"}";
}
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public String getUserById(@PathVariable Integer id) {
System.out.println("Retrieving user with ID: " + id);
return "{\"id\": " + id + ", \"name\": \"John Doe\"}";
}
}
构造形式:

三、请求路径设置与控制器注解详解
1. @Controller
注解
- 用于标记一个类为控制器类。
- Spring 容器会扫描带有
@Controller
注解的类,并将其注册为 Spring Bean。
2. @RequestMapping
注解
- 用于映射 HTTP 请求到处理方法。
- 可用于类级别(设置基础路径)和方法级别(设置具体路径)。
- 支持多种 HTTP 方法(GET、POST、PUT、DELETE)。
java
@Controller
@RequestMapping("/api") // 类级别的基础路径
public class ApiController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getUser() {
return "User data";
}
}
3. @ResponseBody
注解
- 用于指定方法的返回值将直接作为响应体返回给客户端。
- 常用于返回 JSON 或 XML 数据。
java
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public String getUser() {
return "{\"id\": 1, \"name\": \"John Doe\"}";
}
4. @RequestBody
注解
- 用于将请求体中的数据绑定到方法参数。
- 常用于处理 POST 或 PUT 请求中的 JSON 或 XML 数据。
java
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String saveUser(@RequestBody User user) {
return "{\"status\": \"success\"}";
}
5. @PathVariable
注解
- 用于从 URL 中提取占位符参数。
- 常用于动态获取路径中的参数。
java
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public String getUserById(@PathVariable Integer id) {
return "{\"id\": " + id + ", \"name\": \"John Doe\"}";
}
四、运行应用
完成上述步骤后,启动应用服务器(如 Tomcat),可以通过以下 URL 访问您的应用:
http://localhost:8080/hello
:返回 "Hello, Spring_MVC!"。http://localhost:8080/user/save
:返回用户保存成功的 JSON 数据。http://localhost:8080/user/1
:返回用户信息的 JSON 数据。
五、常见问题与解决方案
1. 无法访问控制器方法
- 可能原因:控制器类或方法未正确标注注解,或注解路径配置错误。
- 解决方案 :检查控制器类是否使用
@Controller
注解,方法是否使用@RequestMapping
注解,以及路径是否正确。
2. 返回 JSON 数据时出现 406 错误
- 可能原因:客户端不接受应用返回的 JSON 数据类型。
- 解决方案 :确保在控制器方法上添加
@ResponseBody
注解,并在请求头中设置Accept: application/json
。
3. 中文乱码问题
-
可能原因:请求或响应的编码设置不正确。
-
解决方案:
在
ServletConfig
类中添加字符编码过滤器:java@Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[]{characterEncodingFilter}; }
在 Tomcat 启动配置中添加 JVM 参数:
-Dfile.encoding=UTF-8