注意:绑定到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的内容可以参考: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; }
实体类的写法: 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))