Ajax에서 Controller에 배열(array)을 보낼 때
Ajax 옵션으로 traditional: true 를 넣으면 된다는 글들을 많이 봤는데...(사실 그냥 본 것중에는 전부 다...)
이 옵션 없이도 성공해서 두 방법 모두 가져왔다.
방법1. traditional: true 옵션을 준 경우
javascript
var arr = {1, 2, 3}
$.ajax({
type : 'post',
url : '리퀘스트 매핑 값',
data : {arr : arr},
dataType : 'json',
traditional: true,
error: function(xhr, status, error){
// 실패했을 때 처리
},
success : function(data){
// 성공했을 때 처리
}
});
Controller.java
1. @RequestParam의 value로 "arr"로 받는 것 유의
2. @RequestParam 없이 그냥 int[] arr 도 가능!
@RequestMapping(value = "리퀘스트 매핑 값", method = RequestMethod.POST)
@ResponseBody
public 리턴값 함수명(@RequestParam(value="arr") int[] array) {
return 리턴할 것;
}
방법2. traditional: true 옵션을 안 준 경우 (기본값 traditional: false 의 경우)
javascript
var arr = {1, 2, 3}
$.ajax({
type : 'post',
url : '리퀘스트 매핑 값',
data : {arr : arr},
dataType : 'json',
error: function(xhr, status, error){
// 실패했을 때 처리
},
success : function(data){
// 성공했을 때 처리
}
});
Controller.java
1. @RequestParam의 value로 "arr[]"로 받는 것 유의!! ([] 없이 arr로 받으면 400에러 발생)
2. 그냥 int[] arr 로는 못받음!! (null로 받아요)
@RequestMapping(value = "리퀘스트 매핑 값", method = RequestMethod.POST)
@ResponseBody
public 리턴값 함수명(@RequestParam(value="arr[]") int[] array) {
return 리턴할 것;
}
traditional 옵션이란 직역해서 "전통적인 스타일의 파라미터 직렬화를 사용하냐 마느냐를 결정"하는 것이다.
(JQuery 1.4 이전까지 traditional style을 사용한 것 같고, 그 이후부터 traditional: fasle를 기본값으로 하고 원하면 설정하는 걸로..)
전통적인 방식은(traditional: true) arr=1&arr=2&arr=3 이렇게 파라미터가 넘어가고,
전통적이지 않은 방식은(traditional: false) arr[]=1&arr[]=2&arr[]=3 이렇게 파라미터가 넘어간다고 한다.
(출처: jQueay API 문서/jQuery.param)
그래서 @RequestParam으로 받을 때 value부분에 []를 추가하냐 마느냐의 차이가 있었던 것 같다.
그래서 traditional: false일 때
1. @RequestParam의 value로 arr로 받으면 당연히 값은 arr[]로 넘어와 arr라는 파라미터가 없으니 @RequestParam의 required 속성의 기본값은 true이므로 400에러를 발생시킨 것 같다.
2. int[] arr 로 못받았던 이유 역시 1번과 동일하게 arr라는 이름의 파라미터가 들어오지 않아서 null값이 들어온 것 같다!
혹시 틀린 부분이 있다면 댓글 달아주시면 감사하겠습니다!!
'프로그래밍 언어 > JavaScript' 카테고리의 다른 글
[JQuery] check box 관련 함수 (+배열 값 가져오기) (0) | 2022.07.07 |
---|---|
iframe 확대/축소 구현 (with Panzoom) (0) | 2022.07.05 |