SpringMVC和AJAX交互
在实际开发中我们经常需要前后台交互,那么springmvc与ajax之间交互这里记录下在实际开发中遇到的细节问题。
jsp页面:
<fieldset id="login" style="width:600px; border:1px solid #000;border-left:none;border-right:none">
<legend style="">用户登录</legend>
<p align="center">账号:<input type="text" name="username" /></p>
<p align="center">密码:<input type="password" name="password" /></p>
<p align="center"><input type="submit" id="submit1" value="登录" /></p>
</fieldset>
ajax请求如下:
<script type="text/javascript">
$(function() {
$("#submit1").click(function() {
var json = {
'username':$(':input[name=username]').val(),
'password':$(':input[name=password]').val()
};
//json字符串 {"username":"admin","password":"123456"}
var postdata = JSON.stringify(json);//json对象转换json字符串
alert(postdata);
$.ajax({
type : 'POST',
contentType : 'application/json',//注意类型
/**
*(默认: true) 默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),
* 都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。
* 如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
*/
processData : false,
url : '<%=path%>/databind/requestbodybind',
dataType : 'json',
data : postdata,
success : function(data) {
alert('username : '+data.username+'\npassword : '+data.password);
},
error : function() {
alert('error...');
}
});
});
});
</script>
tip:我们可以看到在用contentType : ‘application/json’发起请求,data我们传的是一个json字符串,而不是json对象,一开始我也认为是可以的,结果不行,直接传对象报错,不妨亲自试试。
SpringMVC需要提供的方法如下:
@RequestMapping(value="requestbodybind", method = {RequestMethod.POST})
@ResponseBody
public Account requestBodyBind(@RequestBody Account account){
System.out.println("requestbodybind:" + account);
return account;
}
那还是contentType : ‘application/json’发起的请求,我们能不能用如下的方式接收值呢
@RequestMapping(value="json", method = {RequestMethod.POST})
@ResponseBody
public Account json(String username, String password){
Account account = new Account();
account.setUsername(username);
account.setPassword(password);
return account;
}
答案是不可以的,会抛异常,400 Bad Request
究其原因是:contentType : ‘application/json’数据发送后台接收必须是Modle,不能是单个属性,且必须加上@RequestBody注解。
如果我们把contentType换成默认的contentType : ‘application/x-www-form-urlencoded’呢,前后台又该怎么写?
ajax写法如下:
$(function(){
$("#submit").click(function(){
$.ajax({
type: "POST",
/* contentType : 'application/x-www-form-urlencoded',*/
url: '<%=path%>/databind/json',
dataType: "json",
data: {username:$('#username').val(),
password:$('#password').val()},
success: function(data){
alert('username : '+data.username+'\npassword : '+data.password);
}
});
});
});
这里不得不提下,虽然data这里看起来传的是一个json对象,但由于使用了application/x-www-form-urlencoded,最终可以通过firebug可以看到,其实最终传过去的还是username=admin&password=123456,当然你也可以直接传字符串过去,但是有一点要注意,真实项目中字段还是特别多的,这样拼接会相当繁琐,然而我们知道还有个方法供我们使用,jQuery给我们提供的$(“#login”).serialize()序列化表单。
$(function(){
$("#submit").click(function(){
var params = $("#login").serialize();//序列化表单
alert(params);
$.ajax({
type: "POST",
url: '<%=path%>/databind/json',
dataType: "json",
data: params,
success: function(data){
alert('username : '+data.username+'\npassword : '+data.password);
}
});
});
});
后台接收方式如下:
@RequestMapping(value="json", method = {RequestMethod.POST})
@ResponseBody
public Account json(String username,String password){
Account account = new Account();
account.setUsername(username);
account.setPassword(password);
return account;
}
那这里要提出一个疑问,如果我需要接受的字段特别多呢,难道我在方法中也需要一个一个参数的去写嘛,比如有20个,还不得累死。
答案是当然啦
@RequestMapping(value="/json", method = {RequestMethod.POST})
@ResponseBody
public Account json(Account account){
System.out.println(account);
return account;
}
此外,这里不得不提一件事情,很多人一看到要拿model接收传参,就想着应该是不是应该加上@RequestBody注解,springmvc才会帮你把相关值封装到model里面去,我在这里告诉你,千万不要这样想,这个注解不是随便就用的,它的用途是帮你转换json->model、 xml->model,你好好的表单提交,用的contentType:application/x-www-form-urlencoded,何必画蛇添足加上这个注解呢。
总结:
<script type="text/javascript">
$(function() {
$("#submit1").click(function() {
var json = {
'username':$(':input[name=username]').val(),
'password':$(':input[name=password]').val()
};
//json字符串 {"username":"admin","password":"123456"}
var postdata = JSON.stringify(json);//json对象转换json字符串
alert(postdata);
$.ajax({
type : 'POST',
contentType : 'application/json',
/**
*(默认: true) 默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),
* 都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。
* 如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
*/
processData : false,
url : '<%=path%>/databind/requestbodybind',
dataType : 'json',
data : postdata,
success : function(data) {
alert('username : '+data.username+'\npassword : '+data.password);
},
error : function() {
alert('error...');
}
});
});
});
</script>
以上$.ajax()中 contentType : 'application/json',则data必须转换为json对象且后台方法参数必须用model接受,否则报400错误,则后台接受参数为:
@RequestMapping(value="requestbodybind", method = {RequestMethod.POST})
@ResponseBody
public Account requestBodyBind(@RequestBody Account account){
System.out.println("requestbodybind:" + account);
return account;
}
默认$.ajax()中的contentType:'application/x-www-form-urlencoded'发送的数据格式为“xx=yy&uu=ii”data数据不是json对象,它是发送信息至服务器时内容编码类型。
如下$.ajax()没有写contentType则默认类型为'application/x-www-form-urlencoded',则data传递的参数类型为单个属性.
function initArrivePerson(divId) {
var jqids = $("#jqid").val();//获得警情id
$.ajax({
type:"post",
url:basePath + "kscj/findArrivePerson.do",
data:{"jqid":jqids},
dataType:"json",
async: false,
cache:false,
success : function(data) {
$("#"+divId).html("");
var arrivePerson="";
for (var i=0;i<data.length;i++) {
arrivePerson+="<span>";
arrivePerson+="<input type=\"checkbox\" name=\"cjrxm\" value=\'"+data[i].sjybh+"\'/><span>"+data[i].sjyxm+"</span>";
arrivePerson+="<input type=\"hidden\" name=\"cjdbh\" value=\'"+data[i].cjdbh+"\'/>";
arrivePerson+="</span>";
}
$("#"+divId).append(arrivePerson);
}
});
}
则后台接受参数为:
@RequestMapping(value = "/findArrivePerson", produces = {"application/json;charset=UTF-8"})
@ResponseBody
public List<TItmpTcsDisposal> findArrivePerson(HttpServletRequest req, HttpServletResponse resp, String jqid){
List<TItmpTcsDisposal> arriveList = titmpGpsLocateinfoService.findNoRepeat(jqid);
return arriveList;
}
补充:
什么时候该用@RequestParam注解,什么时候不该用
前面我们已经看到了,接受单个基本类型值的参数,只要在方法中分别写下,并且并不需要使用什么注解就能拿到传过来的值,那为什么还有@RequestParam这个注解呢,并且看到很多地方都在用。
其实呢这个注解,有它的用处,并不是一无是处,首先作为基本类型的参数,如果不使用注解,是可传可不传的,如果为null并不会报错,但当你使用了@RequestParam注解,那么此时该参数就是必传的了,如果不传就会报错,然而还是可以通过配置来让其可不必传,如@RequestParam(value=”username”, required=false),此外,该注解还可以设置如果前台没有传值过来,会给一个默认值,如@RequestParam(value=”username”, defaultValue=”ruo”)。
我对该注解做的总结是:如果你某个参数不是必传的,就别用它了,如果是必传的,请一定用上它,如果必传参数可以有默认值的话,还请加上defaultValue默认值。
博客原文:https://blog.csdn.net/u014079773/article/details/52984747
SpringMVC和AJAX交互的更多相关文章
- SpringMVC与Ajax交互
1 springmvc和ajax的交互 1.1 请求字符串响应json 客户端发送的数据:key=value&key1=value1 响应回来:json 1.1.1json的支持jar包 1 ...
- springmvc与ajax交互常见问题
这是我个人再编写博客系统的时候,因个人疏忽犯下的低级错误. 不过犯错是一件好事,有助于总结. 1.关于参数前加@RequestBody 如果是使用ajax交互时,必须要加上这个contentType: ...
- content-type常见类型辨析(以ajax与springmvc前后端交互为例)
博客搬家: content-type常见类型辨析(以ajax与springmvc前后端交互为例) 在http报文的首部中,有一个字段Content-type,表示请求体(entity body)中的数 ...
- springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传
总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...
- springmvc实现json交互 -requestBody和responseBody
json数据交互 1.为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. 2. ...
- SpringMVC实现AJax以及RestFull风格
RestFull风格就是url路径中不能出现?不能带参数,如https://www.baidu.com/user/item/1234这个格式,也叫url资源定位 1.需要在web.xml中开启put, ...
- ThinkPHP中使用ajaxReturn进行ajax交互
以管理员登录为例来介绍下$this->ajaxReturn与模板页进行ajax交互使用方法 首先看PHP控制器的处理,在application/Admin/Controller/LoginCon ...
- struts2 的验证框架validation如何返回json数据 以方便ajax交互
struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror />才能取出,(EL应该也可以). 如果使 ...
- SpringMVC——对Ajax的处理(包含 JSON 类型)
一.首先要搞明白的一些事情. 1.从客户端来看,需要搞明白: (1)要发送什么样格式的 JSON 数据才能被服务器端的 SpringMVC 很便捷的处理,怎么才能让我们写更少的代码,如何做好 JSON ...
随机推荐
- 如何使用classnames模块库为react动态添加class类样式
摘要 在react中添加动态的css时,传统的方式较为繁琐,今天刚好学习到一个模块库可以便捷的解决这个问题.对的,它就是“classnames”. classnames模块库 npm安装 npm in ...
- PHP 多维数组将下标从0开始
点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5645xiw 欢迎大家加入,一起讨论学习 模拟一个: public function ...
- MYSQL WHERE语句
过滤条件(WHERE) 如果你失忆了,希望你能想起曾经为了追求梦想的你. QQ群:651080565(php/web 学习课堂) 例子:淘宝首页上,我们会看到很多个商品,但这些商品,并不是 ...
- 14.SpringMVC核心技术-类型转换器
类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...
- 发现护考上机考试的一个bug:附软件截图(模拟软件)
目录: 一.文章主旨 二.问题发现的起因 三.bug(问题)描述 四.软件截图 五.我的思考 六.一点期盼 一.文章主旨: 2019年5月18.19.20日,又是一年一度的护资考试(上机考),考试前夕 ...
- springboot Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
报错如下: 在请求目标中发现无效字符.有效字符在RFC 7230和RFC 3986中定义. 原因是Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证. 就是 ...
- mmap:内存映射文件
介绍 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据. 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独 ...
- PAT Basic 1082 射击比赛 (20 分)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- python+selenium之——pip环境变量配置
将pip的路径……\Python37-32\Scripts添加进Path: 而非……\Python37-32\Lib\site-packages\pip-18.1-py3.7.egg
- 关于网站子目录绑定二级域名的方法(php网站手机端)
最近帮客户做zencart网站手机模板用到了二级域名,通过判断手机访问来调用二级目录程序,http://afish.cnblogs.com/ 怎么说都比 http://www.cnblogs.com/ ...