SpringMVC之注解的使用

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

SpringMVC之注解的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

通过注解,我们可以在代码中轻松地标识和配置 SpringMVC 的组件,如控制器、视图、请求映射等。这种方式大大减少了冗余的配置文件,提高了开发效率。

在本博客中,我们将深入探讨 SpringMVC 中注解的使用。我们将了解注解的基本概念和工作原理,学习如何使用注解来创建控制器、处理请求和渲染视图。此外,我们还将探讨一些常见的注解,以及如何通过注解进行参数传递和验证。

无论是 SpringMVC 的新手还是有经验的开发者,本博客都将提供有价值的信息和实际示例,帮助你更好地理解和应用注解来简化你的 Web 开发工作。


提示:以下是本篇文章正文内容,下面案例可供参考

一、注解的使用

@Controller

作用:标记控制器,将控制器交给Spring容器管理。

位置:类上方

java 复制代码
import org.springframework.stereotype.Controller;

@Controller
public class MyController {
    // 处理请求的方法
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // 在此编写请求处理逻辑
    }
}

在上述示例中,我们创建了一个名为MyController的类,并在其上添加了@Controller注解。这样,该类就被标记为一个 SpringMVC 控制器。

@Controller注解通常与@RequestMapping注解一起使用,来指定控制器处理的请求路径。

@Controller

作用:给控制器方法设置请求路径

位置:方法或类上方。用于类上,表示类中的所有控制器方法都是以该地址作为父路径。

属性:

  • value/path:请求路径
  • method:指定请求方式
  • params:规定必须发送的请求参数
  • headers:规定请求必须包含的请求头
java 复制代码
@Controller
@RequestMapping("/c3")
public class MyController3 {
   /*
    访问路径为 /c3/annotation1
    支持post和get请求
    请求时必须带有age参数
    请求时必须带有User-agent请求头
   */
  @RequestMapping(path = "/my_path",method = {RequestMethod.GET,RequestMethod.POST},params = {"age"},headers = {"User-agent"})
  public String annotation1(String username){
    System.out.println(username);
    return "index";
   }
}

在上述示例中,我们使用@RequestMapping注解指定了控制器处理的根路径为"/my_path",也就是说当用户在浏览器输入的是"/my_path"路径,则访问的方法就是annotation1。并且规定请求方法必须为GET方法,必须包含参数"age",必须带有请求头"User-agent"。

@RequestParam

作用:在控制器方法中获取请求参数

位置:方法参数前

属性:

  • name:指定请求参数名称
  • defaultValue: 为参数设置默认值
  • required:设置是否是必须要传入的参数
java 复制代码
/*
  定义请求的参数名为username,默认值为sxt,不是必须的参数
 */
@RequestMapping("/annotation2")
public String annotation2(@RequestParam(name = "username",defaultValue = "sxt",required = false) String name){
  System.out.println(name);
  return "index";
}

特别注意,在以下场景中,使用@RequestParam注解是必要的:

  • 强制请求参数存在:如果你的方法需要一个特定的请求参数才能正常工作,并且该参数是必需的,那么可以使用@RequestParam注解,并将required属性设置为true。这样可以确保在调用该方法时,请求中必须包含指定的参数,否则会抛出异常。
  • 明确请求参数的名称:当请求参数的名称与方法参数的名称不一致时,可以使用@RequestParam注解来指定请求参数的名称。这样可以让 Spring Web 框架正确地将请求参数的值绑定到方法参数上。
  • 处理默认值:如果你希望在请求参数不存在时为方法参数提供一个默认值,可以使用@RequestParam注解,并设置defaultValue属性。这样,当请求中没有提供该参数时,方法参数将使用默认值。
  • 类型转换:如果请求参数的类型与方法参数的类型不匹配,并且你希望进行类型转换,可以使用@RequestParam注解,并提供相应的转换规则。这样,Spring Web 框架会在参数绑定时进行类型转换。
    总的来说,使用@RequestParam注解可以更好地控制请求参数的处理,确保方法的正确性和可靠性。但在一些简单的情况下,也可以根据参数的位置或名称来获取请求参数的值,而无需使用@RequestParam注解。

@RequestHeader

作用:在控制器方法中获取请求头数据

位置:方法参数前

java 复制代码
@Controller
public class MyController {
	@RequestMapping("/annotation3")
    public void handleRequest(@RequestHeader(name = "My-Header") String headerValue) {
        // 获取请求头 My-Header 的值并进行处理
        System.out.println("请求头 My-Header 的值为:" + headerValue);
    }
}

在上述示例中,我们在handleRequest方法的参数上使用@RequestHeader注解,指定了请求头的名称为My-Header。当有一个名为My-Header的请求头传递给该方法时,它会将该请求头的值绑定到方法参数headerValue上。

注:@RequestParam注解主要用于获取请求参数(指问号后的参数,如url?a=1&b=2),也可以用于获取请求头中的数据。而@RequestHeader是用来专门获取请求头的数据。

@CookieValue

作用:在控制器方法中获取Cookie数据

位置:方法参数前

java 复制代码
/*
    获取User-Agent请求头
    获取JSESSIONID的Cookie值
   */
@RequestMapping("/annotation4")
public String annotation4(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String jSessionId){
  System.out.println(userAgent);
  System.out.println(jSessionId);
  return "index";
}

在上述示例中,我们在处理方法的参数上使用@CookieValue注解,指定了 cookie 的名称为JSESSIONID。当有一个名为JSESSIONID的 cookie 传递给该方法时,它会将该 cookie 的值绑定到方法参数cookieValue上。

通过使用@CookieValue注解,我们可以直接在方法参数上获取 cookie 的值,而无需在代码中手动解析 cookie。

@CookieValue注解还可以配置其他属性,如是否必填、默认值等,以满足更具体的需求。

@SessionAttributes

作用:将Model模型中的数据存到session域中

位置:类上方

java 复制代码
@Controller
@RequestMapping("/c4")
// 将模型中的name数据保存到session中
@SessionAttributes("name")
public class MyController4 {
  @RequestMapping("/t1")
  public String t1(Model model){
    // model中保存name数据
    model.addAttribute("name","张三");
    return "index";
   }
  @RequestMapping("/t2")
  public String t2(HttpSession session){
    // 从session中获取name数据
    System.out.println(session.getAttribute("name"));
    return "index";
   }
}

在上述示例中,@SessionAttributes作用在MyController4,那么只要保存在model模型里的数据都会保存在session域中,所以在t2方法中,可以直接获取"name"的值。

@ModelAttribute

作用1:设置指定方法在控制器其他方法前执行

位置:方法上方

java 复制代码
@Controller
@RequestMapping("/c5")
public class MyController5 {
  @ModelAttribute
  public void before(){
    System.out.println("前置方法");
   }
  @RequestMapping("/t1")
  public String t1(){
    System.out.println("t1");
    return "baizhan";
   }
}
在上述示例中,因为before方法上有@ModelAttribute,所以放进入到"/c5/.."方法的时候,会优先执行before方法,再执行"/c5/.."。

作用2:从Model模型中获取数据给参数赋值

位置:方法参数前

java 复制代码
@Controller
@RequestMapping("/c6")
public class MyController6 {
  // 前置方法向Model中设置数据
  @ModelAttribute
  public void before(Model model){
    model.addAttribute("name","张三");
   }
  // 该参数不是从请求中获取,而是从Model中获取
  @RequestMapping("/t1")
  public String t1(@ModelAttribute("name") String name){
    System.out.println(name);
    return "baizhan";
   }
}

在上述代码中,t1中的name属性的值来自model中,而model的值来自方法before中

@PathVariable

作用:在RESTful风格的URL中获取占位符的值

位置:方法参数前

属性:

  • value:获取哪个占位符的值作为参数值,如果占位符和参数名相同,可以省略该属性。
java 复制代码
import org.springframework.web.bind.annotation.PathVariable;

// 在一个控制器方法上使用 @PathVariable 注解
// 路径中的{id}表示占位符,最后会封装到方法的参数中使用
// 如果占位符和参数名相同,可以省略@PathVariable的value属性
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
    // 通过PathVariable 注解获取 URL 中的 id 值,并进行后续操作
    return repository.findById(id);
}

在上述示例中,@GetMapping("/users/{id}")注解将/users/{id}路径与该方法进行关联。@PathVariable("id")注解用于将 URL 中的{id}部分标记为路径变量。当调用/users/1这样的 URL 时,Spring 会将{id}的值解析为1,并将其传递给方法中的id参数。

通过使用@PathVariable注解,你可以方便地在 Spring Web 应用中处理 URL 路径变量。

大家仔细一点可以看见,方法上面使用的是@GetMapping注解,而不是@RequestMapping注解。@PathVariable注解用于从 URL 路径中提取变量值,并将其传递给处理方法的参数。而@GetMapping、@PostMapping、@DeleteMapping和@PutMapping是 Spring Web 框架中的注解,用于定义不同类型的 HTTP 请求的映射。

当我们使用这些注解时,可以方便地在处理方法中获取 URL 路径中的变量值,从而实现动态路由和参数传递。

例如,假设有一个接口用于获取用户详细信息,其 URL 路径可能是/users/{id}。通过使用@GetMapping("/users/{id}")注解来映射这个路径,并使用@PathVariable("id")来提取{id}部分的值,我们可以在处理方法中获取到用户的 ID,并根据这个 ID 来查询和返回相应的用户详细信息。

同样的道理,对于其他类型的 HTTP 请求(如 POST 请求用于创建新用户、DELETE 请求用于删除用户等),我们也可以使用类似的方式,通过注解和路径变量来提取和处理相应的参数。

这样做的好处是,使得我们的代码更加简洁、易读,并且能够更好地与 URL 路径进行解耦。同时,也方便了在不同的请求类型和路径下进行统一的参数处理和路由管理。

@PostMapping、@GetMapping、@PutMapping、@DeleteMapping

作用:简化设置请求方式的@RequestMapping写法

  • @PostMapping注解用于处理 POST 请求,通常用于创建资源。
  • @GetMapping注解用于处理 GET 请求,通常用于获取资源。
  • @GetMapping注解用于处理 GET 请求,通常用于获取资源。
  • @DeleteMapping注解用于处理 DELETE 请求,通常用于删除资源。

位置:方法上方。

java 复制代码
@RestController
public class MyController {

    @PostMapping("/myResource")
    public void createMyResource(@RequestBody MyResource resource) {
        // 创建资源的逻辑
    }

    @GetMapping("/myResource/{id}")
    public MyResource getMyResource(@PathVariable("id") Long id) {
        // 获取资源的逻辑
    }

    @PutMapping("/myResource/{id}")
    public void updateMyResource(@PathVariable("id") Long id, @RequestBody MyResource resource) {
        // 更新资源的逻辑
    }

    @DeleteMapping("/myResource/{id}")
    public void deleteMyResource(@PathVariable("id") Long id) {
        // 删除资源的逻辑
    }
}

在上述示例中,@PostMapping注解用于处理 POST 请求,将请求体的数据映射到MyResource对象,并调用createMyResource方法进行资源的创建。@GetMapping注解用于处理 GET 请求,通过路径变量{id}获取资源的 ID,并调用getMyResource方法获取资源。@PutMapping注解用于处理 PUT 请求,同样通过路径变量{id}获取资源的 ID,并将请求体的数据映射到MyResource对象,调用updateMyResource方法进行资源的更新。@DeleteMapping注解用于处理 DELETE 请求,通过路径变量{id}获取资源的 ID,并调用deleteMyResource方法删除资源。

这些注解使得我们可以更加方便地定义不同请求类型的处理方法,并与 URL 路径进行解耦。同时,Spring Framework 会根据注解的信息自动生成相应的 HTTP 请求映射,从而简化了开发过程。

@ResponseBody

作用:方法返回的对象转换为JSON格式,并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可以处理Ajax请求。

位置:方法上方或方法返回值前

java 复制代码
@RestController
public class MyController {

    @GetMapping("/myResource")
    @ResponseBody
    public MyResource getMyResource() {
        // 获取资源的逻辑
        return new MyResource("Hello, World!");
    }
}

在上述示例中,@GetMapping注解表示该方法处理 GET 请求,/myResource是请求的路径。@ResponseBody注解表示方法的返回值将直接作为 HTTP 响应的内容返回给客户端。

当调用http://your-domain.com/myResource这样的 URL 时,客户端将接收到一个包含"Hello, World!"的响应。

使用@ResponseBody注解可以方便地将复杂的数据对象作为 HTTP 响应的内容返回,而无需手动进行格式转换。同时,它也提供了一种简洁的方式来处理 RESTful 风格的 API 接口。

@RestController

作用:结合了@Controller和@ResponseBody注解的功能。使用@RestController注解的类会被视为一个控制器,其中的方法默认会被注解为@ResponseBody。这意味着,这些方法的返回值将直接作为 HTTP 响应的内容返回给客户端,而不需要额外的视图解析或模板渲染。总的来说就是,控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转

位置:类上方

java 复制代码
@RestController
public class MyController {

    @GetMapping("/myResource")
    public String getMyResource() {
        // 获取资源的逻辑
        return "Hello, World!";
    }
}

在上述示例中,@GetMapping注解表示该方法处理 GET 请求,/myResource是请求的路径。方法的返回值将直接作为 HTTP 响应的内容返回给客户端。

当调用http://your-domain.com/myResource这样的 URL 时,客户端将接收到一个包含"Hello, World!"的响应。

使用@RestController注解可以使控制器的代码更加简洁和直观,同时也提供了一种便捷的方式来处理简单的 HTTP 请求和响应。如果你的控制器方法主要用于返回数据,而不需要复杂的视图渲染或模板逻辑,那么使用@RestController注解是一个不错的选择。

@RequestBody

作用:将请求中JSON格式的参数转为JAVA对象

位置:写在方法参数前

Axios请求发送JSON格式的参数:

javascript 复制代码
// 导入 Axios 库
const axios = require('axios');

// 定义请求数据
const resource = {
  name: 'My Resource',
  description: 'This is a description',
};

// 发送 POST 请求
axios.post('/myResource', resource)
  .then(response => {
    // 处理响应数据
    console.log(response.data);
  })
  .catch(error => {
    // 处理错误情况
    console.error(error);
  });

编写控制器:

java 复制代码
@RestController
public class MyController {

    @PostMapping("/myResource")
    public void createMyResource(@RequestBody MyResource resource) {
        // 创建资源的逻辑
    }
}

在上述示例中,@PostMapping注解表示该方法处理 POST 请求,/myResource是请求的路径。@RequestBody注解修饰的MyResource参数将接收请求体的内容,并将其解析为MyResource对象。

当调用http://your-domain.com/myResource这样的 URL 时,客户端可以将MyResource对象的 JSON 数据作为请求体的内容发送。Spring 会将请求体的内容解析为MyResource对象,并将其传递给方法。

使用@RequestBody注解可以方便地处理请求体的数据,而无需手动解析和转换数据格式。同时,它也提供了一种简洁的方式来处理 POST 请求的参数。


总结

提示:这里对文章进行总结:

在 SpringMVC 框架中,注解是一种非常重要的配置方式,它可以帮助我们减少冗余的 XML 配置,提高开发效率。

相关推荐
爬山算法4 分钟前
Hibernate(15)Hibernate中如何定义一个实体的主键?
java·后端·hibernate
廋到被风吹走6 分钟前
【Spring】Spring AMQP 详细介绍
java·spring·wpf
海南java第二人18 分钟前
Spring IOC依赖注入:从原理到实践的深度解析
spring·ioc
一起养小猫41 分钟前
LeetCode100天Day6-回文数与加一
java·leetcode
程序员小假1 小时前
我们来说一下 MySQL 的慢查询日志
java·后端
独自破碎E2 小时前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder2 小时前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
xdpcxq10292 小时前
风控场景下超高并发频次计算服务
java·服务器·网络
想用offer打牌2 小时前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
橘色的狸花猫2 小时前
简历与岗位要求相似度分析系统
java·nlp