• Spring MVC中Restful风格引入


    一,RESTful概述

            在现代Web应用开发中,RESTful架构风格已成为一种标准实践,特别是在构建可扩展的Web服务时。Spring MVC提供了全面的支持来构建遵循REST原则的Web服务。我在此介绍如何在Spring MVC中实现RESTful风格的Web服务,并通过示例演示其使用。

    二,什么是RESTful架构?

            Spring MVC是一个强大的模块化框架,可以通过声明式的方式轻松创建Web应用。使用Spring MVC实现RESTful Web服务的优势包括:

            支持注解:Spring的@RestController和@RequestMapping等注解使得创建RESTful服务变得简单直观。

            数据绑定:自动的数据绑定支持,可以将请求自动转换为模型对象,同时也支持多种数据格式的响应,如XML、JSON等。

            异常处理:通过@ExceptionHandler提供了统一的异常处理机制。        

            依赖注入:利用Spring的依赖注入优势,更好地管理服务层。

    三,实现RESTful服务的基本步骤

    1. 创建Spring MVC项目

    2.定义资源表示类

            在Spring中,资源通常以POJO(Plain Old Java Object)类表示。例如,一个用户资源可以定义如下:
    1. public class User {
    2. private Integer id;
    3. private String name;
    4. private String email;
    5. // getters and setters
    6. }

     3. 创建REST控制器

    1. @RestController
    2. @RequestMapping("/api/users")
    3. public class UserController {
    4. @GetMapping("/{id}/{a}/{b}")
    5. public ResponseEntity getUserByIdAndParams(
    6. @PathVariable Integer id,
    7. @PathVariable String a,
    8. @PathVariable String b) {
    9. // 示例:根据id获取用户,并可能使用a和b进行一些额外操作
    10. User user = userService.findById(id);
    11. // 示例逻辑:假设a和b是要应用到User对象的操作或变量
    12. user.setSomeField(a);
    13. user.setAnotherField(b);
    14. return ResponseEntity.ok(user);
    15. }
    16. //处理POST请求,用于创建新用户
    17. @PostMapping
    18. public ResponseEntity createUser(@RequestBody User user) {
    19. User createdUser = userService.create(user);
    20. //返回状态码201 (Created),表示资源已被成功创建
    21. return new ResponseEntity<>(createdUser, HttpStatus.CREATED);
    22. }
    23. //处理PUT请求,用于更新指定ID的用户
    24. @PutMapping("/{id}")
    25. public ResponseEntity updateUser(@PathVariable Integer id, @RequestBody User user) {
    26. User updatedUser = userService.update(id, user);
    27. //方法中首先根据ID更新用户信息,然后返回更新后的用户数据
    28. return ResponseEntity.ok(updatedUser);
    29. }
    30. // 处理DELETE请求,用于删除指定ID的用户
    31. @DeleteMapping("/{id}")
    32. public ResponseEntity deleteUser(@PathVariable Integer id) {
    33. userService.delete(id);
    34. //返回一个无内容的响应(HTTP 204 No Content),表示请求已成功处理,但没有内容返回
    35. return ResponseEntity.noContent().build();
    36. }
    37. }
        在上面的方法中,我在@GetMapping("/{id}/{a}/{b}”)定义了一个带有三个参数的路径:
    • {id} :用户的唯一标识符。
    • {a}和{b}:这两个参数可以用于业务逻辑中的其他目的,比如作为查询参数或用于修改返回的数据。
    • @PathVariable:将URL中的变量绑定到方法的参数上。此方法接收三个参数:用户ID (id) 和两个字符串参数 (a,b)。

    4. 异常处理

    处理REST API中可能发生的异常,例如资源找不到。
    1. @ResponseStatus(HttpStatus.NOT_FOUND)
    2. public class ResourceNotFoundException extends RuntimeException {
    3. public ResourceNotFoundException(String message) {
    4. super(message);
    5. }
    6. }
    在控制器中使用@ExceptionHandler处理异常:
    1. @ControllerAdvice
    2. public class RestExceptionHandler {
    3. @ExceptionHandler(ResourceNotFoundException.class)
    4. public ResponseEntity handleResourceNotFound(ResourceNotFoundException ex) {
    5. return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    6. }
    7. }

     四,@RestController注解和@Controller注解对比

    @RestController:该控制器的所有方法默认都是直接返回数据给客户端,而不是返回视图的名称。这种方式特别适用于构建RESTful Web服务,其中数据(如JSON或XML)直接返回给调用者。
    @Controller:这通常用于更传统的Web应用程序,其中控制器的作用是设置模型数据并返回视图的名称,由视图(如JSP)来生成HTML响应。

      下面例子用@Controller重写上面提到的post方法

    1. import org.springframework.stereotype.Controller;
    2. import org.springframework.web.bind.annotation.*;
    3. import org.springframework.web.servlet.ModelAndView;
    4. @Controller
    5. @RequestMapping("/api/users")
    6. public class UserController {
    7. @PostMapping
    8. public String createUser(@ModelAttribute User user) {
    9. User createdUser = userService.create(user);
    10. return "redirect:/users/list"; // 重定向到用户列表页面
    11. }
    12. // 其他方法保持不变...
    13. }
            这样做表明我们不再期望所有方法自动将返回值作为响应体返回,而是可以返回视图名称。这里返回的字符串"redirect:/users/list"指示Spring MVC进行重定向到给定的路径,有时候也可以直接返回视图jsp的名称,如:test.jsp可以直接return "test",参考如下五

    五,springmvc中使用转发和重定向

            通过SpringMVC来实现转发和重定向-有视图解析器;
    1. <bean class="org.springframework,web.servlet.view,InternalResourceViewResolver" id="InternalResourceViewResolver"
    2. --时级-->
    3. <property name="prefix" value."/WEB-INF/jsP/"/>“--行级-->
    4. <property name="suffix" value=".jsp"/>
    5. bean>
            重定向,不需要视图解析器,本质就是重新请求一个新地方嘛,所以注意路径问题可以重定向到另外一个请求实现
    1. @controller
    2. public class ResultspringMvc{
    3. @RequestMapping("/rsm2/t1")
    4. public string test1(){
    5. //转发
    6. return"test";
    7. //返回test.jsp视图
    8. }
    9. @RequestMapping("/rsm2/t2")
    10. public string test2(){
    11. //重定向
    12. return "redirect:/index.jsp";
    13. //return"redirect:hello.do";//hello.do为另一个请求/
    14. }
    15. }

  • 相关阅读:
    LeetCode题解:171. Excel 表列序号,哈希表,TypeScript,详细注释
    整合定位技术应对物联网碎片化场景应用
    题目0153-机器人
    图像分割 - 阈值处理 - 固定阈值法
    知识经验分享——YOLOv5-6.0训练出错及解决方法(RuntimeError)
    uniapp使用nfc功能及详解
    大二毕设.3-网盘系统
    Elasticsearch:部署 ECE (Elastic Cloud Enterprise)
    恒合仓库 - 角色管理、启动或禁用角色、为角色分配权限
    【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理
  • 原文地址:https://blog.csdn.net/qq_44858608/article/details/140387367