[问题] 在Spring,回传物件给JQuery Ajax回调函数

楼主: lueichun (no anonymous)   2022-03-28 12:37:54
※状况概述:
就是我写的一段测试CODE,可以回传Map或是JSON格式的字串,透过HttpResponse的Body
回传,然后Map和字串被jQuery Ajax的回调函数取得,进而取出Map和字串里面的value。
※程式码:
以下是透过servlet回传一个map:
@RequestMapping(value = "/search/api/getSearchResult.do")
public Map<String,Object> getSearchResultViaAjax(HttpServletRequest request)
{
Map<String,Object> map = new HashMap<>();
String username = request.getParameter("username");
String email = request.getParameter("email");
map.put("username", username);
map.put("email", email);
return map;
}
以下是透过servlet回传json格式字串:
@RequestMapping(value = "/search/api/getSearchResult1.do")
public String getSearchResultViaAjax1(HttpServletRequest request) {
//透过ajax传送query string,直接用getParameter取值
Map<String,Object> map = new HashMap<>();
String username = request.getParameter("username");
String email = request.getParameter("email");
map.put("username", username);
map.put("email", email);
String json = new Gson().toJson(map);
return json;
}
然后map跟json格式字串回传回前端的回调函数:
$.getJSON(
"/TestSpring4Ajax2/search/api/getSearchResult1.do",
$.param(search),
function(data) {
var json = "<h4>Ajax Response</h4><pre>"
+ data.email + "</pre>";
$('#feedback').html(json);
});
※补充说明:
以上的code没有问题可正常执行,但我不懂的是为何java物件传回去后,可以直接当成
JavaScript物件来使用,是jQuery有做什么转换?或是javaScript本身支援这种用法??
我目前知道的是上面那个data物件是JavaScript物件,所以才可以直接用
属性名称来取值(data.email)。然后从servlet回传的又是java物件,看起来就很像是
java物件在回传过程中转换成对应的JavaScript物件,可是这样理解感觉很怪,
请问有更好的理解方式吗??或是说为何可以直接把回调函数的参数,当成一般的
JavaScript物件来使用??
作者: LPH66 (-6.2598534e+18f)   2022-03-28 13:11:00
注意到中间的 .toJson 方法, 它帮你把 Java 物件 map 转成中介的 JSON 格式, 在网络上传递的是这个格式的物件前端的 javascript 收到这个格式后再将其转成 js 的物件$.getJSON 即是前端接收用的函数, 它把 JSON 解码后传进你的 callback 的 data 参数上也就是说, 你的问题在不知道中间有一层中介的 JSON 格式以为是后端的 Java 物件直接变成前端的 JavaScript 物件
作者: ssccg (23)   2022-03-28 14:50:00
https://api.jquery.com/jquery.getjson/文件写的很清楚,data是用$.parseJSON()解析response而来$.get、$.post这些都一样是$.ajax的捷径版,重点在dataType设为'json',不过默认的Intelligent Guess只要server有回适当的content-type header,也是会自动parseJSON你可以试看看$.get(url, function(data) {...}, 'text')和$.get(url, function(data) {...}, 'json') data是什么型别server端的spring如果是@RestController/@ResponseBody,回传值会经过HttpMessageConverter转换,默认的有byte[] →application/octet-stream、String → text/plainResource → 看resource档案种类其他各种物件 → application/json (看classpath上有哪个json library会有不同的默认converter)Map会变成JSON字串是因为有converter,String不会再转换
作者: Benny327   2022-08-28 19:36:00
简单讲就是中间有一个 “JSON格式的字串” 当作中介格式JS和Java都可以转换解析这种字串成为自己的物件

Links booklink

Contact Us: admin [ a t ] ucptt.com