>  기사  >  Java  >  SpringMVC가 json 데이터를 수신하고 응답하는 방법 소개(코드 포함)

SpringMVC가 json 데이터를 수신하고 응답하는 방법 소개(코드 포함)

不言
不言앞으로
2019-03-12 15:41:284715검색

이 글은 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>

1. 엔터티 클래스로 수신

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


컨트롤러의 모든 메서드가 json 형식 데이터를 반환해야 하는 경우 @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

Controller(위 Controller는 다음으로 대체 가능):

<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>

콘솔 출력: 현재 http 요청 방법은 다음과 같습니다. POST {bookName=Love,author=Frank}#🎜🎜 #

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제