springboot系列九: 接收参数相关注解

07-12 967阅读

文章目录

  • 基本介绍
  • 接收参数相关注解应用实例
      • @PathVariable
      • @RequestHeader
      • @RequestParam
      • @CookieValue
      • @RequestBody
      • @RequestAttribute
      • @SessionAttribute
      • 复杂参数
        • 基本介绍
        • 应用实例
        • 自定义对象参数-自动封装
          • 基本介绍
          • 应用实例

            springboot系列九: 接收参数相关注解

            基本介绍

            1.SpringBoot 接收客户端提交数据 / 参数会使用到相关注解.

            2.详细学习 @PathVariable, @RequestHeader, @ModelAttribute, @RequestParam, @CookieValue, @RequestBody

            接收参数相关注解应用实例

            ●需求:

            演示各种方式提交数据/参数给服务器, 服务器如何使用注解接收

            @PathVariable

            1.创建src/main/resources/public/index.html

            JavaWeb系列十: web工程路径专题

            跟着老韩学springboot

            基本注解:
            @PathVariable-路径变量 monster/100/king

            2.创建src/main/java/com/zzw/springboot/controller/ParameterController.java

            url占位符回顾

            @RestController
            public class ParameterController {
                /**
                 * 1./monster/{id}/{name} 构成完整请求路径
                 * 2.{id} {name} 就是占位变量
                 * 3.@PathVariable("name"): 这里 name 和 {name} 命名保持一致
                 * 4.String name_ 这里自定义, 这里韩老师故意这么写
                 * 5.@PathVariable Map map 把所有传递的值传入map
                 * 6.可以看下@pathVariable源码
                 * @return
                 */
                @GetMapping("/monster/{id}/{name}")
                public String pathVariable(@PathVariable("id") Integer id,
                                           @PathVariable("name") String name,
                                           @PathVariable Map map) {
                    System.out.println("id = " + id + "\nname = " + name + "\nmap = " + map);
                    return "success";
                }
            }
            

            3.测试 http://localhost:8088https://blog.csdn.net/monster/100/king

            springboot系列九: 接收参数相关注解

            springboot系列九: 接收参数相关注解

            @RequestHeader

            需求: 演示@RequestHeader使用.

            1.修改src/main/resources/public/index.html

            @RequestHeader-获取http请求头

            2.修改ParameterController.java

            JavaWeb系列八: WEB 开发通信协议(HTTP协议)

            /**
             * 1. @RequestHeader("Cookie") 获取http请求头的 cookie信息
             * 2. @RequestHeader Map header 获取到http请求的所有信息
             */
            @GetMapping("https://blog.csdn.net/requestHeader")
            public String requestHeader(@RequestHeader("Host") String host,
                                        @RequestHeader Map header) {
                System.out.println("host = " + host + "\nheader = " + header);
                return "success";
            }
            

            3.测试

            springboot系列九: 接收参数相关注解

            springboot系列九: 接收参数相关注解

            @RequestParam

            需求: 演示@RequestParam使用.

            1.修改src/main/resources/public/index.html

            @RequestParam-获取请求参数

            2.修改ParameterController.java

            SpringMVC系列五: SpringMVC映射请求数据

            /**
             * 如果我们希望将所有的请求参数的值都获取到, 可以通过
             * @RequestParam Map params
             */
            @GetMapping("/hi")
            public String hi(@RequestParam(value = "name") String username,
                             @RequestParam(value = "fruit") List fruits,
                             @RequestParam Map params) {
                System.out.println("username = " + username + "\nfruits = "
                        + fruits + "\nparams = " + params);
                return "success";
            }
            

            3.测试

            springboot系列九: 接收参数相关注解

            springboot系列九: 接收参数相关注解

            @CookieValue

            需求: 演示@CookieValue使用.

            1.修改src/main/resources/public/index.html

            @CookieValue-获取cookie值
            

            2.修改ParameterController.java

            JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

            /**
             * 因为我们的浏览器目前没有cookie, 我们可以自己设置cookie
             * 如果要测试, 可以先写一个方法, 在浏览器创建对应的cookie
             * 说明:
             * 1. value = "cookie_key" 表示接收名字为 cookie_key的cookie
             * 2. 如果浏览器携带来对应的cookie, 那么后面的参数是String, 则接收到的是对应的value
             * 3. 后面的参数是Cookie, 则接收到的是封装好的对应的cookie
             */
            @GetMapping("https://blog.csdn.net/cookie")
            public String cookie(@CookieValue(value = "cookie_key") String cookie_value,
                                 @CookieValue(value = "username") Cookie cookie,
                                 HttpServletRequest request) {
                System.out.println("cookie_value = " + cookie_value
                        + "\nusername = " + cookie.getName() + "-" + cookie.getValue());
                Cookie[] cookies = request.getCookies();
                
                for (Cookie cookie1 : cookies) {
                    System.out.println("cookie1 = " + cookie1.getName() + "-" + cookie1.getValue());
                }
                return "success";
            }
            

            3.测试

            springboot系列九: 接收参数相关注解

            springboot系列九: 接收参数相关注解

            @RequestBody

            需求: 演示@RequestBody使用.

            1.修改src/main/resources/public/index.html

            测试@RequestBody获取数据: 获取POST请求体

            名字:
            年龄:

            2.修改ParameterController.java

            SpringMVC系列十: 中文乱码处理与JSON处理

            /**
             * @RequestBody 是整体取出Post请求内容
             */
            @PostMapping("/save")
            public String postMethod(@RequestBody String content) {
                System.out.println("content = " + content);//content = name=zzw&age=23
                return "sucess";
            }
            

            3.测试

            springboot系列九: 接收参数相关注解

            content = name=zzw&age=123

            @RequestAttribute

            需求: 演示@RequestAttribute使用. 获取request域的属性.

            1.修改src/main/resources/public/index.html

            @RequestAttribute-获取request域属性
            

            2.创建RequestController.java

            SpringMVC系列十: 中文乱码处理与JSON处理

            @Controller
            public class RequestController {
                @RequestMapping("https://blog.csdn.net/login")
                public String login(HttpServletRequest request) {
                    request.setAttribute("user", "赵志伟");//向request域中添加的数据
                    return "forward:/ok";//请求转发到 /ok
                }
                @GetMapping("/ok")
                @ResponseBody
                public String ok(@RequestAttribute(value = "user", required = false) String username,
                                 HttpServletRequest request) {
                    //获取到request域中的数据
                    System.out.println("username--" + username);
                    System.out.println("通过servlet api 获取 username-" + request.getAttribute("user"));
                    return "success"; //返回字符串, 不用视图解析器
                }
            }
            

            3.测试…

            @SessionAttribute

            需求: 演示@SessionAttribute使用. 获取session域的属性.

            1.修改src/main/resources/public/index.html

            @SessionAttribute-获取session域属性
            

            2.创建RequestController.java

            JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

            @Controller
            public class RequestController {
                @RequestMapping("https://blog.csdn.net/login")
                public String login(HttpServletRequest request, HttpSession session) {
                    request.setAttribute("user", "赵志伟");//向request域中添加的数据
                    session.setAttribute("mobile", "黑莓");//向session域中添加的数据
                    return "forward:/ok";//请求转发到 /ok
                }
                @GetMapping("/ok")
                @ResponseBody
                public String ok(@RequestAttribute(value = "user", required = false) String username,
                                 HttpServletRequest request,
                                 @SessionAttribute(value = "mobile", required = false) String mobile,
                                 HttpSession session) {
                    //获取到request域中的数据
                    System.out.println("username--" + username);
                    System.out.println("通过servlet api 获取 username-" + request.getAttribute("user"));
                    //获取session域中的数据
                    System.out.println("mobile--" + mobile);
                    System.out.println("通过HttpSession 获取 mobile-" + session.getAttribute("mobile"));
                    return "success"; //返回字符串, 不用视图解析器
                }
            }
            

            3.测试…

            复杂参数

            基本介绍

            1.在开发中, SpringBoot在相应客户端请求时, 也支持复杂参数

            2.Map, Model, Errors/BindingResult, RedirectAttributes, ServletResponse, SessionStatus, UriComponentsBuilder, ServletUriComponentBuilder, HttpSession.

            3.Map, Model,数据会被放在request域, 到时Debug一下.

            4.RedirectAttribute 重定向携带数据

            应用实例

            说明: 演示复杂参数的使用.

            重点: Map, Model, ServletResponse

            ●代码实现

            1.修改src/main/java/com/zzw/springboot/controller/RequestController.java

            SpringMVC系列六: 模型数据

            //响应一个注册请求
            @GetMapping("/register")
            public String register(Map map,
                                   Model model,
                                   HttpServletRequest request) {
                //如果一个注册请求, 会将注册数据封装到map或者model
                //map中的数据和model中的数据, 会被放入到request域中
                map.put("user", "赵志伟");
                map.put("job", "java");
                model.addAttribute("sal", 6000);
                //一会我们再测试response使用
                
                //请求转发
                return "forward:/registerOk";
            }
            @GetMapping("/registerOk")
            @ResponseBody
            public String registerOk(HttpServletRequest request,
                                     @RequestAttribute("user") String user,
                                     @RequestAttribute("job") String job,
                                     @RequestAttribute("sal") Double sal) {
                System.out.println("user=" + request.getAttribute("user"));
                System.out.println("job=" + job);
                System.out.println("sal=" + sal);
                return "success";
            }
            

            2.浏览器输入 http://localhost:8088/register , 打断点测试

            SpringMVC系列十三: SpringMVC执行流程 - 源码分析

            springboot系列九: 接收参数相关注解

            进入目标方法

            springboot系列九: 接收参数相关注解

            剖析 request 对象

            springboot系列九: 接收参数相关注解

            3.继续修改 register()方法

            JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

            //响应一个注册请求
            @GetMapping("/register")
            public String register(Map map,
                                   Model model,
                                   HttpServletRequest request,
                                   HttpServletResponse response) throws UnsupportedEncodingException {
                //如果一个注册请求, 会将注册数据封装到map或者model
                //map中的数据和model中的数据, 会被放入到request域中
                map.put("user", "赵志伟");
                map.put("job", "java");
                model.addAttribute("sal", 6000);
                //一会我们再测试response使用
                //演示创建cookie, 并通过response 添加到浏览器/客户端
                Cookie cookie = new Cookie("email", "978964140@qq.com");
                response.addCookie(cookie);
                //请求转发
                return "forward:/registerOk";
            }
            

            4.测试

            springboot系列九: 接收参数相关注解

            自定义对象参数-自动封装

            基本介绍

            1.在开发中, SpringBoot在响应客户端/浏览器请求时, 也支持自定义对象参数

            2.完成自动类型转换与格式化

            3.支持级联封装

            应用实例

            ●需求说明:

            演示自定义对象参数使用,完成自动封装,类型转换。

            ●代码实现

            1.创建public/save.html

            
            
                
                添加妖怪
            
            
            
                编号: 
            姓名:
            年龄:
            婚否:
            生日:
            坐骑名称:
            坐骑价格:

            2.创建src/main/java/com/zzw/springboot/bean/Car.java

            @Data
            public class Car {
                private String name;
                private Double price;
            }
            

            3.创建src/main/java/com/zzw/springboot/bean/Monster.java

            @Data
            public class Monster {
                private Integer id;
                private String name;
                private Integer age;
                private Boolean maritalStatus;
                private Date birthday;
                private Car car;
            }
            

            4.修改ParameterController.java

            //处理添加monster的方法
            @PostMapping("/saveMonster")
            public String saveMonster(Monster monster) {
                System.out.println("monster = " + monster);
                return "success";
            }
            

            5.回填public/save.html

                编号: 
            姓名:
            年龄:
            婚否:
            生日:

            6.自动封装需要用到自定义转换器. 接下来, 继续学习自定义转换器.


            🔜 下一篇预告: [即将更新,敬请期待]


            📚 目录导航 📚

            1. springboot系列一: springboot初步入门
            2. springboot系列二: sprintboot依赖管理
            3. springboot系列三: sprintboot自动配置
            4. springboot系列四: sprintboot容器功能
            5. springboot系列五: springboot底层机制实现 上
            6. springboot系列六: springboot底层机制实现 下
            7. springboot系列七: Lombok注解,Spring Initializr,yaml语法
            8. springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解


            💬 读者互动 💬

            在学习 Spring Boot 静态资源访问和 Rest 风格请求处理的过程中,您有哪些新的发现或疑问?欢迎在评论区留言,让我们一起讨论吧!😊


VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]