作者TKB5566 (= =)
看板java
標題Re: [問題] 在Spring,回傳物件給JQuery Ajax回調函數
時間Wed Aug 14 17:05:19 2024
※ 引述《lueichun (= =)》之銘言:
: ※狀況概述:
: 就是我寫的一段測試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物件來使用??
目前我的理解,是在後端若回傳Map物件、且透過某些方法
例如添加@ResponseBody註釋在方法開頭,或使用gson套件將物件轉為json格式......
的話,這個Map物件就會自動被後端轉成json格式物件然後才回傳前端;
jQuery接收到這個json格式物件,會將其自動解析成原生JS物件。
再將其交給JQuery AJAX回呼函數之參數。
那如果從後端回傳的不是map物件,而是arraylist物件,
後端透過@ResponseBody註釋,一樣會將這arraylist物件,自動轉型成json格式物件。
然後這個arraylist版本的json格式物件回到前端,
會被自動解析成js array物件,再轉交給回呼函數的參數。
---------------------------------------
總之,
透過@ResponseBody註釋,就不需要另外添加gson套件,也能自動將java物件轉成
json格式物件;
Map物件就轉成map版本的json格式物件、
arraylist物件就轉成arraylist版本的json格式物件。
然後就回傳到前端了,接著
在前端JQuery這邊,再將各版本的json格式物件,轉型成各自對應型別之js物件。
map版本的json格式物件就轉成js map物件。
arraylist版本的json格式物件就轉成js array物件。
這就是在JQuery AJAX函數中,後端java物件跟前端js物件兩者之間的關係。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.125.132.92 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1723626321.A.C78.html
1F:推 GGing: 其實在 class level 加@RestController 就會自動轉 json了 09/01 15:35
2F:→ GGing: ,效果等同於@Controller + @ResponseBody 09/01 15:35