복붙노트

[SPRING] Spring 3 MVC - 고급 데이터 바인딩 - 간단한 객체 목록으로 폼 요청

SPRING

Spring 3 MVC - 고급 데이터 바인딩 - 간단한 객체 목록으로 폼 요청

스프링 3 웹 문서 (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-web.html)를 모두 읽었지만 완전히 끝내지 못했습니다. 더 복잡한 요청 데이터 바인딩에 대한 흥미로운 문서를 찾으십시오. 예를 들어 jQuery를 사용하여 다음과 같이 컨트롤러에 게시한다고 가정 해 봅시다.

$.ajax({
    url: 'controllerMethod',
    type: "POST",
    data : {
        people : [
        {
            name:"dave", 
            age:"15"
        } ,
{
            name:"pete", 
            age:"12"
        } ,
{
            name:"steve", 
            age:"24"
        } ]
    },
    success: function(data) {
        alert('done');
    }
});

컨트롤러를 통해이를 어떻게 수락 할 수 있습니까? 가급적 맞춤형 개체를 만들지 않고도 간단한 데이터 형식을 사용할 수있을 것입니다. 그러나 개체를 더 간단하게 만들려면 맞춤 개체가 필요한 경우에도 마찬가지입니다.

시작하려면 다음과 같이하십시오.

@RequestMapping("/controllerMethod", method=RequestMethod.POST)
public String doSomething() {
    System.out.println( wantToSeeListOfPeople );
}

이 질문에 대한 응답에 대해 걱정하지 마십시오. 내가 관심을 갖는 것은 요청을 처리하는 것입니다. 응답을 처리하는 방법을 알고 있습니다.

편집하다:

더 많은 샘플 코드가 있지만 작동시키지 못하면 어떻게 되나요?

자바 스크립트를 선택하십시오 :

var person = new Object();
    person.name = "john smith";
    person.age = 27;

    var jsonPerson = JSON.stringify(person);

    $.ajax({
        url: "test/serialize",
        type : "POST",
        processData: false,
        contentType : 'application/json',
        data: jsonPerson,
        success: function(data) {
            alert('success with data : ' + data);
        },
        error : function(data) {
            alert('an error occurred : ' + data);
        }
    });

컨트롤러 방법 :

public static class Person {

        public Person() {
        }

        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        String name;
        Integer age;

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @RequestMapping(value = "/serialize")
        @ResponseBody
        public String doSerialize(@RequestBody Person body) {
            System.out.println("body : " + body);
            return body.toString();
        }

이 경우 다음 예외가 렌더링됩니다.

doSerialize () 메서드가 Person과 반대로 String을 사용하면 요청은 성공하지만 String은 비어 있습니다.

해결법

  1. ==============================

    1.jQuery ajax 호출은 다음 application / x-www-form-urlencoded 요청 본문을 생성합니다 (%로 인코딩 된 형식).

    jQuery ajax 호출은 다음 application / x-www-form-urlencoded 요청 본문을 생성합니다 (%로 인코딩 된 형식).

    people[0][name]=dave&people[0][age]=15&people[1][name]=pete&people[1][age]=12&people[2][name]=steve&people[2][age]=24
    

    스프링 MVC는 숫자로 인덱싱 된 속성을 목록으로 매핑하고 문자열로 색인화 된 속성을지도에 바인딩 할 수 있습니다. @RequestParam은 복합 유형을 지원하지 않으므로 여기에 사용자 정의 객체가 필요합니다. 그래서, 당신은 :

    public class People {
        private List<HashMap<String, String>> people;
    
        ... getters, setters ...
    }
    
    @RequestMapping("/controllerMethod", method=RequestMethod.POST)        
    public String doSomething(People people) {        
        ...
    } 
    

    또한 보존 (Bozho)이 제안한대로 데이터를 보내기 전에 JSON으로 데이터를 직렬화하고 @RequestBody를 사용할 수 있습니다. mvc-showcase 샘플에서이 접근법의 예를 찾을 수 있습니다.

  2. ==============================

    2.가 활성화 된 경우 :

    가 활성화 된 경우 :

    @RequestMapping("/controllerMethod", method=RequestMethod.POST)
    public String doSomething(@RequestBody List<Person> people) {
        System.out.println( wantToSeeListOfPeople );
    }
    

    (List 은 여러분이 얻고 자하는 구조가 아닐 수도 있습니다.

    즉시 작동하지 않으면 $ .ajax의 Content-Type을 application / json으로 설정할 수 있습니다.

  3. ==============================

    3.Jackson의 스프링 통합을 살펴보십시오. 그것은 사용하기 쉽고 강력합니다.

    Jackson의 스프링 통합을 살펴보십시오. 그것은 사용하기 쉽고 강력합니다.

    이 문제를 안내 할 수있는 SO에 관한 질문 / 답변 : jackson 메시지 변환기를 사용하여 JSON 응답을 만드는 Spring 3.0

  4. from https://stackoverflow.com/questions/3566201/spring-3-mvc-advanced-data-binding-form-request-with-list-of-simple-objects by cc-by-sa and MIT license