以下均是在环境配置好的情况下执行
1.基本数据类型及包装类型:
根据文本域的name属性值
jsp表单:
<form action="name.do" method="post">
<label>书名:</label><input type="text" id="bookName" name="bookName">
<label>编号:</label><input type="text" id="bookId" name="bookId">
<label>分类:</label><input type="text" id="bookCategroy" name="bookCategroy">
<label>价格:</label><input type="text" id="bookPrice" name="bookPrice">
<input type="submit" id="subName" value="提交" >
</form>
controller代码:
@RequestMapping(value="name.do")
@ResponseBody
public void nameBimds(String bookName,int bookId,String bookCategroy,float bookPrice){
System.out.println("书名:"+bookName);
System.out.println("分类:"+bookCategroy);
System.out.println("编号:"+bookId);
System.out.println("价格:"+bookPrice);
}
基本数据类型绑定最基本的方法就是jsp表单中文本标签属性name值与后台Controller中函数名称一致,即可完成数据绑定。
但是对于int和float类型的数据,如果前台传值为null或”“,则会出现数据转换异常,前台浏览器提示状态值400 bad request无效的请求,在SpringMVC中很可能就是类型不匹配。在实际开发中可以使用对应的基本数据类型的包装类型:Integer(int),Float(float)
public void nameBimds(String bookName,Integer bookId,String bookCategroy,Float bookPrice){ ......}
自定义变量名(只是在controller中函数参数可以与name值不一致)
前台不变
Controller
@RequestMapping(value="name.do")
@ResponseBody
public void nameBimds(@RequestParam("bookName")String Name,@RequestParam("bookId")Integer Id,@RequestParam("bookCategroy")String Categroy,@RequestParam("bookPrice")Float Price){
System.out.println("书名:"+Name);
System.out.println("分类:"+Categroy);
System.out.println("编号:"+Id);
System.out.println("价格:"+Price);
}
可以发现其实还是指明数据绑定对应规则,即jsp表单值与函数参数值如何一一对应。
大家可以看到在函数前有@ResponseBody,到底什么作用那?在执行这个函数后会跳到一个空白的页面而不是原来的页面(没有写跳转代码),在ajax代码中这个问题就会暴露出来了,也会费解,这里记录一下(网上找的)
Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState):
0-未初始化
1-正在初始化
2-发送数据
3-正在发送数据
4-完成
当XMLHttpRequest.readyState为4时,表示请求已经完成可以得到响应结果。当然success和error方法还是根据响应状态码来触发。当XMLHttpRequest.status为200的时候,表示响应成功,此时触发success().其他状态码则触发error().
除了根据响应状态码外,ajax还会在下列情况下走error方法:
1. 返回数据类型不是JSON
2. 网络中断
3. 后台响应中断
js中ajax代码请求添加提交按钮onclick函数 jsp去掉form标签,否则不能识别函数
function subName(){
$.ajax({
url:'name.do',
type:'post',
data:{
bookName:$("#bookName").val(),
bookId:$("#bookId").val(),
bookCategroy:$("#bookCategroy").val(),
bookPrice:$("#bookPrice").val()
},
success:function(){
alert("success");
},
error:function(){
alert("error");
}
});
}
提交后会发现后台正确执行,前台却执行error函数,挺急人,数据没有错,name就是没有返回正确的状态码200,前台显示状态码400 bad request,这就找到问题所在了,后来查找说是SpringMVC默认是跳转页面的,如果没有指定跳转页面,那么就必须标记@ResponseBody,从而可以返回前台200状态码。
这里在介绍一下@ResponseBody和@RequestBody
@RequestBody
作用:
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
结合上面知识在前台浏览器资源中可以看到200的response 里面有绑定的数据。