04、SpringBoot入门 —— 处理HTTP请求

  • 处理HTTP请求的注解

    • 使用@Controller声明控制器类

      • 被@Controller标注的类称为控制器类,控制器类在SpringBoot项目中发挥的作用是处理用户发送的HTTP请求
      • @Controller注解本身被@Component注解标注,所以控制器类属于组件,项目启动时,控制器类会被扫描器自动扫描到
    • 使用@RequestMapping映射URL地址

      • 该注解可以标注类和方法,被标注的类或者方法就能够处理用户通过@RequestMapping注解映射的URL地址发送的请求

      • @RequestMapping注解的属性

        • value属性

          • 默认属性,用于指定映射的URL地址,单独使用时,可以被隐式调用

            @RequestMapping("/test")
            @RequestMapping(value="/test")
          • 映射的地址也可以是多层的

            @RequestMapping("/test/demo/page")
          • 允许一个方法同时映射多个URL地址

            @RequestMapping(value={"/address1","address2",...})
        • method属性

          • 能够指定用户通过@RequestMapping注解映射的URL地址发送的请求的类型

          • 能够让不同的方法处理相同URL地址发送的不同类型的请求

          • 示例

            @RestController
            public class TestController {
                @RequestMapping(value = "/test",method = RequestMethod.GET)
                public String get() {
                    return "这是一个GET请求哦";
                }
            
                @RequestMapping(value = "/test",method = RequestMethod.POST)
                public String post() {
                    return "这是一个POST请求哦";
                }
            }
        • params属性

          • 能够指定在用户通过@RequestMapping注解映射的URL地址发送的请求中须包含哪些参数

          • 类型是字符串数组,故而能够指定多个参数

          • 示例

            @RestController
            public class TestController {
                @RequestMapping(value = "/test",params = {"name","id"})
                public String havaParams(){
                    return "你传递了参数了";
                }
                @RequestMapping(value = "/test")
                public String noParams(){
                    return "你没有传递参数哦";
                }
            }
        • headers属性

          • 能够指定用户通过@RequestMapping注解映射的URL地址发送的请求中须包含哪些指定的请求头

            @RequestMapping(headers={"键1=值1","键2=值2",...})
          • Cookie

            • Cookie是某些网站为了辨别用户身份,进行Session跟踪而存储在用户本地终端上的数据。Cookie会被暂时性或者永久地保存在用户客户端计算机中
          • 示例

            @RestController
            public class TestController {
                @RequestMapping(value = "/test")
                public String noCookie(){
                    return "请重新登录";
                }
                @RequestMapping(value = "/test",headers = {"Cookie=ID=12345"})
                public String havaCookie(){
                    return "欢迎回来";
                }
            }
        • consumes属性

          • 能够指定用户通过@RequestMapping注解映射的URL地址发送的请求的数据类型

          • 示例

            @RestController
            public class TestController {
                @RequestMapping("/test")
                public String formatError(){
                    return "数据格式错误";
                }
                @RequestMapping(value = "/test",consumes = "application/json")
                public String hello(){
                    return "成功进入接口";
                }
            }
      • 包含映射层级关系的URL

        • 示例

          @RestController
          @RequestMapping("/shop")
          public class TestController {
              @RequestMapping("/book") // 拼接后的地址:"/shop/book"
              public String book() {
                  return "book";
              }
              @RequestMapping("/clothes") // 拼接后的地址:"/shop/book"
              public String clothes() {
                  return "clothes";
              }
          }
          
          
    • @ResponseBody的作用及其用法

      • 该注解的作用是把方法的返回值转换为页面数据

        • 如果是字符串,那就返回字符串
        • 如果是其他数据类型,会先被自动封装成JSON格式的字符串,再返回(这才是最主要的功能)
      • 示例

        public class User {
            private int id;
            private String name;
            private int age;
            public User(int id, String name, int age) {
                this.id = id;
                this.name = name;
                this.age = age;
            }
        	// Getter和Setter
        }
        
        
        @RestController
        public class TestController {
            @RequestMapping("/user")
            @ResponseBody
            public User user() {
                return new User(1,"kaiven",20);
            }
        }

        其实你发现不加这个注解,它也能返回json格式的数据,原因就在于@RestController注解上

    • @RestController

      • 本质上是@Controller和@ResponseBody两个注解的综合体(少些点代码啦,也是我们经常使用的)
  • 重定向URL地址

    • 概念

      • 简单来说就是该URL暂时性或者永久性拒绝访问,给客户端一个新的请求地址自行去访问
    • 使用“redirect:”前缀

      @Controller
      public class TestController {
          @RequestMapping("/db")
          public String db() {
              return  "redirect:http://www.baidu.com";
          }
      }

      当方法没有被@ResponseBody标注,且返回值类型是字符串时,那么这个方法默认就是实现跳转功能。

      如果在即将跳转的URL地址的前面加上“redirect:”,就表示用户通过原始的URL地址发送的请求指向了这个URL地址。

      @RestController被@ResponseBody标记了,所以这里使用的是@Controller

    • 使用response对象

      • 概念

        • response对象指的是HttpServletResponse对象,可用于实现重定向URL的功能
      • 示例

        @Controller
        public class TestController {
            @RequestMapping("/db")
            public void db(HttpServletResponse resp) {
                try{
                    resp.sendRedirect("http://www.baidu.com");
                }
                catch(IOException e){
                    e.printStackTrace();
                }
            }
        }

        如果需要这样操作,而且方法还有返回值,将导致这个返回值失效,所以将返回值类型设置为void

  • 解析URL地址中的参数

    • 自动解析URL地址中的参数

      • 概念

        • SpringBoot能够自动解析URL地址中的参数,并将这些参数的值注入某个方法的参数中
        • 想要获取这些URL地址中的参数的值,只需在这个方法中设置同类型的、同名的参数即可
      • 示例

        @RestController
        public class TestController {
            @RequestMapping("/test")
            public String test(String name){
                return name;
            }
        }
      • 注意

        • 各种类型的请求参数都可以被识别
        • 参数名区分大小写
        • 参数没有顺序要求,参数名时唯一的识别条件
        • 方法参数的类型不应该采用基本数据类型
        • 如果方法参数没有被注入值,则采用默认值
    • 使用@RequestParam标注方法参数

      • 基本示例

        @RequestMapping("/test")
        public String test(@RequestParam String value1 , @RequestParam String value2){
            return "";
        }
      • 属性

        • value和name

          • 作用

            • 用于指定请求参数的名称,一种参数名称的映射
          • 示例

            @RestController
            public class TestController {
                @RequestMapping("/test")
                public String test(@RequestParam(value = "token") String tk){
                    return "你小子发送过来的token值是:"+tk;
                }
            }

            由于name属性和value属性的作用及其用法是一样的,这里就不多做赘述

        • required

          • 作用

            • 指定被@RequestParam注解标注的方法参数是否必须被注入值
            • 默认为true,如果没有对应的参数的话,就会抛出异常
          • 示例

            @RestController
            public class TestController {
                @RequestMapping("/test")
                public String test(@RequestParam(value = "token",required = false) String tk){
                    return "你小子发送过来的token值是:"+tk;
                }
            }

            其实,如果没有value进行参数的映射的话,单纯的“required = false”毫无意义,反而还多写了几个单词

        • defaultValue

          • 作用

            • 指定方法参数的默认值,如果没有对应的请求参数的话
          • 示例

            @RestController
            public class TestController {
                @RequestMapping("/test")
                public String test(@RequestParam(defaultValue = "男") String gender) {
                    return "你的性别是:"+gender;
                }
            }
    • 使用@RequestBody封装json数据

      • 作用

        • 解析请求体中的JSON数据,封装到对应的实体类中去
      • 示例

        实体类Person:

        public class Person {
            private String name;
            private Integer age;
            
            // Getter和Setter一定要提供
        
            @Override
            public String toString() {
                return "Person{" +
                        "name='" + name + '\'' +
                        ", age=" + age +
                        '}';
            }
        }

        controller:

        @RestController
        public class HandleJsonController {
            @RequestMapping("/json")
            public String handleJson(@RequestBody Person someone) {
                System.out.println(someone);
                return "Hello World";
            }
        }

        这里需要注意的是,客户端发送过来的json数据格式一定要和实体类的字段名匹配,不然就是注入默认值。参数值注入到实体类中时,会自动转成对应的字段类型,类型转换不成功会抛出异常

        更复杂的实体类:

        public class Address {
            private String province;
            private String city;
            
            // Getter和Setter一定要写
        
            @Override
            public String toString() {
                return "Address{" +
                        "province='" + province + '\'' +
                        ", city='" + city + '\'' +
                        '}';
            }
        }
        public class Person {
            private String name;
            private Integer age;
            private Address address;
        
            // Getter和Setter
        
            @Override
            public String toString() {
                return "Person{" +
                        "name='" + name + '\'' +
                        ", age=" + age +
                        ", address=" + address +
                        '}';
            }
        }

        controller不变的情况下,客户端的json数据应该是酱紫的:

        {
            "name":"kaiven",
            "age":20,
            "address":{
                "province":"贵州省",
                "city":"贵阳市"
            }
        }
    • 获取request response和session对象的方式

      • 3个对象的各自作用

        • request对象用于从用户通过URL地址发送的请求中接收数据
        • response对象用于对已经接收到的数据做出相应
        • session对象用于保存用户通过URL地址发送的请求,并跟踪这个请求的操作状态
      • 3个对象的获取方式

        • 注入属性

          • 概念

            • SpringBoot会自动创建request对象和response对象的Bean,控制器类可以直接注入这个两个Bean
            • request对象的类型是HttpServletRequest,response对象的类型是HttpServletResponse
          • 代码示例

            @RestController
            public class HandleJsonController {
                @Autowired
                private HttpServletRequest request;
                @Autowired
                private HttpServletResponse response;
                @RequestMapping("/test")
                public String test() {
                    HttpSession session = request.getSession();
                    System.out.println(session.getId());
                    return "Hello World";
                }
            }
        • 注入参数

          • 概念

            • 就是方法上的参数上做手脚喽
          • 示例

            @RestController
            public class HandleJsonController {
                @RequestMapping("/test")
               public String test(HttpServletRequest req, HttpServletResponse resp,HttpSession session) throws Exception {
                    return "test";
               }
            }

            由于方法参数的注入是按照类型的,所以也可以与其他参数类一起使用,没有顺序要求

  • 使用RESTful风格映射动态URL地址

    • RESTful风格

      • 一种软件架构规则,表述性状态传递,可以简单理解为“让HTTP请求用最简洁、最直观的方式表达自己想要做什么”
      • 就像说话一下,有说的人,和听的人。客户端(说的人)发送请求(动作+资源路径)到服务端(听的人)
      • 动作,即请求方式:GET(查询资源) / POST(创建资源) / PUT(更新资源) / PATCH(只更新资源中一部分内容) / DELETE(删除资源)
      • 资源路径,都是名词(一个句子中怎么会有两个谓语动词呢?)
    • 不同请求类型对应的枚举及其注解

      以前的示例中,我们要控制资源访问的请求方法时,是这样做的:

      @RequestMapping(value="/test",method = RequestMethod.GET)

      其实,有更方便的注解来简化代码:

      @GetMapping(value="/test")

      当然,其他的请求类型也是这样的,就不一一列举了

    • 映射动态URL地址

      • 概念

        • 针对一些有规律的URL地址,我们会去用一个“占位符”去表示URL的这个位置是动态改变的
        • 我们可以使用@PathVariable注解参数实现对于“占位符”位置参数的获取
      • 示例

        @RestController
        public class HandleJsonController {
            @RequestMapping("/test/{name}")
            public String test(@PathVariable String name) {
                return "Hello " + name;
            }
        }

        当然,你还以创建参数映射:

        @RestController
        public class HandleJsonController {
            @RequestMapping("/test/{name}")
            public String test(@PathVariable("name") String name_) {
                return "Hello " + name_;
            }
        }

        “占位符”参数有多少个,@PathVariable就可注解几个(放心,不会很多的)

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值