SpringMVC常用的注解

Spring MVC 提供了丰富的注解,这些注解可以简化开发过程,提高开发效率,使代码结构更加清晰。以下是 Spring MVC 中一些常用注解的详细介绍:

1. 控制器相关注解

1.1 @Controller
  • 作用:用于标记一个类为控制器类,告知 Spring 该类是处理 Web 请求的控制器。它是一个特殊的组件,Spring 会自动扫描带有该注解的类,并将其纳入 Spring 容器进行管理。

  • 示例:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;

    @Controller
    public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
    return "Hello, Spring MVC!";
    }
    }

在上述示例中,HelloController 类被 @Controller 注解标记,成为一个控制器类,其中的 hello 方法可以处理 /hello 请求。

1.2 @RestController
  • 作用 :这是 @Controller 和 @ResponseBody 的组合注解。使用 @RestController 标记的类,其所有方法的返回值都会被直接作为响应体返回,而不会经过视图解析器解析为视图。通常用于开发 RESTful 风格的 Web 服务。

  • 示例:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class UserController {
    @GetMapping("/users/{id}")
    public String getUser(@PathVariable("id") int id) {
    return "User with id: " + id;
    }
    }

在这个例子中,UserController 类使用 @RestController 注解,getUser 方法的返回值会直接作为 HTTP 响应返回给客户端。

2. 请求映射注解

2.1 @RequestMapping
  • 作用:用于将 HTTP 请求映射到控制器的方法上。可以指定请求的 URL、请求方法(如 GET、POST 等)、请求参数、请求头、媒体类型等条件。

  • 示例:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;

    @Controller
    public class ProductController {
    @RequestMapping(value = "/products", method = RequestMethod.GET)
    @ResponseBody
    public String getProducts() {
    return "List of products";
    }

    复制代码
      @RequestMapping(value = "/products", method = RequestMethod.POST)
      @ResponseBody
      public String addProduct() {
          return "Product added";
      }

    }

在上述代码中,getProducts 方法处理 /products 的 GET 请求,addProduct 方法处理 /products 的 POST 请求。

2.2 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
  • 作用 :这些注解是 @RequestMapping 的派生注解,分别对应 HTTP 的 GET、POST、PUT、DELETE、PATCH 请求方法,使代码更加简洁易读。

  • 示例:

    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class BookController {
    @GetMapping("/books")
    public String getBooks() {
    return "List of books";
    }

    复制代码
      @PostMapping("/books")
      public String addBook() {
          return "Book added";
      }
    
      @DeleteMapping("/books/{id}")
      public String deleteBook(@PathVariable("id") int id) {
          return "Book with id: " + id + " deleted";
      }

    }

这里分别使用了 @GetMapping、@PostMapping 和 @DeleteMapping 注解来处理不同类型的请求。

3. 请求参数绑定注解

3.1 @RequestParam
  • 作用:用于将请求参数绑定到控制器方法的参数上。可以指定请求参数的名称、是否为必需参数、默认值等。

  • 示例:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class SearchController {
    @GetMapping("/search")
    public String search(@RequestParam("keyword") String keyword,
    @RequestParam(value = "page", defaultValue = "1") int page) {
    return "Searching for: " + keyword + " on page: " + page;
    }
    }

在这个例子中,keyword 是必需的请求参数,page 是可选参数,默认值为 1。

3.2 @PathVariable
  • 作用:用于从请求的 URL 路径中提取变量值,并绑定到控制器方法的参数上。通常用于 RESTful 风格的 URL 中。

  • 示例:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class OrderController {
    @GetMapping("/orders/{orderId}")
    public String getOrder(@PathVariable("orderId") int orderId) {
    return "Order with id: " + orderId;
    }
    }

这里从 URL /orders/{orderId} 中提取 orderId 并绑定到方法参数上。

3.3 @RequestBody
  • 作用:用于将 HTTP 请求的主体内容(如 JSON、XML 等)绑定到控制器方法的参数上。通常用于处理 POST、PUT 等请求中的请求体数据。

  • 示例:

    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;

    class User {
    private String name;
    private int age;

    复制代码
      // Getters and Setters
      public String getName() {
          return name;
      }
    
      public void setName(String name) {
          this.name = name;
      }
    
      public int getAge() {
          return age;
      }
    
      public void setAge(int age) {
          this.age = age;
      }

    }

    @RestController
    public class UserController {
    @PostMapping("/users")
    public String createUser(@RequestBody User user) {
    return "User created: " + user.getName() + ", age: " + user.getAge();
    }
    }

在这个例子中,客户端发送的 JSON 数据会被自动映射到 User 对象上。

4. 响应相关注解

4.1 @ResponseBody
  • 作用 :用于将控制器方法的返回值直接作为 HTTP 响应体返回,而不经过视图解析器解析为视图。通常与 @Controller 注解一起使用,或者使用 @RestController 注解替代。

  • 示例:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;

    @Controller
    public class JsonController {
    @RequestMapping("/json")
    @ResponseBody
    public String getJson() {
    return "{"message": "This is a JSON response"}";
    }
    }

4.2 @ResponseStatus
  • 作用:用于指定控制器方法返回的 HTTP 响应状态码。可以在方法或类上使用。

  • 示例:

    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class StatusController {
    @GetMapping("/notfound")
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String notFound() {
    return "Resource not found";
    }
    }

在这个例子中,notFound 方法返回的 HTTP 状态码为 404。

5. 其他注解

5.1 @ModelAttribute
  • 作用:有两种主要用途。一是在方法参数上使用时,用于从请求参数、表单数据等中获取数据并绑定到模型对象上;二是在方法上使用时,用于将方法的返回值添加到模型中。

  • 示例:

    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RestController;

    class Product {
    private String name;
    private double price;

    复制代码
      // Getters and Setters
      public String getName() {
          return name;
      }
    
      public void setName(String name) {
          this.name = name;
      }
    
      public double getPrice() {
          return price;
      }
    
      public void setPrice(double price) {
          this.price = price;
      }

    }

    @RestController
    public class ProductController {
    @GetMapping("/products/add")
    public String addProduct(@ModelAttribute Product product, Model model) {
    model.addAttribute("product", product);
    return "Product added: " + product.getName() + ", price: " + product.getPrice();
    }

    复制代码
      @ModelAttribute("welcomeMessage")
      public String getWelcomeMessage() {
          return "Welcome to our product page";
      }

    }

在这个例子中,addProduct 方法使用 @ModelAttribute 将请求参数绑定到 Product 对象上,getWelcomeMessage 方法使用 @ModelAttribute 将返回值添加到模型中。

5.2 @SessionAttributes
  • 作用 :用于指定哪些模型属性应该存储在会话中,以便在多个请求之间共享。通常与 @ModelAttribute 一起使用。

  • 示例:

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.SessionAttributes;

    @Controller
    @SessionAttributes("user")
    public class SessionController {
    @GetMapping("/setUser")
    public String setUser(@ModelAttribute("user") String user, Model model) {
    model.addAttribute("user", user);
    return "User set in session: " + user;
    }

    复制代码
      @GetMapping("/getUser")
      public String getUser(@ModelAttribute("user") String user) {
          return "User retrieved from session: " + user;
      }

    }

在这个例子中,user 属性被存储在会话中,在 setUser 方法中设置,在 getUser 方法中获取。

相关推荐
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8265 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡5 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne7 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_8 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs8 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲8 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261689 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail9 小时前
05 管理活动与选品
java