赞
踩
1.SpringBoot接收客户端提交数据/参数会使用到相关注解
2.详解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、
@CookieValue,@RequestBody
接下来,演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
作用:获取路径中的变量
前端参数输出。不用在href指定method="get"
<a href="/spring/monster/100/qiuqiu" >@PathVariable 路径变量 /id/name</a>
后端接收参数输入
@PathVariable的value需要和{占位符}一致
@PathVariable的value 可以和形参不一致
- @RestController
- public class ParameterController {
- @GetMapping("/monster/{id}/{name}")
- public String pathVariable(@PathVariable("id") Integer id,
- @PathVariable("name") String username,
- @PathVariable Map<String,String> map){
- System.out.println("id="+id);
- System.out.println("username="+username);
- System.out.println("map="+map);
- return "PathVariable";
- }
- }
作用:获取请求头全部信息,或者指定信息。
前端请求代码
<a href="/spring/requestHeader">@RequestHeader 请求头信息获取~</a>
后端获取请求头代码
- @GetMapping("/requestHeader")
- public String requestHeader(@RequestHeader("host") String host,
- @RequestHeader("ACCEPT")String accept,
- @RequestHeader() Map<String,String> header){
- System.out.println("host-"+host);
- System.out.println("accept-"+accept);
- System.out.println("header-"+header);
- return "requestHeader-success";
- }
可以通过@RequestHeader的value获取指定的字段。也可以不设置字段,传递给Map所有字段。
作用:获取请求参数。
前端参数传递。方法一:
<a href="/spring/requestParam?name=stein&fruit=pineapple&fruit=peach">@RequestParam 请求参数</a><br/>
方法二:
- <form action="/spring/requestParam" method="get">
- name: <input type="text" name="name"><br/>
- fruit1:<input type="text" name="fruit"><br/>
- fruit2:<input type="text" name="fruit"><br/>
- <input type="submit" value="提交内容"><br/>
- </form>
后端参数接收
- @GetMapping("/requestParam")
- public String requestParam(@RequestParam("name") String username,
- @RequestParam("fruit") String fruit,
- @RequestParam Map<String,String> params){
- System.out.println("name="+username);
- System.out.println("fruit="+fruit);
- System.out.println("params="+params);
- return "RequestParam-success";
- }
@RequestParam()的value依然和前端传递过来的参数名保持一致,形参名可以不一致
@RequestParam()和RequestParam是一样的。能把所有参数传递给map,因为map是集合,key是唯一的,所以有重复参数名的话,只能保存第一个。params={name=stein, fruit=pineapple}
前端传递了2个fruit参数,都能保存到fruit里面。fruit=pineapple,peach
作用:获取cookie的值
前端
<a href="/spring/cookie">@CookieValue--获取cookie值</a>
后端:
代码说明:
1.valve="cookie._key"表示接收名字为cookie_key的cookie
2.如果浏览器携带来对应的cookie,那么后面的参数是String,则接收到的是对应的valve。(参考cookie.name-cookie.value)
3.后面的参数是Cookie,则接收到的是封装好的对应的cookie。整个cookie
4.required=false,表明允许没有该参数时,可以继续执行。当写了required时,value属性名不能省略
5.HttpServletRequest是使用原来servlet的方式处理cookie
- @GetMapping("/cookie")
- public String cookie(@CookieValue(value="cookie_key", required=false) String cookie_value,
- HttpServletRequest request,
- @CookieValue(value="username",required = false)Cookie cookie){
- System.out.println("cookie_value="+cookie_value);
- System.out.println("cookie_username-"+cookie.getName()+"=>"+cookie.getValue());
- Cookie[] cookies = request.getCookies();
- for (Cookie cookie1 : cookies) {
- System.out.println(cookie1.getName()+"=>"+cookie1.getValue());
- }
- return "@cookieValue--success";
- }
因为不存在指定名称的cookie,所以会返回null,调用cookie.getName(),会出现空指针异常。可以自己在浏览器新建指定名称的cookie。
不同的浏览器的位置不一样,firefox是在“存储”里面;chorme是在“应用->存储”里面。再找到cookie选项,新增即可。
作用:获取POST的请求体。如果是GET请求的话,会丢失请求体,所以必须是POST
前端:
踩坑:没写对method,导致值无论怎么改,都是按照默认get提交的。
- <h1>@RequestBody 获取request的请求体</h1>
- <form action="/spring/requestBody" method="post">
- 姓名: <input type="text" name="name"><br/>
- 年龄:<input type="text" name="age"><br/>
- <input type="submit" value="提交内容"><br/>
- </form>
后端:
测试使用@RequestMapping来接收映射也没有问题。使用PostMapping更标准。
此时可以获得请求体。后面完善把请求体当作一个bean来封装的方法。
- @RequestMapping("/requestBody")
- public String requestBody(@RequestBody String content){
- System.out.println("content-"+content);
- return "@RequestBody-success~";
- }
作用:获取request域属性
前端:
<a href="/spring/setAttribute">@RequestAttribute--获取request域属性</a><br/><br/>
后端:
踩坑:@RequestAttribute需要设置要取出的属性名value,否则报错miss attribute。
required = false ,需要添加该属性,避免没有时报错。
request域属性在后端的一个映射中设置,又在另一个中映射中取出,需要使用视图解析器,为便于使用@Controller注解,便重新创建了一类来单独演示。
- @Controller
- public class AttributeController {
-
- @GetMapping("/setAttribute")
- public String setAttribute(HttpServletRequest request){
- request.setAttribute("name","老韩");
- //需要使用请示转发,才能保证request域的内容不丢失
- return "forward:/getAttribute";
- }
-
- @GetMapping("/getAttribute")
- @ResponseBody
- public String getAttribute(@RequestAttribute(value="name",required = false) String attribute,
- HttpServletRequest request){
- System.out.println("attribute="+attribute);
- System.out.println("request_attribute="+request.getAttribute("name"));
- return "@RequestAttribute-success";
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
作用:获取session域的属性。
用法几乎和@RequestAttribute一模一样。只是session可以用重定向来重新请求页面。下面一句仅帮助回忆session是如何设置的。其它都一样,就不再写了。
request.getSession().setAttribute("website","www.baidu.com");
包括Map、Model、Errors/BindingResult、RedirectAttributes、HttpServletResponse、
SessionStatus,UriComponentsBuilder,ServletUriComponentsBuilder,HttpSession
重点了解Map、Model、HttpServletResponse数据会被放在request域
RedirectAttributes重定向携带数据
直接访问后端进行模拟,只有后端代码:
跟SpringMVC一样,数据会自动封装到map和model中,它们又会被放入request中,所以能够在转发的页面使用request.getAttribute()取出。(而不是getModel()或者getMap())
演示通过response添加cookie到浏览器
- //模拟一个注册场景,相应一个注册请求
- @GetMapping("/complex")
- public String register(Map<String,String> map,
- Model model,
- HttpServletResponse response){
- //注册请求会将数据封装到map和model中,它们又会被放入request中
- map.put("user","scott");
- map.put("job","java构架师");
- model.addAttribute("sal","80000");
-
- //演示通过response添加cookie到浏览器
- Cookie cookie = new Cookie("newCookie","testContent");
- response.addCookie(cookie);
-
- return "forward:/registerOk";
- }
-
- @GetMapping("/registerOk")
- @ResponseBody
- public String complexComplete(HttpServletRequest request){
- System.out.println("user->"+request.getAttribute("user"));
- System.out.println("job->"+request.getAttribute("job"));
- System.out.println("sal->"+request.getAttribute("sal"));
- return "complex-success";
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
1.在开发中,SpringBoot在响应客户端/浏览器请求时,也支持自定义对象参数
2.完成自动类型转换与格式化
3.支持级联封装
前段按照POJO的属性名,利用form的post方式提交即可,后端的转换器会自动进行封装。比较简单
- public String saveMonster(Monster monster){
- }
SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器
SpringBoot也支持自定义转换器,这个内置转换器在debug的时候,可以看到,提供了124个内置转换器。看下源码GenericConverter-ConvertiblePair
自定义转换器的实现代码。将String类型的数据,转换封装成Car类型的数据。
- @Configuration(proxyBeanMethods=false)
- public class WebConfig {
-
- @Bean
- public WebMvcConfigurer webMvcConfigurer(){
- return new WebMvcConfigurer() {
- @Override
- public void addFormatters(FormatterRegistry registry) {
- registry.addConverter(new Converter<String, Car>() {
-
- @Override
- public Car convert(String source) {
- if(!ObjectUtils.isEmpty(source)){
- String[] split = source.split(",");
- Car car = new Car();
- car.setName(split[0]);
- car.setPrice(Double.parseDouble(split[1]));
- return car;
- }
- return null;
- }
- });
- }
- };
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。