重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.SpringBoot接收客户端提交数据/参数会使用到相关注解
创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为竹山企业提供专业的成都做网站、成都网站建设,竹山网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。2.详解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、
@CookieValue,@RequestBody
接下来,演示各种方式提交数据/参数给服务器,服务器如何使用注解接收
作用:获取路径中的变量
前端参数输出。不用在href指定method="get"
@PathVariable 路径变量 /id/name
后端接收参数输入
@PathVariable的value需要和{占位符}一致
@PathVariable的value 可以和形参不一致
@RestController
public class ParameterController {
@GetMapping("/monster/{id}/{name}")
public String pathVariable(@PathVariable("id") Integer id,
@PathVariable("name") String username,
@PathVariable Mapmap){
System.out.println("id="+id);
System.out.println("username="+username);
System.out.println("map="+map);
return "PathVariable";
}
}
作用:获取请求头全部信息,或者指定信息。
前端请求代码
@RequestHeader 请求头信息获取~
后端获取请求头代码
@GetMapping("/requestHeader")
public String requestHeader(@RequestHeader("host") String host,
@RequestHeader("ACCEPT")String accept,
@RequestHeader() Mapheader){
System.out.println("host-"+host);
System.out.println("accept-"+accept);
System.out.println("header-"+header);
return "requestHeader-success";
}
可以通过@RequestHeader的value获取指定的字段。也可以不设置字段,传递给Map所有字段。
作用:获取请求参数。
前端参数传递。方法一:
@RequestParam 请求参数
方法二:
后端参数接收
@GetMapping("/requestParam")
public String requestParam(@RequestParam("name") String username,
@RequestParam("fruit") String fruit,
@RequestParam Mapparams){
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的值
前端
@CookieValue--获取cookie值
后端:
代码说明:
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提交的。
@RequestBody 获取request的请求体
后端:
测试使用@RequestMapping来接收映射也没有问题。使用PostMapping更标准。
此时可以获得请求体。后面完善把请求体当作一个bean来封装的方法。
@RequestMapping("/requestBody")
public String requestBody(@RequestBody String content){
System.out.println("content-"+content);
return "@RequestBody-success~";
}
作用:获取request域属性
前端:
@RequestAttribute--获取request域属性
后端:
踩坑:@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";
}
}
作用:获取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(Mapmap,
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";
}
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() {
@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;
}
});
}
};
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧