4 springmvc参数绑定
当项目中引入springmvc框架后,所有的请求流转将由springmvc进行控制,
当客户端发送的请求中包含数据(也就是请求参数)时,那么该如何在controller层获取这些参数呢?
springmvc会自动的将请求中包含的参数和方法的参数进行匹配,也就是说只要保证,
请求中的参数名称和方法中的参数名称相对应(另,参数的格式也要正确),
在方法中就可以使用这些参数—即请求中的参数。
4.1基本类型参数绑定
当需要获取客户端发送过来的少量数据时,可以在Controller中声明的方法上,
通过声明方法参数对这些参数一个一个进行接收,具体示例如下:
需求:
通过浏览器发请求访问Controller,
并在请求中携带name、age数据访问服务器,在服务器端的 Controller中获取这些数据。
1、创建com.tedu.controller.ParamController类
2、在ParamController类中添加param1方法,用于接收基本类型的参数,代码实现如下:
package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
/* 测试:接收基本类型的类型的参数 */
@RequestMapping("param1")
public String param1(String name, Integer age){
System.out.println("name="+name);
System.out.println("age="+age);
return "home";
}
}
3、访问ParamController中的param1方法,在访问时,注意将name和age参数一起发送给服务器:
控制台输出结果为:
4.2包装类型参数绑定
当需要获取客户端发送过来的多个数据时,可以在Controller中声明的方法上,通过声明方法参数对这些数据一个一个进行接收较麻烦,可以在方法上声明对象类型的参数,通过对这些数据统一进行接受,springmvc会自动将接收过来的参数封装在对象中,具体示例如下:
1、在ParamController类中添加param2方法,用于接收对象类型的参数,代码实现如下:
package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
/* 测试:接收对象类型的参数 */
@RequestMapping("param2")
public String param2(User user){
System.out.println("user="+user);
return "home";
}
@RequestMapping("param1")
public String param1(String name, Integer age){
System.out.println("name="+name);
System.out.println("age="+age);
return "home";
}
}
3、创建User类,声明name和age属性,提供对应的set和get方法,并重写toString方法
package com.tedu.controller;
public class User {
/* 声明name、age属性 */
private String name;
private Integer age;
/* 声明name、age属性对应的set和get方法 */
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/* 重写toString方法 */
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
4、访问ParamController中的param2方法,在访问时,注意将name和age参数一起发送给服务器:
控制台输出结果为:
4.3 日期类型参数绑定
1、在ParamController类中添加param3方法,代码实现如下:
package com.tedu.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller /* 这个注解表示当前类是属于控制层 */
public class ParamController {
/* 测试:接收日期类型的参数 */
@RequestMapping("param3")
public String param3(Date date){
System.out.println("date="+date.toLocaleString());
return "home";
}
@RequestMapping("param2")
public String param2(User user){
System.out.println("user="+user);
return "home";
}
@RequestMapping("param1")
public String param1(String name, Integer age){
System.out.println("name="+name);
System.out.println("age="+age);
return "home";
}
}
2、访问ParamController中的param3方法,在访问时,注意将date参数一起发送给服务器:
控制台输出结果为:
常见问题:
1、当访问ParamController中的param3方法,如果传递给服务器的日期数据是如下格式:
从图中可以看出,如果日期参数是 yyyy-MM-dd 格式就会出现400错误,其实是因为参数格式匹配错误,由于springmvc默认的日期格式是yyyy/MM/dd,因此如果日期参数不是 yyyy/MM/dd 格式,就会出现400错误!!
2、解决方案:
在springmvc中,提供了@InitBinder注解,用于指定自定义的日期转换格式,因此,我们只需要在Controller类中添加下面的代码即可,在接受日期类型的参数时,会自动按照自定义的日期格式进行转换。
public class ParamController {
@RequestMapping("param3")
public String param3(Date date){
System.out.println("date="+date.toLocaleString());
return "home";
}
/* 自定义日期转换格式 */
@InitBinder
public void InitBinder (ServletRequestDataBinder binder){
binder.registerCustomEditor(java.util.Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)
);
}
...
...
}
3、再次测试:
控制台输出结果为: