SpringMVC数据绑定二(自定义数据类型与复杂数据类型对象)
程序员文章站
2022-06-07 18:35:54
...
1、自定义数据类型
实体类:
public class Dog {
private Float weight;
private Integer age;
private String sex;
......(set get 方法)
}
JSP页面:
<label>Ajax</label>
<br>
<label>体重:</label><input type="text" id="dweight" name="weight">
<label>年龄:</label><input type="text" id="dage" name="age">
<label>性别:</label><input type="text" id="dsex" name="sex">
<input type="button" id="subDog" value="提交">
JS中ajax提交方法:
$("#subDog").click(function(){
console.log($("#age").val());
$.ajax({
url:'dog.do',
type:'post',
data:{
weight:$("#dweight").val(),
age:$("#dage").val(),
sex:$("#dsex").val()
},
success:function(){
alert('success');
},
error:function(){
alert('error');
}
});
});
Controller:
@RequestMapping(value="dog.do")
@ResponseBody
public String dogInf(Dog dog){
System.out.println("体重:"+dog.getWeight());
System.out.println("年龄:"+dog.getAge());
System.out.println("性别:"+dog.getSex());
return "";
}
自定义简单数据类型使用ajax传输,并与SpringMVC进行交互数据绑定,其实现与原理都简单易懂,与用名称绑定对应规则类似,就是ajax传递的json数据键值对 key要与后台实体类的属性名称一样。(与后台数据绑定不一定非名称一致可以使用@RequesParam())
可以发现其实自定义数据类型对象绑定比较容易理解。
2、自定义复杂数据类型对象:
实体类:
public class Dog {
private Float weight;
private Integer age;
private String sex;
......(set get 方法)
}
public class UserDog {
private String name;
private Integer age;
private String address;
private Dog dog;
......(set get 方法)
}
JSP页面:
<label>主人姓名:</label> <input type="text" id="name" name="name">
<label>主人年龄:</label> <input type="text" id="age" name="age">
<label>主人地址:</label> <input type="text" id="address" name="address"> <br>
<label>狗的重量:</label> <input type="text" id="dweight" name="dweight">
<label>狗的年龄:</label> <input type="text" id="dage" name="dage">
<label>狗的性别:</label> <input type="text" id="dsex" name="dsex">
<br>
<input type="button" id="subUserDog" value="提交" >
JS中ajax提交方法:
$("#subUserDog").click(function(){
$.ajax({
url:'userdog.do',
type:'post',
contentType:"application/json",
data:JSON.stringify({
name:$("#name").val(),
age:$("#age").val(),
address:$("#address").val(),
dog:{
age:$("#dage").val(),
weight:$("#dweight").val(),
sex:$("#dsex").val()
}
}),
success:function(data){
alert('success');
},
error:function(){
alert('error');
}
});
});
Controller:
@RequestMapping(value="userdog.do")
@ResponseBody
public String userDog(@RequestBody UserDog userDog){
System.out.println("主人姓名:"+userDog.getName());
System.out.println("主人年龄:"+userDog.getAge());
System.out.println("主人地址:"+userDog.getAddress());
System.out.println("狗的重量:"+userDog.getDog().getWeight());
System.out.println("狗的年龄:"+userDog.getDog().getAge());
System.out.println("狗的性别:"+userDog.getDog().getSex());
System.out.println(userDog.toString());
System.out.println("-----------");
return "Y";
}
这里说一下本人在这里遇到了很多坑,复杂类型网上也找了方法也成功,一直是415 不支持的媒体类型,后来引入前端引入接送json2.js或者后台导入Jackson包,突然发现数据绑定成功,后来想了哪个配置文件才是必要的,结果一试配置文件直到注消都可以运行,然后就顺着把导入的jackson包也remove 一切OK,说明上面代码可以顺利执行。
现在说一下上面的要点:
- 这里使用嵌套json字符串需要向后台指明传输的数据类型: contentType:”application/json”;
- 使用js自带支持json函数JSON.stringify(),它的作用是把json对象转化为对应的字符串(说明ajax data参数只能把简单的json对象转为对应的字符串),当然还有一个作用相反把json字符串转为对应的json对象的函数JSON.parse()。
- 关于ajax请求,在Controller中最好有返回值,如果有跳转页面就直接跳转页面,如果没有可以返回字符串(函数上面加注解标记@ResponseBody,来告诉SpringMVC这个返回的不是视图层页面,而是数据。否则有些操作明明后台已经执行结束,却一直进入ajax回调函数error中,通过前端调试发现有一个请求404找不到,就是ajax默认需要一个跳转页面)。
PS:对于上面的复杂自定义数据类型数据绑定,如果不使用ajax就比较方便多了。
实体类:class Dog{……},class UserDog{……}不变,后台Controller代码不变,只需要修改jsp页面即可,同时也不需要ajax代码段。
JSP页面:
<br>
<form action="userdog.do" method="post">
<label>主人姓名:</label> <input type="text" id="name" name="name">
<label>主人年龄:</label> <input type="text" id="age" name="age">
<label>主人地址:</label> <input type="text" id="address" name="address"> <br>
<label>狗的重量:</label> <input type="text" id="dog.weight" name="dog.weight">
<label>狗的年龄:</label> <input type="text" id="dog.age" name="dog.age">
<label>狗的性别:</label> <input type="text" id="dog.sex" name="dog.sex">
<br>
<input type="submit" id="subUserDog">
</form>
这里同样需要注意的是,绑定是根据Form表单里面文本框的属性值name进行绑定的,name值要与UserDog属性值名称一样,对于属性是对象的属性,name值为属性对象名.属性对象的属性(比如:dog.weight).