上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!

guduadmin271月前

响应与Rest风格

    • 1.1
      • 1.1.1 环境准备
        • 步骤1:设置返回页面
        • 步骤2:启动程序测试
        • 1.1.2 返回文本数据
          • 步骤1:设置返回文本内容
          • 步骤2:启动程序测试
          • 1.1.3 响应JSON数据
            • 响应POJO对象
            • 响应POJO集合对象
            • 知识点1:@ResponseBody
            • 2,Rest风格
              • 2.1 REST简介
              • 2.2 RESTful入门案例
                • 2.2.1 环境准备
                • 2.2.3 修改RESTful风格
                  • 新增
                  • 删除
                  • 传递路径参数
                  • 修改
                  • 根据ID查询
                  • 查询所有
                  • 知识点1:@PathVariable
                  • 2.3 RESTful快速开发
                      • 知识点1:@RestController
                      • 知识点2:@GetMapping @PostMapping @PutMapping @DeleteMapping

                        1.1

                        1.1.1 环境准备

                        步骤1:设置返回页面
                        @Controller
                        public class UserController {
                            
                            @RequestMapping("/toJumpPage")
                            //注意
                            //1.此处不能添加@ResponseBody,如果加了该注入,会直接将page.jsp当字符串返回前端
                            //2.方法需要返回String
                            public String toJumpPage(){
                                System.out.println("跳转页面");
                                return "page.jsp";
                            }
                            
                        }
                        
                        步骤2:启动程序测试

                        直接打开浏览器,输入

                        http://localhost/toJumpPage

                        Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第1张

                        1.1.2 返回文本数据

                        步骤1:设置返回文本内容
                        @Controller
                        public class UserController {
                            
                           	@RequestMapping("/toText")
                        	//注意此处该注解就不能省略,如果省略了,会把response text当前页面名称去查找,如果没有回报404错误
                            @ResponseBody
                            public String toText(){
                                System.out.println("返回纯文本数据");
                                return "response text";
                            }
                            
                        }
                        
                        步骤2:启动程序测试

                        输入地址http://localhost/toText访问

                        Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第2张

                        1.1.3 响应JSON数据

                        响应POJO对象
                        @Controller
                        public class UserController {
                            
                            @RequestMapping("/toJsonPOJO")
                            @ResponseBody
                            public User toJsonPOJO(){
                                System.out.println("返回json对象数据");
                                User user = new User();
                                user.setName("test");
                                user.setAge(15);
                                return user;
                            }
                        }
                        

                        返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody 注解和@EnableWebMvc注解

                        重新启动服务器,访问http://localhost/toJsonPOJO

                        Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第3张

                        响应POJO集合对象
                        @Controller
                        public class UserController {
                            
                            @RequestMapping("/toJsonList")
                            @ResponseBody
                            public List toJsonList(){
                                System.out.println("返回json集合数据");
                                User user1 = new User();
                                user1.setName("传智播客");
                                user1.setAge(15);
                                User user2 = new User();
                                user2.setName("黑马程序员");
                                user2.setAge(12);
                                List userList = new ArrayList();
                                userList.add(user1);
                                userList.add(user2);
                                return userList;
                            }
                            
                        }
                        

                        重新启动服务器,访问http://localhost/toJsonList

                        Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第4张

                        知识点1:@ResponseBody

                        名称@ResponseBody
                        类型方法\类注解
                        位置SpringMVC控制器方法定义上方和控制类上
                        作用设置当前控制器返回值作为响应体,
                        写在类上,该类的所有方法都有该注解功能
                        相关属性pattern:指定日期时间格式字符串

                        说明:

                        • 该注解可以写在类上或者方法上
                        • 写在类上就是该类下的所有方法都有@ReponseBody功能
                        • 当方法上有@ReponseBody注解后
                          • 方法的返回值为字符串,会将其作为文本内容直接响应给前端
                          • 方法的返回值为对象,会将对象转换成JSON响应给前端

                            此处又使用到了类型转换,内部还是通过Converter接口的实现类完成的,所以Converter除了前面所说的功能外,它还可以实现:

                            • 对象转Json数据(POJO -> json)
                            • 集合转Json数据(Collection -> json)

                              2,Rest风格

                              2.1 REST简介

                              • REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格

                                当我们想表示一个网络资源的时候,可以使用两种方式:

                                • 传统风格资源描述形式
                                  • http://localhost/user/getById?id=1 查询id为1的用户信息
                                  • http://localhost/user/saveUser 保存用户信息
                                  • REST风格描述形式
                                    • http://localhost/user/1
                                    • http://localhost/user

                                      传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。

                                      查看REST风格的描述,你会发现请求地址变的简单了,并且光看请求URL并不是很能猜出来该URL的具体功能

                                      所以REST的优点有:

                                      • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
                                      • 书写简化

                                        但是我们的问题也随之而来了,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作呢?

                                        • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
                                          • http://localhost/users 查询全部用户信息 GET(查询)
                                          • http://localhost/users/1 查询指定用户信息 GET(查询)
                                          • http://localhost/users 添加用户信息 POST(新增/保存)
                                          • http://localhost/users 修改用户信息 PUT(修改/更新)
                                          • http://localhost/users/1 删除用户信息 DELETE(删除)

                                            请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。

                                            按照不同的请求方式代表不同的操作类型。

                                            • 发送GET请求是用来做查询
                                            • 发送POST请求是用来做新增
                                            • 发送PUT请求是用来做修改
                                            • 发送DELETE请求是用来做删除

                                              但是注意:

                                              • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
                                                • REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性
                                                • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的
                                                • 但是如果绝大多数人都遵循这种风格,你写的代码让别人读起来就有点莫名其妙了。
                                                • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…

                                                  清楚了什么是REST风格后,我们后期会经常提到一个概念叫RESTful,那什么又是RESTful呢?

                                                  • 根据REST风格对资源进行访问称为RESTful

                                                    2.2 RESTful入门案例

                                                    2.2.1 环境准备

                                                    • 创建一个Web的Maven项目

                                                    • pom.xml添加Spring依赖

                                                    • 创建对应的配置类

                                                    • 编写模型类User和Book

                                                    • 编写UserController和BookController

                                                      @Controller
                                                      public class UserController {
                                                      	@RequestMapping("/save")
                                                          @ResponseBody
                                                          public String save(@RequestBody User user) {
                                                              System.out.println("user save..."+user);
                                                              return "{'module':'user save'}";
                                                          }
                                                          @RequestMapping("/delete")
                                                          @ResponseBody
                                                          public String delete(Integer id) {
                                                              System.out.println("user delete..." + id);
                                                              return "{'module':'user delete'}";
                                                          }
                                                          @RequestMapping("/update")
                                                          @ResponseBody
                                                          public String update(@RequestBody User user) {
                                                              System.out.println("user update..." + user);
                                                              return "{'module':'user update'}";
                                                          }
                                                          @RequestMapping("/getById")
                                                          @ResponseBody
                                                          public String getById(Integer id) {
                                                              System.out.println("user getById..." + id);
                                                              return "{'module':'user getById'}";
                                                          }
                                                          @RequestMapping("/findAll")
                                                          @ResponseBody
                                                          public String getAll() {
                                                              System.out.println("user getAll...");
                                                              return "{'module':'user getAll'}";
                                                          }
                                                      }
                                                      @Controller
                                                      public class BookController {
                                                          
                                                      	@RequestMapping(value = "/books",method = RequestMethod.POST)
                                                          @ResponseBody
                                                          public String save(@RequestBody Book book){
                                                              System.out.println("book save..." + book);
                                                              return "{'module':'book save'}";
                                                          }
                                                          @RequestMapping(value = "/books/{id}",method = RequestMethod.DELETE)
                                                          @ResponseBody
                                                          public String delete(@PathVariable Integer id){
                                                              System.out.println("book delete..." + id);
                                                              return "{'module':'book delete'}";
                                                          }
                                                          @RequestMapping(value = "/books",method = RequestMethod.PUT)
                                                          @ResponseBody
                                                          public String update(@RequestBody Book book){
                                                              System.out.println("book update..." + book);
                                                              return "{'module':'book update'}";
                                                          }
                                                          @RequestMapping(value = "/books/{id}",method = RequestMethod.GET)
                                                          @ResponseBody
                                                          public String getById(@PathVariable Integer id){
                                                              System.out.println("book getById..." + id);
                                                              return "{'module':'book getById'}";
                                                          }
                                                          @RequestMapping(value = "/books",method = RequestMethod.GET)
                                                          @ResponseBody
                                                          public String getAll(){
                                                              System.out.println("book getAll...");
                                                              return "{'module':'book getAll'}";
                                                          }
                                                          
                                                      }
                                                      

                                                      2.2.3 修改RESTful风格

                                                      新增
                                                      @Controller
                                                      public class UserController {
                                                      	//设置当前请求方法为POST,表示REST风格中的添加操作
                                                          @RequestMapping(value = "/users",method = RequestMethod.POST)
                                                          @ResponseBody
                                                          public String save() {
                                                              System.out.println("user save...");
                                                              return "{'module':'user save'}";
                                                          }
                                                      }
                                                      
                                                      • 将请求路径更改为/users

                                                        • 访问该方法使用 POST: http://localhost/users
                                                        • 使用method属性限定该方法的访问方式为POST

                                                          • 如果发送的不是POST请求,比如发送GET请求,则会报错

                                                            Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第5张

                                                            删除
                                                            @Controller
                                                            public class UserController {
                                                                //设置当前请求方法为DELETE,表示REST风格中的删除操作
                                                            	@RequestMapping(value = "/users",method = RequestMethod.DELETE)
                                                                @ResponseBody
                                                                public String delete(Integer id) {
                                                                    System.out.println("user delete..." + id);
                                                                    return "{'module':'user delete'}";
                                                                }
                                                            }
                                                            
                                                            • 将请求路径更改为/users
                                                              • 访问该方法使用 DELETE: http://localhost/users

                                                                访问成功,但是删除方法没有携带所要删除数据的id,所以针对RESTful的开发,如何携带数据参数?

                                                                传递路径参数

                                                                前端发送请求的时候使用:http://localhost/users/1,路径中的1就是我们想要传递的参数。

                                                                后端获取参数,需要做如下修改:

                                                                • 修改@RequestMapping的value属性,将其中修改为/users/{id},目的是和路径匹配
                                                                • 在方法的形参前添加@PathVariable注解
                                                                  @Controller
                                                                  public class UserController {
                                                                      //设置当前请求方法为DELETE,表示REST风格中的删除操作
                                                                  	@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
                                                                      @ResponseBody
                                                                      public String delete(@PathVariable Integer id) {
                                                                          System.out.println("user delete..." + id);
                                                                          return "{'module':'user delete'}";
                                                                      }
                                                                  }
                                                                  

                                                                  思考如下两个问题:

                                                                  (1)如果方法形参的名称和路径{}中的值不一致,该怎么办?

                                                                  Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第6张

                                                                  (2)如果有多个参数需要传递该如何编写?

                                                                  前端发送请求的时候使用:http://localhost/users/1/tom,路径中的1和tom就是我们想要传递的两个参数。

                                                                  后端获取参数,需要做如下修改:

                                                                  @Controller
                                                                  public class UserController {
                                                                      //设置当前请求方法为DELETE,表示REST风格中的删除操作
                                                                  	@RequestMapping(value = "/users/{id}/{name}",method = RequestMethod.DELETE)
                                                                      @ResponseBody
                                                                      public String delete(@PathVariable Integer id,@PathVariable String name) {
                                                                          System.out.println("user delete..." + id+","+name);
                                                                          return "{'module':'user delete'}";
                                                                      }
                                                                  }
                                                                  
                                                                  修改
                                                                  @Controller
                                                                  public class UserController {
                                                                      //设置当前请求方法为PUT,表示REST风格中的修改操作
                                                                      @RequestMapping(value = "/users",method = RequestMethod.PUT)
                                                                      @ResponseBody
                                                                      public String update(@RequestBody User user) {
                                                                          System.out.println("user update..." + user);
                                                                          return "{'module':'user update'}";
                                                                      }
                                                                  }
                                                                  
                                                                  • 将请求路径更改为/users

                                                                    • 访问该方法使用 PUT: http://localhost/users
                                                                    • 访问并携带参数:

                                                                      Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第7张

                                                                      根据ID查询
                                                                      @Controller
                                                                      public class UserController {
                                                                          //设置当前请求方法为GET,表示REST风格中的查询操作
                                                                          @RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
                                                                          @ResponseBody
                                                                          public String getById(@PathVariable Integer id){
                                                                              System.out.println("user getById..."+id);
                                                                              return "{'module':'user getById'}";
                                                                          }
                                                                      }
                                                                      

                                                                      将请求路径更改为/users

                                                                      • 访问该方法使用 GET: http://localhost/users/666
                                                                        查询所有
                                                                        @Controller
                                                                        public class UserController {
                                                                            //设置当前请求方法为GET,表示REST风格中的查询操作
                                                                            @RequestMapping(value = "/users" ,method = RequestMethod.GET)
                                                                            @ResponseBody
                                                                            public String getAll() {
                                                                                System.out.println("user getAll...");
                                                                                return "{'module':'user getAll'}";
                                                                            }
                                                                        }
                                                                        

                                                                        将请求路径更改为/users

                                                                        • 访问该方法使用 GET: http://localhost/users

                                                                          小结

                                                                          RESTful入门案例中:

                                                                          (1)设定Http请求动作(动词)

                                                                          @RequestMapping(value=“”,method = RequestMethod.POST|GET|PUT|DELETE)

                                                                          (2)设定请求参数(路径变量)

                                                                          @RequestMapping(value=“/users/{id}”,method = RequestMethod.DELETE)

                                                                          @ReponseBody

                                                                          public String delete(@PathVariable Integer id){

                                                                          }

                                                                          知识点1:@PathVariable
                                                                          名称@PathVariable
                                                                          类型形参注解
                                                                          位置SpringMVC控制器方法形参定义前面
                                                                          作用绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

                                                                          关于接收参数,我们学过三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?

                                                                          • 区别
                                                                            • @RequestParam用于接收url地址传参或表单传参
                                                                            • @RequestBody用于接收json数据
                                                                            • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
                                                                            • 应用
                                                                              • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广。
                                                                              • 如果发送非json格式数据,选用@RequestParam接收请求参数。
                                                                              • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值。

                                                                                2.3 RESTful快速开发

                                                                                做完了RESTful的开发,你会发现好麻烦,麻烦在哪?

                                                                                Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!,在这里插入图片描述,第8张

                                                                                问题1:每个方法的@RequestMapping注解中都定义了访问路径/books,重复性太高。

                                                                                问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高。

                                                                                问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高。

                                                                                对于上面所提的这三个问题,具体该如何解决?

                                                                                @RestController //@Controller + ReponseBody
                                                                                @RequestMapping("/books")
                                                                                public class BookController {
                                                                                    
                                                                                	//@RequestMapping(method = RequestMethod.POST)
                                                                                    @PostMapping
                                                                                    public String save(@RequestBody Book book){
                                                                                        System.out.println("book save..." + book);
                                                                                        return "{'module':'book save'}";
                                                                                    }
                                                                                    //@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
                                                                                    @DeleteMapping("/{id}")
                                                                                    public String delete(@PathVariable Integer id){
                                                                                        System.out.println("book delete..." + id);
                                                                                        return "{'module':'book delete'}";
                                                                                    }
                                                                                    //@RequestMapping(method = RequestMethod.PUT)
                                                                                    @PutMapping
                                                                                    public String update(@RequestBody Book book){
                                                                                        System.out.println("book update..." + book);
                                                                                        return "{'module':'book update'}";
                                                                                    }
                                                                                    //@RequestMapping(value = "/{id}",method = RequestMethod.GET)
                                                                                    @GetMapping("/{id}")
                                                                                    public String getById(@PathVariable Integer id){
                                                                                        System.out.println("book getById..." + id);
                                                                                        return "{'module':'book getById'}";
                                                                                    }
                                                                                    //@RequestMapping(method = RequestMethod.GET)
                                                                                    @GetMapping
                                                                                    public String getAll(){
                                                                                        System.out.println("book getAll...");
                                                                                        return "{'module':'book getAll'}";
                                                                                    }
                                                                                    
                                                                                }
                                                                                

                                                                                对于刚才的问题,我们都有对应的解决方案:

                                                                                问题1:每个方法的@RequestMapping注解中都定义了访问路径/books,重复性太高。

                                                                                将@RequestMapping提到类上面,用来定义所有方法共同的访问路径。
                                                                                

                                                                                问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高。

                                                                                使用@GetMapping  @PostMapping  @PutMapping  @DeleteMapping代替
                                                                                

                                                                                问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高。

                                                                                1.将ResponseBody提到类上面,让所有的方法都有@ResponseBody的功能
                                                                                2.使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
                                                                                
                                                                                知识点1:@RestController
                                                                                名称@RestController
                                                                                类型类注解
                                                                                位置基于SpringMVC的RESTful开发控制器类定义上方
                                                                                作用设置当前控制器类为RESTful风格,
                                                                                等同于@Controller与@ResponseBody两个注解组合功能
                                                                                知识点2:@GetMapping @PostMapping @PutMapping @DeleteMapping
                                                                                名称@GetMapping @PostMapping @PutMapping @DeleteMapping
                                                                                类型方法注解
                                                                                位置基于SpringMVC的RESTful开发控制器方法定义上方
                                                                                作用设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,
                                                                                例如@GetMapping对应GET请求
                                                                                相关属性value(默认):请求访问路径

                                                                                后记

                                                                                👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见自己洗澡是什么意思  梦见被蛇咬了脚  梦见抓大鱼是什么意思