15.springboot接受前台传来的值

1.注解

注意:绑定到map上的,获取到的属性类型都是String!
1.注解 :
    1.1路径变量获取
            @PathVariable获取请求路径上的传参:
            示例:(两种用法)
                //1.标注在方法属性上:@PathVariable("id") String id并指定请求路径上绑定的名称
                //2.标注在Map<String,String>属性上(注意:map的类型必须是<String,String>),是将请求路径的key和对应的value全部传入
                @GetMapping(value = "/user/{id}/owner/{name}")
                public Map<String,Object> getUser(@PathVariable("id") String id,
                                      @PathVariable("name") String name,
                                      @PathVariable Map<String,String> pv){
                
                    System.out.println("路径传参:id"+id+" name:"+name);
                    Map<String, Object> map=new HashMap<String, Object>();
                    map.put("id", id);
                    map.put("name",name);
                    map.put("map_pv", pv);
                    return map;
                }
            此时浏览器输入:http://localhost:8080/user/18/owner/吴孟达/
            页面输出:{"map_pv":{"id":"18","name":"吴孟达"},"name":"吴孟达","id":"18"}
            控制台输出:路径传参:id:18 name:吴孟达

    1.2获取请求头里的信息
        @RequestHeader来获取浏览器请求头里的信息
        示例:用法和@PathVariable类似,有两种用法
            1.对应请求头里的某一条信息
            2.@RequestHeader Map<String, String> headers,标注map,注意Map必须是String,String将请求头中的信息全部放入到map中
            @RequestMapping("/getHead")
            public Map<String,Object> getHeader(@RequestHeader("User-Agent") String userAgent,//获取请求头中的User-Agent
                                                @RequestHeader("Host") String host,//获取请求头中的Host
                                                @RequestHeader Map<String, String> headers){//将所有请求头中的信息全部放入到map中
                Map<String, Object> map = new HashMap<> ();
                map.put("user-agent", userAgent);
                map.put("host", host);
                map.put("headerAll", headers);
                return map;
            }
            
    1.3获取请求参数
        @RequestParm来获取请求参数
        示例:用法和上述一致,有两种用法
        1.对应请求参数中的某一项
        2.@RequestParam Map<String,String> parms_Map,标注一个map,接收所有的请求参数,一样的map类型必须是String,String
        @RequestMapping("/getParms")
        public Map<String, Object> getParameters(@RequestParam("age") Integer age,//标注请求参数中的age
                                                 @RequestParam("names") List<String> names,//标注请求参数中的names
                                                 @RequestParam Map<String,String> parms_Map//将所有的请求参数都放入一个map中
                                                 ){
            Map<String, Object> map = new HashMap<> ();
            map.put("age", age);
            map.put("names",names);
            map.put("parms_All", parms_Map);
            return map;
        }
        当请求路径是:http://localhost:8080/getParms?age=18&names=吴孟达&names=刘丹
        注意!!,请求参数中的names有两个值:吴孟达和刘丹,所有后台使用list来接收names
        页面输出:发现map接收的重复name参数时,只会放入第一个
            {"parms_All":{"age":"18","names":"吴孟达"},"names":["吴孟达","刘丹"],"age":18}
            
            
    
    1.4获取cookie的值
        @CookieValue标签获取cookie的值
        用法也是两种:
        第一种:指定cookie的key,获取指定cookie的值
        第二种:@CookieValue Cookie cookie将cookie的所有信息封装到Cookie对象中
        示例如下:
            @RequestMapping("/getCookie")
            public void getCookie(@CookieValue("_ga") String _ga,@CookieValue Cookie cookie){
                System.out.println("cookie_ga:"+_ga);
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
            
            
    1.5获取请求体的内容(浏览器发起post请求时,获取 requestBody中的内容)
            示例:
                页面代码是:
                    <form action="/saveUser" method="post" >
                        姓名:<input name="userName"><br>
                        邮箱:<input name="email"><br>
                        <input type="submit" value="提交">
                    </form>
                控制类处理代码是:
                       @RequestMapping("/saveUser")
                        public void saveUser(@RequestBody String content){//获取的是请求体中的内容
                            System.out.println(content);
                        }  
                页面输出:
                    userName=wmd&email=244594537

 1.6获取请求域中的属性
        @RequestAttribute获取请求域中的值
        示例,是将请求转发到另外一个请求上,第一个请求往请求域中放东西,下一个请求中获取请求域中的东西
    示例:
        @Controller
        public class RequestController {
            @RequestMapping("/goto")
            public String goToPage(HttpServletRequest request){
                request.setAttribute("msg","成功了...");
                request.setAttribute("code",200);
                return "forward:/success";
            }
        
            @RequestMapping("/success")
            @ResponseBody
            public void success(@RequestAttribute("msg")String msg,
                                @RequestAttribute("code")Integer code,
                                HttpServletRequest requestA){
                System.out.println("msg:"+msg);
                System.out.println("code:"+code);
            }
        }

矩阵变量

矩阵变量:在路径变量里配置了请求参数,又和路径变量不同,多个请求参数以分号隔开!
例子:
    请求路径为:/cars/{path;low=34;brand=byd,audi,yd}-->一个key对应多个值时以逗号隔开,例如brand,多个键值对以分号隔开,例如path/lown.brand
    上述请求路径也可以改为:/cars/{path;low=34;brand=byd;brand=audi;brand=yd}
这样形式的变量叫做矩阵变量!

相关面试题目:在页面开发中如果cookie被禁用了,session中的内容如何使用??

cookie和session的内容可以参考:java-web中的cookie和session
文档:20.cookie和session.note
链接:http://note.youdao.com/noteshare?id=23cfc809611ae9811d564e402932862f&sub=D9A782917DDB42869990EC6105C04EDC

基本内容是:cookie保存着sesion的id(jsessionid),可以根据此id获取到session,但是如果cookie被禁用了,该jseesionid无法传到后台,应该如何做,
可以使用矩阵变量,重写url:
    改为:/abc;jsessionid=xxxx将sesionid传入后台
    
后台使用来获取
矩阵变量的使用步骤:
    1.必须往容器中注册自己的一个组件
        自定义配置类中新增组件:设置RemoveSemicolonContent为false,意思是分号后的东西生效
        @Configuration
        public class WebConfig {
            @Bean
            public WebMvcConfigurer webMvcConfigurer(){
                return new WebMvcConfigurerAdapter() {
                    @Override
                    public void configurePathMatch(PathMatchConfigurer configurer) {
                        UrlPathHelper urlPathHelper=new UrlPathHelper();
                        //这个设置至关重要:默认是true,该设置是否移除请求路径中分号后的内容。矩阵变量全凭分号,所以此处改为false,使矩阵变量生效
                        urlPathHelper.setRemoveSemicolonContent(false);
                        configurer.setUrlPathHelper(urlPathHelper);
                    }
                };
            }
        }
    2.控制类的写法:请求路径是:http://localhost:8080/car/sell;low=12;brand=宝马, 奥迪
            @RequestMapping("/car/{path}")
            public void carsSell(@MatrixVariable("low") Integer low,
                                 @MatrixVariable("brand")List<String> brand,
                                 @PathVariable("path") String path){
                System.out.println("矩阵变量-->low:"+low);
                System.out.println("矩阵变量-->brand:"+brand);
                System.out.println("路径变量:path:"+path);
            }
            可以正常拿到,控制台输出:
                矩阵变量-->low:12
                矩阵变量-->brand:[宝马, 奥迪]
                路径变量:path:sell
                
    3.如果路径是:http://localhost:8080/car/sell;low=12;brand=宝马, 奥迪/save;low=13;brand=byd, 吉利
    如果想获取到byd和吉利用上面的@MatrixVariable直接获取就不对了,需要指定是哪个路径了
    可以这么写:使用pathVar 指定是哪个路径变量上的矩阵变量
        @RequestMapping("/car/{path}/{save}")
        public Map carsSell(@MatrixVariable(value = "low",pathVar = "path") Integer low,
                            @MatrixVariable(value = "brand",pathVar = "path")List<String> brand,
                            @PathVariable("path") String path,
                            @PathVariable("save") String save,
                            @MatrixVariable(value = "low",pathVar = "save")Integer low_save,
                            @MatrixVariable(value = "brand",pathVar = "save") List<String> brand_save
                            ){
            System.out.println("矩阵变量-->low:"+low);
            System.out.println("矩阵变量-->brand:"+brand);
            System.out.println("路径变量:path:"+path);
            System.out.println("矩阵变量-->brand_save:"+brand_save);
            Map<String, Object> map=new HashMap<>();
            map.put("low",low);
            map.put("brand", brand);
            map.put("path", path);
            return map;
        }
 

后台通过javabean接受传来的参数

实体类的写法:
    1.Person类
            @Data
            @AllArgsConstructor
            @NoArgsConstructor
            @ToString
            public class Person {
                private Integer age;
                private String name;
                private Pet pet;
            }
    2.Pet类的写法
            @Data
            @AllArgsConstructor
            @NoArgsConstructor
            @ToString
            public class Pet {
                private Integer age;
                private String name;
            }
    3.控制类的写法
            @RequestMapping("/savePerson")
            //使用实体类接受前台传来的值
            public String savePerson(Person person){
                System.out.println("前台传来的person:"+person.toString());
                return person.toString();
            }
    
    测试:当前台传来:http://localhost:8080/savePerson?age=18&name=wmd&pet.name=ld&pet.age=18
    控制台输出:前台传来的person:Person(age=18, name=wmd, pet=Pet(age=18, name=ld))

 

posted @ 2022-05-11 21:52  努力的达子  阅读(152)  评论(0编辑  收藏  举报