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

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

目录
相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
15天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
66 6
|
7天前
|
Java 测试技术 API
Java 反射机制:深入解析与应用实践
《Java反射机制:深入解析与应用实践》全面解析Java反射API,探讨其内部运作原理、应用场景及最佳实践,帮助开发者掌握利用反射增强程序灵活性与可扩展性的技巧。
|
12天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
23 4
|
15天前
|
Java 编译器 数据库连接
Java中的异常处理机制深度解析####
本文深入探讨了Java编程语言中异常处理机制的核心原理、类型及其最佳实践,旨在帮助开发者更好地理解和应用这一关键特性。通过实例分析,揭示了try-catch-finally结构的重要性,以及如何利用自定义异常提升代码的健壮性和可读性。文章还讨论了异常处理在大型项目中的最佳实践,为提高软件质量提供指导。 ####
|
19天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
40 2
|
18天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
18 0
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
62 0
下一篇
无影云桌面