[java] @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로 개체를 만들지 않고도 일부 매개 변수를 목록 또는 배열에 바인딩하는 구문이 있습니까?
감사
답변
의 배열 @RequestParam
은 동일한 이름의 여러 매개 변수를 바인딩하는 데 사용됩니다.
myparam=myValue1&myparam=myValue2&myparam=myValue3
@ModelAttribute
-스타일 인덱스 매개 변수 를 바인딩해야한다면 @ModelAttribute
어쨌든 필요하다고 생각 합니다.
답변
또는 그렇게 할 수 있습니다.
public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
....
}
예를 들어 다음과 같은 양식에서 작동합니다.
<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />
이것은 가장 간단한 해결책입니다. 🙂
답변
Donal Fellows가 말한 것을 보완하기 위해 @RequestParam과 함께 List를 사용할 수 있습니다.
public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
....
}
도움이 되었기를 바랍니다.
답변
method = RequestMethod.GET
사용할 수 있다면 질문 자체에 대한 의견에서 basil이 말한 내용을 구독하십시오 @RequestParam List<String> groupVal
.
그런 다음 매개 변수 목록으로 서비스를 호출하는 것은 다음과 같이 간단합니다.
API_URL?groupVal=kkk,ccc,mmm
답변
이를 달성 할 수있는 한 가지 방법 (해킹 방식으로)은 List
. 이렇게 :
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'
답변
Collection을 요청 매개 변수로 받아 들일 수는 있지만 소비자 측에서는 컬렉션 항목을 쉼표로 구분 된 값으로 전달해야 한다는 것이 분명하지 않았습니다 .
예를 들어 서버 측 API가 다음과 같은 경우 :
@PostMapping("/post-topics")
public void handleSubscriptions(@RequestParam("topics") Collection<String> topicStrings) {
topicStrings.forEach(topic -> System.out.println(topic));
}
아래와 같이 RequestParam으로 RestTemplate에 컬렉션을 직접 전달 하면 데이터가 손상됩니다.
public void subscribeToTopics() {
List<String> topics = Arrays.asList("first-topic", "second-topic", "third-topic");
RestTemplate restTemplate = new RestTemplate();
restTemplate.postForEntity(
"http://localhost:8088/post-topics?topics={topics}",
null,
ResponseEntity.class,
topics);
}
대신 사용할 수 있습니다.
public void subscribeToTopics() {
List<String> topicStrings = Arrays.asList("first-topic", "second-topic", "third-topic");
String topics = String.join(",",topicStrings);
RestTemplate restTemplate = new RestTemplate();
restTemplate.postForEntity(
"http://localhost:8088/post-topics?topics={topics}",
null,
ResponseEntity.class,
topics);
}
완전한 예는 여기 에서 찾을 수 있습니다. 누군가 두통을 덜어주기를 바랍니다. 🙂
답변
아래와 같이 확인란 토글로 숨겨진 필드 값을 변경하십시오.
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');
}
}