java之路—— SpringMVC的常用注解解析以及作用、应用

简介: java之路—— SpringMVC的常用注解解析以及作用、应用

这篇文章主要介绍了SpringMVC一些常用注解,详细介绍了每一个注解的使用方法


1、@Controller


@Controller注解将一个普通的Java类标记为处理请求的控制器,在Spring MVC中起到了路由请求和处理业务逻辑的作用,并注册为Spring容器的Bean。通过扫描或显式配置等方式,让Spring能够自动检测到这个控制器并进行实例化和管理。


2、@RequestMapping


@RequestMapping注解用于将一个HTTP请求映射到控制器类或处理请求的方法上,告诉Spring MVC如何匹配和处理请求。

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/profile")
    public String userProfile() {
        // 处理用户个人资料请求
        return "profile";
    }
}


3.@GetMapping、@PostMapping、@PutMapping、@DeleteMapping


1.@GetMapping: 处理get请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)

新方法可以简写为:

@GetMapping(“/get/{id}”)


2.@PostMapping: 处理post请求,传统的RequestMapping来编写应该是@RequestMapping(value = “/get/{id}”,method = RequestMethod.POST)

新方法可以简写为:

@PostMapping(“/get/{id}”)


3. @PutMapping: 和PostMapping作用等同,都是用来向服务器提交信息。如果是添加信息,倾向于用@PostMapping,如果是更新信息,倾向于用@PutMapping。两者差别不是很明显。


**4.@DeleteMapping **删除URL映射,具体没有再实践中用过,不知道好在什么地方

**5.@PatchMapping ** PATCH 请求通常用于对资源进行部分更新。

@RestController
@RequestMapping("/users")
public class UserController {
    @PatchMapping("/{id}")
    public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
        // 根据 id 获取要更新的用户信息
        User user = userRepository.findById(id);
        if (user == null) {
            return ResponseEntity.notFound().build();
        }
        // 更新用户信息
        user.setName(updatedUser.getName());
        user.setEmail(updatedUser.getEmail());
        // 保存更新后的用户信息
        userRepository.save(user);
        return ResponseEntity.ok().build();
    }
}


4. @RequestParam


@RequestParam 是 Spring MVC 框架中的一个注解,用于将请求参数绑定到处理请求的方法的参数上。

使用 @RequestParam 注解时,可以在处理请求的方法的参数前添加该注解,并指定参数名。Spring MVC 在接收到请求时,会自动将请求中对应名称的参数值绑定到方法参数上。

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/search")
    public ResponseEntity<List<User>> searchUsers(@RequestParam("name") String name, @RequestParam("age") int age) {
        // 根据姓名和年龄搜索用户列表
        List<User> userList = userService.searchUsers(name, age);
        return ResponseEntity.ok(userList);
    }
}


@RequestParam 注解有一些属性可以进一步配置参数的行为,例如设置参数是否是必需的、设置默认值等。

@GetMapping("/search")
public ResponseEntity<List<User>> searchUsers(
        @RequestParam(value = "name", required = true) String name,
        @RequestParam(value = "age", defaultValue = "0") int age) {
    // ...
}


required = true 表示参数必需,如果请求中没有该参数,则会返回 400 Bad Request 错误;defaultValue = “0” 表示如果请求中没有提供该参数,则将参数默认值设置为 0。


5.@PathVariable


@PathVariable 是 Spring MVC 框架中的一个注解,用于将请求路径中的变量绑定到处理请求的方法的参数上。

使用 @PathVariable 注解时,可以在处理请求的方法的参数前添加该注解,并指定路径中的变量名称。Spring MVC 在接收到请求时,会自动从路径中提取对应名称的变量值,并将其绑定到方法参数上。

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        // 根据用户id查询用户信息
        User user = userService.getUserById(id);
        if (user == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(user);
    }
}


@PathVariable 注解还支持一些属性进行进一步的配置,例如设置变量的默认值、正则表达式等。

@GetMapping("/{id}/{username}")
public ResponseEntity<User> getUserByUsername(
        @PathVariable("username") String username,
        @PathVariable(value = "id", defaultValue = "0") Long id) {
    // ...
}


6.@RequestHeader


作用:用于获取请求消息头。

value:提供消息头名称

required:是否必须有此消息头

@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
  System.out.println(requestHeader);
return "success"; }


7.@CookieValue


@CookieValue 是 Spring MVC 框架中的一个注解,用于将请求中指定名称的 Cookie 值绑定到处理请求的方法的参数上。


使用 @CookieValue 注解时,可以在处理请求的方法的参数前添加该注解,并指定要绑定的 Cookie 名称。Spring MVC 在接收到请求时,会自动从请求的 Cookie 中查找指定名称的 Cookie 值,并将其绑定到方法参数上。

示例代码如下:

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/info")
    public ResponseEntity<UserInfo> getUserInfo(@CookieValue("sessionToken") String sessionToken) {
        // 根据 sessionToken 获取用户信息
        UserInfo userInfo = userService.getUserInfoBySessionToken(sessionToken);
        if (userInfo == null) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
        return ResponseEntity.ok(userInfo);
    }
}


在上面的示例中,@GetMapping(“/info”) 表示当收到一个 GET 请求,并且路径为 “/users/info” 时,将调用 getUserInfo() 方法来处理请求。通过 @CookieValue 注解标识的 sessionToken 参数,表示从请求的 Cookie 中获取名为 “sessionToken” 的值,并将其赋值给 sessionToken 参数。


通过这种方式,在处理请求的方法中可以直接使用请求的 Cookie 值,进行相应的操作和逻辑处理。

@CookieValue 注解还支持一些属性进行进一步的配置,例如设置是否为必需的、设置默认值等。

示例代码如下:

@GetMapping("/info")
public ResponseEntity<UserInfo> getUserInfo(
        @CookieValue(value = "sessionToken", required = true) String sessionToken,
        @CookieValue(value = "theme", defaultValue = "light") String theme) {
    // ...
}


在上面的示例中,@CookieValue(value = “sessionToken”, required = true) 表示获取名为 “sessionToken” 的 Cookie 值,并将其赋值给 sessionToken 参数。如果请求中没有提供该 Cookie,则会返回 400 Bad Request 错误;`@CookieValue(value = “theme”, defaultValue = "light


8.@RequestBody


@RequestBody 是 Spring MVC 框架中的一个注解,用于将请求体中的数据绑定到处理请求的方法的参数上。


使用 @RequestBody 注解时,可以在处理请求的方法的参数前添加该注解。

Spring MVC 在接收到请求时,会自动将请求体中的数据按照指定的数据类型转换,并将其绑定到方法参数上。

示例代码如下:

@RestController
@RequestMapping("/users")
public class UserController {
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // 创建用户的逻辑
        userService.createUser(user);
        return ResponseEntity.ok(user);
    }
}


在上面的示例中,@PostMapping 表示当收到一个 POST 请求,并且路径为 “/users” 时,将调用 createUser() 方法来处理请求。方法参数中的 @RequestBody User user 表示从请求体中获取 JSON 格式的数据并转换为 User 对象,然后将其赋值给 user 参数。


通过这种方式,在处理请求的方法中可以直接使用请求体中的数据进行相应的操作和逻辑处理。


@RequestBody 注解还支持一些属性进行进一步的配置,例如设置请求体的媒体类型、是否必需等。

示例代码如下:

@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<User> createUser(@RequestBody(required = true) User user) {
    // ...
}

在上面的示例中,consumes = MediaType.APPLICATION_JSON_VALUE 表示只接受 JSON 格式的请求体;required = true 表示该参数是必需的,如果请求体中没有提供相应的数据,则会返回错误。


9.@ResponseBody


@ResponseBody 是 Spring MVC 框架中的一个注解,用于将处理请求的方法的返回值直接作为响应体的内容返回给客户端。


使用 @ResponseBody 注解时,可以在处理请求的方法上添加该注解。

Spring MVC 在调用方法后,会将方法的返回值转换为指定的数据格式(如 JSON、XML等),然后将其作为响应体返回给客户端。

@ResponseBody 是 Spring MVC 框架中的一个注解,用于将处理请求的方法的返回值直接作为响应体的内容返回给客户端。

示例代码如下:

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    @ResponseBody
    public User getUserById(@PathVariable("id") Long id) {
        // 根据用户ID查询用户
        User user = userService.getUserById(id);
        return user;
    }
}

上述示例中,@GetMapping(“/{id}”) 表示当收到一个 GET 请求,并且路径为 “/users/{id}” 时,将调用 getUserById() 方法来处理请求。方法的返回类型为 User 对象。


通过在方法上添加 @ResponseBody 注解,Spring MVC 将方法的返回值 User 对象转换为 JSON 格式,并将其作为响应体返回给客户端。


使用 @ResponseBody 注解还可以实现其他类型的数据格式转换,例如返回 XML 格式的数据。

示例代码如下:

@GetMapping("/{id}", produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public User getUserById(@PathVariable("id") Long id) {
    // ...
}

在上面的示例中,通过设置 produces = MediaType.APPLICATION_XML_VALUE,表示返回 XML 格式的数据。


总之,@ResponseBody 注解用于将处理请求的方法的返回值直接作为响应体返回给客户端。可以通过该注解指定返回数据格式,如 JSON、XML等。


10.@SessionAttribute


@SessionAttribute 是 Spring MVC 框架中的一个注解,用于将模型属性(Model Attribute)存储到会话(Session)中,并在后续请求中可以直接访问和使用。

使用 @SessionAttribute 注解时,可以在处理请求的方法的参数或类级别上添加该注解。

当使用在方法参数上时,它将从会话中获取相应的属性值;

当使用在类级别上时,它将对整个类的所有处理请求的方法生效。


示例代码如下:

@Controller
@RequestMapping("/cart")
@SessionAttributes("cartItems")
public class CartController {
    @ModelAttribute("cartItems")
    public List<Item> setupCartItems() {
        return new ArrayList<>(); // 初始化空的购物车项列表
    }
    @GetMapping("/items")
    public String showCartItems(@ModelAttribute("cartItems") List<Item> cartItems) {
        // 显示购物车项
        return "cart/items";
    }
    @PostMapping("/items")
    public String addToCart(@ModelAttribute("cartItems") List<Item> cartItems, Item item) {
        // 将商品项加入购物车
        cartItems.add(item);
        return "redirect:/cart/items"; // 重定向到展示购物车项的页面
    }
}

上述示例中,@SessionAttributes(“cartItems”) 注解表示将名为 “cartItems” 的模型属性存储到会话中,并在后续请求中可以共享和访问。


在类级别的 setupCartItems() 方法上使用 @ModelAttribute(“cartItems”) 注解,表示从会话中获取名为 “cartItems” 的属性值。如果会话中不存在该属性,则会调用 setupCartItems() 方法进行初始化,并将其添加到会话中。


在处理请求的方法中,通过 @ModelAttribute(“cartItems”) 注解从会话中获取购物车项列表,并进行相应的操作,例如显示购物车项、加入商品项等。


需要注意的是,当使用 @SessionAttribute 注解时,要确保在会话结束后及时清理会话属性,以避免可能的内存泄漏和数据一致性问题。


总之,@SessionAttribute 注解用于将模型属性存储到会话中,并在后续请求中可以直接访问和使用。通过在方法参数或类级别上添加该注解,可以轻松实现会话级别的属性共享。


11.@ControllerAdvice


@ControllerAdvice 是 Spring MVC 框架中的一个注解,用于定义全局控制器增强(Controller Advice)。它允许开发者在多个控制器中共享相同的行为或异常处理逻辑,并将这些通用逻辑集中到一个类中。


使用 @ControllerAdvice 注解时,需要创建一个带有 @ControllerAdvice 注解的类,并在该类中定义通用的控制器增强逻辑。这些逻辑可以包括以下方面:


异常处理:通过在方法上添加 @ExceptionHandler 注解定义通用的异常处理方法,处理特定类型的异常或一般性的异常。

数据绑定:通过在方法上添加 @InitBinder 注解自定义数据绑定逻辑,例如格式化日期、类型转换等。

模型属性:通过在方法上添加 @ModelAttribute 注解定义通用的模型属性方法,将模型属性添加到每个请求的模型中。

示例代码如下:

@ControllerAdvice
public class GlobalControllerAdvice {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        // 处理并返回异常视图
        ModelAndView modelAndView = new ModelAndView("error");
        modelAndView.addObject("errorMessage", "Sorry, something went wrong.");
        return modelAndView;
    }
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 自定义数据绑定逻辑
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }
    @ModelAttribute
    public void addCommonAttributes(Model model) {
        // 添加通用的模型属性
        model.addAttribute("appName", "MyApp");
    }
}


上述示例中,@ControllerAdvice 注解表示这个类是一个全局控制器增强类。


在 handleException() 方法上使用 @ExceptionHandler(Exception.class) 注解,当发生任何类型的异常时,都会调用该方法进行处理,并返回相应的错误视图。


通过 @InitBinder 注解定义了一个自定义数据绑定逻辑,并注册到默认的数据绑定器中。这里使用了一个 CustomDateEditor 将日期字符串转换为 Date 类型。


在 addCommonAttributes() 方法上使用 @ModelAttribute 注解,该方法会在每个请求之前被调用,并将指定的模型属性添加到每个请求的模型中。


12、@ModelAttribute


当使用 @ModelAttribute 注解时,可以在方法参数、方法返回值或方法上添加该注解。它的作用如下:


方法参数上的 @ModelAttribute 注解:


当用于处理请求的方法中的方法参数上时,它表示从模型中获取对应名称的属性,并将其绑定到被注解的方法参数上。如果模型中不存在对应名称的属性,则会创建一个新的对象,并绑定到方法参数上。

例如,在处理表单提交时,可以使用 @ModelAttribute 注解将表单数据绑定到方法参数上,以便进一步处理。

方法返回值上的 @ModelAttribute 注解:


当用于处理请求的方法中的方法返回值上时,它表示将方法返回的对象添加到模型中。默认情况下,以对象的类名首字母小写作为属性的名称,也可以通过指定 name 属性来自定义属性的名称。

方法上的 @ModelAttribute 注解:


当用于处理请求的方法上时,它表示该方法用于在处理请求之前向模型中添加属性。

例如,在每个请求之前需要将一些共享的属性添加到模型中时,可以在一个专门的方法上添加 @ModelAttribute 注解,然后该方法的返回值会自动添加到模型中。

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    public String getUser(@PathVariable("id") int id, @ModelAttribute("user") User user) {
        // 根据用户ID查询用户信息,并将结果绑定到方法参数中的 User 对象上
        return "user/profile";
    }
    @PostMapping("/edit")
    public String updateUser(@ModelAttribute("user") User user) {
        // 更新用户信息
        return "redirect:/user/" + user.getId();
    }
    @ModelAttribute("user")
    public User setupUser() {
        // 在处理请求之前向模型中添加名为 "user" 的属性
        return new User();
    }
}

上述示例中,@ModelAttribute(“user”) 注解用于将模型中的名为 “user” 的属性与方法参数或方法返回值进行绑定。


在 getUser() 方法中, 使用 @ModelAttribute(“user”) 注解将 User 对象与方法参数进行绑定。如果模型中存在名为 “user” 的属性,则会将其绑定到方法参数上;否则,会创建一个新的 User 对象并绑定到方法参数上。


在 updateUser() 方法中 ,使用 @ModelAttribute(“user”) 注解将方法返回的 User 对象添加到模型中。这样,在方法执行完毕后,模型中就会包含名为 “user” 的属性。


在 setupUser() 方法中, 使用 @ModelAttribute(“user”) 注解表示该方法用于在每个请求之前向模型中添加名为 “user” 的属性。根据需要可以从数据库或其他途径获取初始化数据,并返回一个新的 User 对象。


总之,@ModelAttribute 注解用于在 Spring MVC 框架中实现方法参数、方法返回值与模型属性的绑定。通过在方法参数、方法返回值或方法上添加该注解,可以方便地进行数据的传递和处理。

目录
相关文章
|
12小时前
|
Java 编译器 程序员
java注解浅述
java注解浅述
10 1
|
12小时前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
13 3
|
12小时前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
41 2
|
12小时前
|
Java API Python
java注解
java注解
|
12小时前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
12小时前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
12小时前
|
Java
解析java中的数组
解析java中的数组
12 3
|
12小时前
|
存储 Java 程序员
Java面向对象编程的基础概念解析
Java面向对象编程的基础概念解析
15 0
|
12小时前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
162534 4
|
12小时前
|
IDE Java 数据库连接
Lombok注解大全
这些是Lombok中的一些常见注解,它们可以显著减少Java代码中的冗余代码,提高代码的可读性和可维护性。不过,在使用Lombok之前,请确保你的开发环境已经配置好支持Lombok,通常需要安装相应的插件或进行设置以使IDE(如Eclipse、IntelliJ IDEA)能够正确解析Lombok注解。
23 2

推荐镜像

更多