Spring Framework控制器开发:@Controller与@RequestMapping
【免费下载链接】spring-framework 项目地址: https://gitcode.com/gh_mirrors/spr/spring-framework
在Web应用开发中,控制器(Controller)扮演着处理用户请求并返回响应的关键角色。Spring Framework通过@Controller注解标识控制器类,使用@RequestMapping注解映射请求路径,二者配合实现了灵活高效的请求处理机制。本文将详细介绍这两个核心注解的使用方法、工作原理及最佳实践,帮助开发者快速掌握Spring控制器开发技术。
@Controller注解:标识控制器类
@Controller注解用于标记一个类作为Spring MVC中的控制器,它指示Spring将该类识别为能够处理HTTP请求的组件。被@Controller注解的类通常包含多个带有@RequestMapping或其变体注解(如@GetMapping、@PostMapping等)的方法,这些方法负责具体的请求处理逻辑。
@Controller注解的定义与作用
@Controller注解的源码位于spring-web模块中,它是一个特殊的构造型注解,继承自@Component注解,因此被@Controller标记的类会自动被Spring的组件扫描机制发现并注册为Bean。其主要作用是:
- 标识类为控制器,表明该类用于处理Web请求
- 启用Spring MVC的请求映射功能
- 支持依赖注入,便于在控制器中使用其他Spring管理的Bean
在Spring框架中,@Controller注解的处理由RequestMappingHandlerMapping类负责,该类会扫描所有被@Controller注解的类,并注册其中的请求映射方法。相关代码可参考spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java。
基本使用示例
创建一个简单的控制器类,使用@Controller注解标记:
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
// 控制器方法将在后续章节介绍
}
@RequestMapping注解:映射请求路径
@RequestMapping注解是Spring MVC中用于映射HTTP请求到控制器方法的核心注解。它可以用在类级别和方法级别,分别指定请求的基本路径和具体路径,二者组合形成完整的请求URL。
@RequestMapping注解的核心属性
@RequestMapping注解提供了多个属性,用于精确控制请求的映射条件,主要包括:
| 属性名 | 类型 | 描述 |
|---|---|---|
| value/path | String[] | 指定请求的URL路径,支持Ant风格通配符 |
| method | RequestMethod[] | 指定HTTP请求方法,如GET、POST、PUT、DELETE等 |
| params | String[] | 指定请求必须包含的参数,支持表达式 |
| headers | String[] | 指定请求必须包含的HTTP头信息 |
| consumes | String[] | 指定请求的Content-Type媒体类型 |
| produces | String[] | 指定响应的Content-Type媒体类型 |
这些属性的详细定义可参考spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java源码第84-217行。
类级别与方法级别的组合使用
@RequestMapping可以同时用在类和方法上,类级别的注解指定公共的请求路径前缀,方法级别的注解指定具体的请求路径,二者组合形成完整的请求URL。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping("/list")
@ResponseBody
public String listUsers() {
return "User List";
}
@RequestMapping("/view")
@ResponseBody
public String viewUser() {
return "View User";
}
}
上述示例中,UserController类被映射到/users路径,其中的listUsers方法映射到/users/list路径,viewUser方法映射到/users/view路径。
指定HTTP请求方法
通过method属性可以指定处理特定HTTP方法的请求,例如只处理GET请求或POST请求:
import org.springframework.web.bind.annotation.RequestMethod;
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ResponseBody
public String saveUser() {
return "User Saved";
}
为了简化常用HTTP方法的映射,Spring提供了@RequestMapping的变体注解:
@GetMapping:处理GET请求@PostMapping:处理POST请求@PutMapping:处理PUT请求@DeleteMapping:处理DELETE请求@PatchMapping:处理PATCH请求
使用这些变体注解可以使代码更加简洁明了:
import org.springframework.web.bind.annotation.GetMapping;
@GetMapping("/list")
@ResponseBody
public String listUsers() {
return "User List";
}
请求映射的高级用法
路径变量
@RequestMapping支持使用路径变量(Path Variables)捕获URL中的动态参数,通过{}占位符定义,使用@PathVariable注解获取:
import org.springframework.web.bind.annotation.PathVariable;
@RequestMapping("/users/{id}")
@ResponseBody
public String getUserById(@PathVariable Long id) {
return "User ID: " + id;
}
请求参数条件
通过params属性可以指定请求必须包含的参数,支持多种表达式:
// 必须包含username参数
@RequestMapping(value = "/search", params = "username")
@ResponseBody
public String searchByUsername(String username) {
return "Search results for: " + username;
}
// 必须包含username参数且不能为admin
@RequestMapping(value = "/search", params = "username!=admin")
@ResponseBody
public String searchExcludeAdmin(String username) {
return "Search results for: " + username;
}
请求头条件
使用headers属性可以根据请求头信息进行映射:
// 只处理Accept头为application/json的请求
@RequestMapping(value = "/data", headers = "Accept=application/json")
@ResponseBody
public String getDataAsJson() {
return "{\"name\":\"Spring\"}";
}
消费与生产媒体类型
consumes属性指定控制器方法可以消费的媒体类型(Content-Type),produces属性指定可以生成的媒体类型:
// 只处理JSON格式的请求体
@RequestMapping(value = "/save", method = RequestMethod.POST, consumes = "application/json")
// 返回JSON格式的响应
@ResponseBody
public String saveUserJson() {
return "{\"status\":\"success\"}";
}
控制器方法的返回值
控制器方法可以返回多种类型的值,Spring会根据返回类型和注解进行相应的处理:
返回ModelAndView
返回ModelAndView对象,包含视图名称和模型数据:
import org.springframework.web.servlet.ModelAndView;
@RequestMapping("/welcome")
public ModelAndView welcome() {
ModelAndView mav = new ModelAndView("welcome"); // 视图名称
mav.addObject("message", "Welcome to Spring MVC"); // 模型数据
return mav;
}
返回字符串
- 返回视图名称:
return "viewName"; - 使用
@ResponseBody注解返回响应体内容:return "response body"; - 返回重定向路径:
return "redirect:/anotherPath"; - 返回转发路径:
return "forward:/anotherPath";
返回JSON/XML
当方法上有@ResponseBody注解或控制器类上有@RestController注解时,返回的对象会自动序列化为JSON或XML格式(根据请求的Accept头和配置):
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/userinfo")
@ResponseBody
public User getUserInfo() {
User user = new User();
user.setId(1L);
user.setName("John Doe");
return user; // 将自动序列化为JSON
}
官方文档与示例代码
Spring Framework提供了详细的官方文档和丰富的示例代码,帮助开发者深入学习控制器开发技术:
- 官方文档:framework-docs/src/docs/api/dokka-overview.md
- 请求映射处理:spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java
- Spring WebMVC测试用例:可以参考
spring-webmvc/src/test目录下的测试类,了解各种请求映射场景的用法
最佳实践
使用@RestController简化RESTful API开发
对于RESTful API控制器,可以使用@RestController注解代替@Controller,它相当于@Controller和@ResponseBody的组合,会自动将方法返回值转换为响应体:
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/users")
public class UserApiController {
// 方法无需添加@ResponseBody注解
@GetMapping
public List<User> getAllUsers() {
// 返回用户列表,自动序列化为JSON
}
}
请求路径设计规范
- 使用名词复数形式表示资源集合,如
/users、/products - 使用HTTP方法表示操作类型,而非在URL中包含动词
- 使用嵌套路径表示资源之间的关系,如
/users/{id}/orders
参数验证
使用JSR-303/JSR-380验证注解(如@NotNull、@Size等)对请求参数进行验证:
import javax.validation.constraints.NotBlank;
@RequestMapping("/save")
public String saveUser(@NotBlank String username) {
// 处理用户保存
}
异常处理
使用@ExceptionHandler注解在控制器内部处理异常,或使用@ControllerAdvice创建全局异常处理器:
import org.springframework.web.bind.annotation.ExceptionHandler;
@ExceptionHandler(ResourceNotFoundException.class)
public String handleResourceNotFound(ResourceNotFoundException ex) {
return "error/404";
}
总结
@Controller和@RequestMapping是Spring MVC控制器开发的核心组件,它们共同构成了Spring处理HTTP请求的基础。通过@Controller标识控制器类,使用@RequestMapping及其变体注解映射请求路径,开发者可以轻松构建灵活高效的Web应用。
本文介绍了@Controller注解的作用、@RequestMapping注解的各种属性和用法,包括路径映射、请求方法指定、参数条件、头条件等高级特性,以及控制器方法的返回值处理方式。同时提供了最佳实践建议,帮助开发者编写更加规范、高效的控制器代码。
要深入学习Spring控制器开发,建议参考官方文档和源代码,特别是spring-webmvc/src/main/java/org/springframework/web/servlet/mvc目录下的相关类实现。通过不断实践和探索,掌握Spring MVC的强大功能,构建高质量的Web应用。
【免费下载链接】spring-framework 项目地址: https://gitcode.com/gh_mirrors/spr/spring-framework
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




