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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 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 框架中实现方法参数、方法返回值与模型属性的绑定。通过在方法参数、方法返回值或方法上添加该注解,可以方便地进行数据的传递和处理。

目录
相关文章
|
3天前
|
PHP 开发者
PHP 7新特性深度解析与实践应用
【9月更文挑战第17天】本文将深入探讨PHP 7的新特性及其对开发者的实际影响,同时通过实例演示如何有效利用这些特性优化代码和提高性能。我们将从类型声明的增强开始,逐步深入到其他关键改进点,最后通过一个综合案例展示如何将这些新特性应用于日常开发中。
|
5天前
|
安全 网络协议 应用服务中间件
AJP Connector:深入解析及在Apache HTTP Server中的应用
【9月更文挑战第6天】在Java Web应用开发中,Tomcat作为广泛使用的Servlet容器,经常与Apache HTTP Server结合使用,以提供高效、稳定的Web服务。而AJP Connector(Apache JServ Protocol Connector)作为连接Tomcat和Apache HTTP Server的重要桥梁,扮演着至关重要的角色
25 2
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
4天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的核心概念与实际应用,通过剖析异常的本质、分类、捕获及处理方法,揭示其在程序设计中的关键作用。不同于常规摘要,本文将直接切入主题,以简明扼要的方式概述异常处理的重要性及其在Java编程中的应用策略,引导读者快速把握异常处理的精髓。
|
3天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
13 3
|
6天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理策略和垃圾回收机制。首先介绍了Java内存模型的基本概念,包括堆、栈以及方法区的划分和各自的功能。进一步详细阐述了垃圾回收的基本原理、常见算法(如标记-清除、复制、标记-整理等),以及如何通过JVM参数调优垃圾回收器的性能。此外,还讨论了Java 9引入的接口变化对垃圾回收的影响,以及如何通过Shenandoah等现代垃圾回收器提升应用性能。最后,提供了一些编写高效Java代码的实践建议,帮助开发者更好地理解和管理Java应用的内存使用。
|
7天前
|
Java 开发者
深入解析Java中的异常处理机制
本文将深入探讨Java中异常处理的核心概念和实际应用,包括异常的分类、捕获、处理以及最佳实践。我们将通过具体示例展示如何有效使用try-catch块、throws关键字和自定义异常类,以帮助读者更好地理解和应用Java异常处理机制。
11 1
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
196 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
182 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 关系型数据库
Java应用与数据库的关系|学习笔记
快速学习Java应用与数据库的关系
Java应用与数据库的关系|学习笔记

热门文章

最新文章

推荐镜像

更多