복붙노트

[SPRING] @RequestParam에리스트 바인딩하기

SPRING

@RequestParam에리스트 바인딩하기

이런 식으로 양식의 매개 변수를 보내고 있습니다.

myparam[0]     : 'myValue1'
myparam[1]     : 'myValue2'
myparam[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 
...

매개 변수를 추가하여 컨트롤러 메서드에서 모든 매개 변수를 가져올 수 있음을 알고 있습니다.

public String controllerMethod(@RequestParam Map<String, String> params){
    ....
}

매개 변수 myParam [] (다른 것들은 제외)을리스트 나 배열 (인덱스 순서를 유지하는 모든 것)에 바인딩하려고합니다. 그래서 다음과 같은 구문을 시도했습니다 :

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
    ....
}

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
    ....
}

그러나 그들 중 누구도 myParams를 구속하고 있지 않습니다. 지도에 값을 추가하더라도 매개 변수를 바인딩 할 수 없습니다.

public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
    ....
}

목록 속성이있는 @ModelAttribute와 같은 객체를 만들지 않고 일부 매개 변수를 목록이나 배열에 바인딩하는 구문이 있습니까?

감사

해결법

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

    1.@RequestParam의 배열은 같은 이름의 여러 매개 변수를 바인딩하는 데 사용됩니다.

    @RequestParam의 배열은 같은 이름의 여러 매개 변수를 바인딩하는 데 사용됩니다.

    myparam=myValue1&myparam=myValue2&myparam=myValue3
    

    @ ModelAttribute 스타일의 인덱싱 된 매개 변수를 바인딩해야한다면 @ModelAttribute가 필요하다고 생각합니다.

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

    2.아니면 그냥 그렇게 할 수 있습니다 :

    아니면 그냥 그렇게 할 수 있습니다 :

    public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
        ....
    }
    

    예를 들어 다음과 같은 형태로 작동합니다.

    <input type="checkbox" name="myParam[]" value="myVal1" />
    <input type="checkbox" name="myParam[]" value="myVal2" />
    

    이것은 가장 간단한 해결책입니다 :)

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

    3.Donal Fellows가 말한 것을 보완하면서 @RequestParam과 함께 List를 사용할 수 있습니다.

    Donal Fellows가 말한 것을 보완하면서 @RequestParam과 함께 List를 사용할 수 있습니다.

    public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
    ....
    }
    

    희망이 도움이됩니다!

  4. ==============================

    4.이것을 달성 할 수있는 한 가지 방법은 목록에 대한 래퍼 클래스를 만드는 것입니다. 이렇게 :

    이것을 달성 할 수있는 한 가지 방법은 목록에 대한 래퍼 클래스를 만드는 것입니다. 이렇게 :

    class ListWrapper {
         List<String> myList; 
         // getters and setters
    }
    

    그러면 컨트롤러 메소드 서명은 다음과 같습니다.

    public String controllerMethod(ListWrapper wrapper) {
        ....
    }
    

    요청에서 전달하는 컬렉션 이름이 래퍼 클래스의 컬렉션 필드 이름과 일치하는 경우 @RequestParam 또는 @ModelAttribute 주석을 사용할 필요가 없습니다. 예를 들어 요청 매개 변수는 다음과 같아야합니다.

    myList[0]     : 'myValue1'
    myList[1]     : 'myValue2'
    myList[2]     : 'myValue3'
    otherParam    : 'otherValue'
    anotherParam  : 'anotherValue'
    
  5. ==============================

    5.Requests가 RequestMethod.GET 인 경우 @RequestParam List groupVal을 사용할 수 있습니다.

    Requests가 RequestMethod.GET 인 경우 @RequestParam List groupVal을 사용할 수 있습니다.

    그런 다음 매개 변수 목록을 사용하여 서비스를 호출하는 것은 다음과 같이 간단합니다.

    API_URL?groupVal=kkk,ccc,mmm
    
  6. ==============================

    6.아래처럼 체크 박스 토글로 숨겨진 필드 값 변경 ...

    아래처럼 체크 박스 토글로 숨겨진 필드 값 변경 ...

    HTML :

    <input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
    <input type="checkbox"  onclick="toggle(this)"/> Delete All
    

    스크립트:

    function toggle(obj) {`var $input = $(obj);
        if ($input.prop('checked')) {
    
        $('#deleteAll').attr( 'value','Checked');
    
        } else {
    
        $('#deleteAll').attr( 'value','Unchecked');
    
        }
    
    }
    
  7. from https://stackoverflow.com/questions/4596351/binding-a-list-in-requestparam by cc-by-sa and MIT license