var zTreeCheckName = "";
var zTreeCheckId = "";
var zTreeCheckPid = "";
for(var i=0;i<zTreeCheckObj.length;i++){
if(zTreeCheckObj[i].dictname != null)
zTreeCheckName += (i==zTreeCheckObj.length-1)?zTreeCheckObj[i].dictname:zTreeCheckObj[i].dictname+",";
zTreeCheckId += (i==zTreeCheckObj.length-1)?zTreeCheckObj[i].dictid:zTreeCheckObj[i].dictid+",";
zTreeCheckPid += (i==zTreeCheckObj.length-1)?zTreeCheckObj[i].parentdictid:zTreeCheckObj[i].parentdictid+",";
}
$("#zTreeCheckName").val(zTreeCheckName)
$("#zTreeCheckId").val(zTreeCheckId)
$("#zTreeCheckPid").val(zTreeCheckPid)
var zTreeCheckName = new Array();
var zTreeCheckId = new Array();
var zTreeCheckPid = new Array();
for(var i=0;i<zTreeCheckObj.length;i++){
zTreeCheckName[i]=zTreeCheckObj[i].dictname
zTreeCheckId[i]=zTreeCheckObj[i].dictid
zTreeCheckPid[i]=zTreeCheckObj[i].parentdictid
}
$("#zTreeCheckName").val(zTreeCheckName)
$("#zTreeCheckId").val(zTreeCheckId)
$("#zTreeCheckPid").val(zTreeCheckPid)
后端接收到的数据完全一样:字符串,中间用逗号隔开,外面没有括号包围。
EL表达式获取数据:后端发送数据,前端接收,在html代码块中直接用${xxx}获取,因为默认是文本;在js代码块(即<script></script>)中获取需要用引号包围"${xxx}",因为没有引号,会把它当做一个变量,但因为这个变量没有声明过,所以会报is not defined。
例如后端发送字符串"tony"到前端,request.setAttribute("name","tony")
前端js代码块里,${name}接收到了tony,但会报tony未定义。需要用引号包围它,即"${name}"。
后端发送json格式字符串,在前端的js代码块中用${xxx}接收到的是对象,而非字符串。不需要引号包围。如图
图中json2和json3的区别,json2在前端接收如果没用引号包围如"${json2}"会报obj1 is not defined。json3无需引号包围,接收到的数据会被直接解析为数组。如右图。
list和map都会报错。
list报abc is not defined。map报Invalid shorthand property initializer
报错Invalid shorthand property initializer,是因为json里冒号写成了等号等其他符号。
{'xxx'='xxx','xxx'='xxx'}
后端发送json格式字符串,ajax中默认接收到的是字符串(默认text)。需要用JSON.parse()转成json对象,或者指定dataType:"json"(底层jquery会调用jQuery.parseJSON(json))
response.getWriter().write("{\"message\":\"用户名可用\",\"flag\":true}")
1)$.get(url, [data], [callback], [type])
2)$.post(url, [data], [callback], [type])
url:代表请求的服务器端地址
data:代表请求服务器端的数据(可以是key=value形式也可以是json格式)
callback:表示服务器端成功响应所触发的函数(只有正常成功返回才执行)
type:表示服务器端返回的数据类型(jquery会根据指定的类型自动类型转换)
常用的返回类型:text、json、html等
3)$.ajax( { option1:value1,option2:value2... } );
常用的option如下:
async:是否异步,默认是true代表异步
data:发送到服务器的参数,建议使用json格式
dataType:服务器端返回的数据类型,常用text和json
success:成功响应执行的函数,对应的类型是function类型
type:请求方式,POST/GET
url:请求服务器端地址
$.get()和$.post()的区别:使用起来基本没区别。发送的值含有中文时,若$.get()发送,后端需先编码后解码(即getBytes("iso8859-1"),new String(bytes,"UTF-8")),若$.post()发送,后端不会乱码,不需要request.setCharaterEncoding("UTF-8"),因为jquery底层已经处理了。
var jsonObject = new Object();
jsonObject.name = "jack";
jsonObject.phone = "13879013334";
jsonObject.id = "asdghj";
$.ajax({
type:"POST",
url: "${pageContext.request.contextPath}/ajax",
//contentType: "application/json", //用request.getParameter()获取 不需要写这个 因为写了post类型,默认application/x-www-form-urlencoded,会从请求body中找
dataType: "json", //服务器返回的数据类型。可以写json,也可以写text 有时候后台发过来的json格式字符串会有问题,如BOM头,用json会拿不到数据,需要用text来测试
data: jsonObject, //发送到服务器的参数,直接用json对象。因为contentType没有用"application/json"就不需要用JSON.stringify(jsonObject)转字符串,
success: function (data) {
console.log(data)
},
error: function (data){
alert("解析数据失败!");
}
});
后端发送json字符串到前端ajax,要使用严格的JSON格式!!!{"key1":value,"key2":value}
后端发送json格式字符串"{'message':'用户名可用','flag':true}",前端ajax的dataType: "json"时,进入error函数,无法解析json。
在java中,需要转义。str="{\"key\":value,\"key\":value}";
response.setContentType("text/html;charset=UTF-8")与response.setContentType("application/json;charset=UTF-8")在这里没有影响
总结:
ajax传json对象,$.ajax()不配置contentType:"application/json"
ajax传json字符串,$.ajax()需配置contentType:"application/json"
ajax用1传,后端用request.getParameter()接收。
ajax用2传,后端用request.getReader()接收,在springMVC中用@RequestBody。
详细内容见下面
springMVC使用@RequestBody接收json数据时符合总结2,$.ajax()需要传json字符串,@RequestBody才能解析。若不用@RequestBody,用request.getParameter()来接收,则$.ajax()传json对象。
若form表单提交json对象,需将对象转成字符串(即序列化),不然即使用request.getReader()获取的也是object字符。
若ajax提交,可以直接提交json对象(注意:$.ajax()中不要指定contentType: "application/json",不然后端获取为null,原因见《SpringMVC中使用Ajax请求以json格式返回null值》)。
后端获取值方法1:
request.getParameter("username");request.getParameter("password");
request.getParameter("phone");request.getParameter("id");
后端获取值方法2:
BufferedReader reader = request.getReader();
StringBuffer sb = new StringBuffer();
String line = null;
while((line=reader.readLine())!=null){
sb.append(line);
}
ajax发送json对象的话,无论有没设置contentType:"application/json",都可以用方法2获取到值。获取到的值是这样:name1=xxxxxx&age1=13&price1=4000
ajax发送json字符串(即JSON.stringify(obj))的话,用方法2获取到的是这样:{"name1":"xxxxxx","age1":13,"price1":4000}。前提是需要设置contentType:"application/json",不然reader字符流读不到内容。
联系客服