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))