Spring Framework控制器开发:@Controller与@RequestMapping

Spring Framework控制器开发:@Controller与@RequestMapping

【免费下载链接】spring-framework 【免费下载链接】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。其主要作用是:

  1. 标识类为控制器,表明该类用于处理Web请求
  2. 启用Spring MVC的请求映射功能
  3. 支持依赖注入,便于在控制器中使用其他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/pathString[]指定请求的URL路径,支持Ant风格通配符
methodRequestMethod[]指定HTTP请求方法,如GET、POST、PUT、DELETE等
paramsString[]指定请求必须包含的参数,支持表达式
headersString[]指定请求必须包含的HTTP头信息
consumesString[]指定请求的Content-Type媒体类型
producesString[]指定响应的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提供了详细的官方文档和丰富的示例代码,帮助开发者深入学习控制器开发技术:

Spring Framework Logo

最佳实践

使用@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 【免费下载链接】spring-framework 项目地址: https://gitcode.com/gh_mirrors/spr/spring-framework

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值