文章目录
1 参数的绑定
1.1 请求参数的绑定
默认绑定行为根据名称匹配原则进行的数据绑定,当请求中的参数名与方法参数名一致时,相应的参数值将被绑定到对应的方法参数上。
http://localhost:8080/t1?age=18&name=wfg
@RequestMapping("/t1")
public String t1(int age,String name){
return name+"年龄为:"+age;
}
除了可以基于注解定义多个简单参数外,我们可以指定javaBean对象的引用
public class Person {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RequestMapping("/t1")
public String t1(Person person){
return person.getName()+"年龄为:"+person.getAge();
}
注意:所绑定的参数必须与请求参数的名称相同
1.1.1 使用@requestParam明确指定的关系
可以根据@RequestParam的信息重新考虑要将请求参数绑定到当前方法参数上
@RequestMapping("/t1")
//requestParam 默认情况下,所指定的请求参数不存在,绑定过程中出现异常,可以将required的属性修改为false
public String t1(@RequestParam(value = "age" ,required = false) int update_age, String name){
return name+"年龄为:"+update_age;
}
注意:默认情况下使用requestParam 所绑定的参数必须存在
requsetParam 还可以获取application/x-www-form-urlencoded的编码格式post表单提交
1.2 使用@pathvarabiles注解获取请求路径
@PathVariable注解的作用就是从URL里面读取参数值,可以在@RequestMapping里面添加占位符{paramName},还可以添加正则表达式
http://localhost:8080/t2/wfg
@RequestMapping("/t2/{name}")
public String t2(@PathVariable String name){
return "name:"+name;
}
1.3 使用@ResponseBody接受json数据格式
请求参数永远都是一个,因为一个request中只包含一个request body. 理解了这个,就会明白Spring MVC不支持多个@RequestBody。
所以我们只能用实体对象,Map或者直接用String类型去接收数据
否则SpringMVC会直接把整个json字符串注入到参数中,此时用String类型的参数是可以接收的,但是用Integer,Long等其他类型会报JSON转换异常。
Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`)
{
"age": 18,
"name": "wfg"
}
@RequestMapping("/t3")
public Person t3(@RequestBody Person person){
return person;
}
前端发送给后台的数据只是一个对象(使用场景:如注册,保存空户,修改信息),那么我们就大课放心的使用application/json来处理数据
可以使用HandlerMethodArgumentResolver进行自定义参数解析器。
1.4 使用@RequestHeader获取请求头信息
@RequestMapping("/t5")
public String t5(@RequestHeader("Connection") String param1){
return param1;
}
2 时间类型参数处理
当前台传递的是字符串日期类型与后台的日期类型不能匹配,我们就需要对该类型进行转换为日期类型,@DateTimeFormat是用于处理前台转到后台时类型匹配问题。,@JsonFormat是处理后台转到前台为时间戳问题
2.1 处理方法
@DateTimeFormat是格式化 key=value 这种格式,只能用于@RequestParam
/*
* @Description: 将前台所传的 yyyy-MM-dd HH:mm:ss字符串格式给解析为date类型
* @param [beginTime]
* @return java.lang.String
*/
@RequestMapping("/t7")
public String t7(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date beginTime){
return beginTime.toString();
}
注意:pattern所解析的格式一定要和前台所传的数据一致
2.2 @DateTimeFormat无效
@DateTimeFormat放到@RequestBody下是无效的,我们可以使用**@JsonFormat**进行处理
@Data
public class TestDate {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
Date beginTime;
}
@RequestMapping("/t8")
public String t8(@RequestBody TestDate testDate){
return testDate.getBeginTime().toString();
}
在@RequestBody中则可以使用**@JsonFormat把传给后台的时间字符串转成Date,也就是说@JsonFormat其实既可以把传给后台的时间字符串转成Date也可以把后台传出的Date转成时间字符串。**
2.3 自定义数据绑定解决date参数问题
我们想要对所是使用的databinder,做进一步的定制,通常的写法是复写父类的initBinder方法,在注解的实现里我们可以是用@initbinder
注解实现
public class BaseController {
@InitBinder
public void initBinder(WebDataBinder binder){
// 自定义属性编辑器,通过重写PropertyEditorSupport里面的setAsText最后调用setValue方法,完成转换后值的设置
binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
{
@Override
public void setAsText(String text)
{
//通过工具类进行转换为相应的date
setValue(DateUtils.parseDate(text));
}
});
}
}