[Spring MVC] - SpringMVC的各种参数绑定方式 SpringMVC的各种参数绑定方式
Controller代码:
@RequestMapping("saysth.do") //表单中input的name值和Controller的参数变量名保持一致 public void test(int count) {} //表单中input的name值和Controller的参数变量名不一致,使用@RequestParam注解 //public void test(@RequestParam("count") int cnt) {}
表单代码:
...... 表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者”"的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或”",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。Controller代码:
@RequestMapping("saysth.do") public void test(Integer count) { } 表单代码:
...... 和基本数据类型基本一样,不同之处在于,表单传递过来的数据可以为null或”",以上面代码为例,如果表单中num为”"或者表单中无num这个input,那么,Controller方法参数中的num值则为null。Model代码:
public class User {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Controller代码:
@RequestMapping("saysth.do") public void test(User user) { }
表单代码:
...... 非常简单,只需将对象的属性名和input的name值一一匹配即可。 ## 使用 @ModelAttribute > @RequestMapping(value="/people", method=RequestMethod.POST) > @ResponseBody > public String requestPeople(@ModelAttribute People people) { > return "Get request is successful. Post param : User Class - " + people.toString(); > }对应Ajax的请求如下:
var people = {
name:"Heacewalker",
age:25,
relationship:{"boss":"BigBoss"}
}
function postClick() {
$.ajax({
type:"POST",
url:"http://localhost:8080/Learn-Spring-MVC/people",
data:people,
dataType:"json",
success:function(result) {
//......
},
error:function(result) {
//......
}
});
}
Model代码:
public class ContactInfo {
private String tel;
private String address;
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class User {
private String firstName;
private String lastName;
private ContactInfo contactInfo;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public ContactInfo getContactInfo() {
return contactInfo;
}
public void setContactInfo(ContactInfo contactInfo) {
this.contactInfo = contactInfo;
}
}
Controller代码:
@RequestMapping("saysth.do") public void test(User user) { System.out.println(user.getFirstName()); System.out.println(user.getLastName()); System.out.println(user.getContactInfo().getTel()); System.out.println(user.getContactInfo().getAddress()); }
User对象中有ContactInfo属性,Controller中的代码和第3点说的一致,但是,在表单代码中,需要使用“属性名(对象类型的属性).属性名”来命名input的name。
Model代码:
public class User {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public class UserListForm {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
Controller代码:
复制代码
@RequestMapping("saysth.do") public void test(UserListForm userForm) { for (User user : userForm.getUsers()) { System.out.println(user.getFirstName() + " - " + user.getLastName()); } }
表单代码:
First Name Last Name
其实,这和第4点User对象中的contantInfo数据的绑定有点类似,但是这里的UserListForm对象里面的属性被定义成List,而不是普通自定义对象。所以,在表单中需要指定List的下标。值得一提的是,Spring会创建一个以最大下标值为size的List对象,所以,如果表单中有动态添加行、删除行的情况,就需要特别注意,譬如一个表格,用户在使用过程中经过多次删除行、增加行的操作之后,下标值就会与实际大小不一致,这时候,List中的对象,只有在表单中对应有下标的那些才会有值,否则会为null,看个例子:
表单代码:
复制代码
First Name | Last Name |
---|---|
复制代码 aaa - bbb ccc - ddd null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null null - null eee - fff 复制代码
@RequestMapping(value="/list", method=RequestMethod.POST) @ResponseBody public String requestList(@RequestParam("listParam[]") List param) { return "Request successful. Post param : List-"+param.toString(); } 对应Ajax的请求如下:
var strList = new Array(); strList.push("field1"); strList.push("field2"); function postList() { $.ajax({ type:"POST", url:"http://localhost:8080/Learn-Spring-MVC/list", data:{"listParam" : strList}, dataType:"json", success:function(result) { //...... }, error:function(result) { //...... } }); }
Set和List类似,也需要绑定在对象上,而不能直接写在Controller方法的参数中。但是,绑定Set数据时,必须先在Set对象中add相应的数量的模型对象。 Model代码:
复制代码 public class User { private String firstName; private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public class UserSetForm {
private Set<User> users = new HashSet<User>();
public UserSetForm() {
users.add(new User());
users.add(new User());
users.add(new User());
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
} 复制代码 Controller代码:
复制代码
@RequestMapping("saysth.do") public void test(UserSetForm userForm) { for (User user : userForm.getUsers()) { System.out.println(user.getFirstName() + " - " + user.getLastName()); } } 复制代码 表单代码:
复制代码
First Name | Last Name |
---|---|
Model代码:
public class User {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public class UserMapForm { private Map<String, User> users;
public Map<String, User> getUsers() {
return users;
}
public void setUsers(Map<String, User> users) {
this.users = users;
}
} 复制代码 Controller代码:
复制代码
@RequestMapping("saysth.do") public void test(UserMapForm userForm) { for (Map.Entry<String, User> entry : userForm.getUsers().entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " + entry.getValue().getLastName()); } } 复制代码 表单代码:
复制代码
First Name Last Name
打印结果:
x: aaa - bbb y: ccc - ddd z: eee - fff
Map类型作为参数,只需要使用@RequestParam注解即可,这里Map对应的key-value基本是String类型,value可以为Object,代码示例如下所示:
@RequestMapping(value="/map", method=RequestMethod.POST) @ResponseBody public String requestList(@RequestParam Map<String, Object> param) { return "Request successful. Post param : Map - " + param; } 对应Ajax的请求如下:
function postMap() { $.ajax({ type:"POST", url:"http://localhost:8080/Learn-Spring-MVC/map", data:{field1:"field1",field2:1}, dataType:"json", success:function(result) { //...... }, error:function(result) { //...... } }); }
Controller代码如下所示,Controller接收到的参数值均为String类型:
@RequestMapping(value="/request", method=RequestMethod.POST) @ResponseBody public String request(HttpServletRequest arg0, HttpServletResponse arg1) { return "Get request is successful. Post param : param1 - " + arg0.getParameter("param1") + "; param2 - " + arg0.getParameter("param2") + "; param3 - " + arg0.getParameter("param3"); }
对应Ajax请求:
var idList = new Array(); idList.push("1"); idList.push("2"); idList.push("3"); function postTest() { $.ajax({ type:"POST", url:"http://localhost:8080/Learn-Spring-MVC/request", data:{"param1":"test","param2":2,"param3":JSON.stringify(idList)}, dataType:"json", success:function(result) { //...... }, error:function(result) { //...... } }); }
content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。 例如说以下情况:
$.ajax({ url:"/login", type:"POST", data:'{"userName":"admin","pwd","admin123"}', content-type:"application/json charset=utf-8", success:function(data){ alert("request success ! "); } }); 对应的controller代码: @requestMapping("/login") public void login(@requestBody String userName,@requestBody String pwd){ System.out.println(userName+" :"+pwd); }
这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是呢假如我有一个User类,拥有如下字段: String userName; String pwd; 那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上 需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。