이 글은 SpringMVC가 json 데이터를 수신하고 응답하는 방법(코드 포함)을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
Form 양식을 통해 데이터를 제출하는 것 외에도 프런트엔드와 백엔드 간의 데이터 상호작용도 ajax를 통해 json 형식으로 백엔드에 송수신할 수 있습니다(이 방법은 요청 데이터와 백엔드를 분리할 수 있음). 페이지). 이 기사에서는 Spring MVC에서 json 데이터를 수신하고 응답하는 여러 가지 방법을 요약합니다.
준비 단계:
1. json 관련 프레임워크(예: jackson)의 종속성을 가져옵니다.
2. spring mvc의 컨트롤러 메소드는 정상적으로 작성되었습니다. json에 응답해야 한다면 @responsebody 주석을 추가하세요.
3. json에 해당하는 입력 매개변수를 수락하기 전에 @RequestBody 주석을 추가하세요.
서버가 json 데이터를 받아 자바 객체로 복원하는 것을 역직렬화(deserialization)라고 합니다. 반대로 자바 객체를 응답으로 json 데이터로 변환하여 클라이언트에 다시 보내는 것을 직렬화(serialization)라고 합니다.
참고: Ajax를 사용하려면 jQuery를 도입해야 한다는 점 기억하세요!
jackson maven dependency:
<!-- jackson依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.0</version> </dependency>
Background: ajax가 더 많은 매개변수를 전달하면 매개변수 이름 일치가 사용됩니다. 방법은 별로 편리하지 않습니다. 백그라운드에 해당 엔터티 클래스가 있는 경우 클라이언트에서 데이터를 json 형식으로 캡슐화하여 백그라운드로 전달하도록 선택할 수 있으며, 백그라운드에서는 해당 엔터티 클래스를 사용하여 이를 수신합니다.
Client:
<button onclick="clickMe()">点我</button> <script> function clickMe() { $.ajax({ type : 'POST', url : "acceptJsonByEntity", contentType : "application/json;charset=utf-8", // 如果想以json格式把数据提交到后台的话,JSON.stringify()必须有,否则只会当做表单提交 data : JSON.stringify({ "bookId" : 1, "author" : "Jack" }), // 期待返回的数据类型 dataType : "json", success : function(data) { var bookId = data.bookId; var author = data.author; alert("success:" + bookId+','+author); }, error : function(data) { alert("error" + data); } }); </script>
@responseBody 주석은 컨트롤러 메서드에서 반환된 객체를 적절한 변환기를 통해 지정된 형식으로 변환한 후 이를 본문에 쓰는 것입니다. 일반적으로 JSON 데이터 또는 XML을 반환하는 데 사용되는 응답 개체 영역입니다.@RequestBody 주석은 콘텐츠 유형이 기본 application/x-www-form-urlcoded 인코딩이 아닌 콘텐츠를 처리하는 데 일반적으로 사용됩니다. 일반적으로 말하면 application/json 유형을 처리하는 데 일반적으로 사용됩니다.
Controller:
@Controller public class PassJsonParam { @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST) @ResponseBody public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor()); return book; } }
Console 출력: 현재 http 요청 방법은 다음과 같습니다. POST bookId=1, 작성자=Jack
Customer 터미널(팝업 창): 성공:1,Jack
@RestController
주석을 사용할 수 있습니다. @RestController
注解。@RestController = @Controller + @ResponseBody
Controller(上面的Controller可以用下面的替换):
@RestController public class PassJsonParam { @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST) public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor()); return book; } }
注意:使用了@RestController
@RestController = @Controller + @ResponseBody
<form id="bookForm"> <input type="text" name="bookName" id="bookName"> <input type="text" name="author" id="author" > <button onclick="submitForm(event)">提交</button> </form> <script> function submitForm(event) { //阻止form默认事件 event.preventDefault(); //得到搜索框数据 var map = new Map(); $("#bookForm input").each(function () { var value = $(this).val(); //input 值 var name = $(this).attr('name'); map.set(name,value); }) //Map转为Json的方法 var obj= Object.create(null); for (var [k,v] of map) { obj[k] = v; } $.ajax({ type: 'POST', contentType:'application/json', url: "acceptJsonByMap", data: JSON.stringify(obj), dataType: 'json', success: function (data) { var bookName = data.bookName; var author = data.author; alert("bookName ="+bookName+"; author="+author); }, error: function (data) { alert("失败啦"); } }); } </script>
Note: 사용 @RestController에 주석이 추가된 후에는 컨트롤러의 메서드가 더 이상 jsp 페이지나 HTML을 반환할 수 없으며 구성된 뷰 파서가 작동하지 않습니다.
2. 맵으로 수신Background: 프론트 데스크는 ajax 요청을 백그라운드로 보내고 많은 매개변수를 전달하지만 백그라운드에는 수신할 해당 엔터티 클래스가 없습니다. 어떻게 처리하나요? 가장 일반적인 것은 양식으로, 이를 해결하기 위해 맵을 사용하는 것을 고려할 수 있습니다. 맵의 데이터 구조는 키-값 형식이므로 폼 이름을 맵 키로 사용하고 폼 값을 맵 값으로 사용하여 검색 상자 폼을 탐색할 수 있습니다.
클라이언트:@RequestMapping(value="acceptJsonByMap") @ResponseBody public Map<String,Object> acceptJsonByMap(@RequestBody Map<String,Object> paramsMap, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println(paramsMap); return paramsMap; }Controller:
<button onclick="clickHere()">clickHere</button> <script> function clickHere() { var params1 = { "bookId":"123", "author":"Rose" }; var params2 = { "bookId":"321", "author":"Jack" }; var list = []; list.push(params1); list.push(params2); $.ajax({ type: 'POST', contentType:'application/json', url: "acceptJsonByList", data: JSON.stringify(list), dataType: 'json', success: function (data) { for (let i = 0; i < data.length; i++) { var bookId = data[i].bookId; var author = data[i].author; alert("bookId ="+bookId+"; author="+author); } }, error: function (data) { alert("失败啦"); } }); } </script>
Client (팝업 창): bookName =Love;author=Frank
3. 목록 모드에서 수신(json 배열 형식으로 전달됨) Client :
@RequestMapping(value="acceptJsonByList") @ResponseBody public List<Book> acceptJsonByList(@RequestBody List<Book> book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println(book); return book; }참고: 백엔드에 전달될 때 목록은 [{ key1 : value1} { key2 : value2} ]의 json 형식 데이터여야 합니다. 그렇지 않으면 Json 구문 분석 오류가 발생할 수 있습니다.
Controller:
rrreee참고: 여기에서 받으려면 Book 엔터티 클래스가 필요합니다.
Console 출력: 현재 http 요청 방법은 다음과 같습니다. POST [entity.Book@1138a75c,entity.Book@22d1cbcf]
#🎜🎜#Client(팝업 창): bookId = 123 ; 작성자=로즈 bookId =321; 작성자=Jack#🎜🎜##🎜🎜##🎜🎜#위 내용은 SpringMVC가 json 데이터를 수신하고 응답하는 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!