애초에 데이터를 올릴 때 jsonObject가 아닌 jsonObjectString으로 올려본다.
var form = {"param" : thisParam} ; 이렇게 변수에 담고 ajax data에 문자열을 올려본다.
JSON.stringify( )메서드가 jsonObject를 jsonObjectString로 바꾸는데 완벽한 문자열로 바꿔준다.
크롬 - network 에서 All로 열어서 확인해본다. error가 나오는데 인코딩이 잘못 되었기 때문이다. jsonObjectString이 더블코테이션(")을 읽지 못했기 때문이다. 왜냐하면 ajax는 아무것도 안써주면 자동으로 get방식이다. get방식은 특수문자를 읽지 못한다.
post방식으로 적어주면 error부분이 사라졌다.
post방식으로 바뀌면 개발자도구에 있는 Form Data(body)부분에 더블코테이션과 문자열이 적혀있다. Form Data는 body부분이다.
Form data는 키를 보고 벨류가 안 넘어가고 있다. 벨류를 받게 하려면 어떻게 할까? controller에 getParameterNames를 사용해준다. Emumeration name = request.getParameterNames; 라고 적어주면 name으로 키를 사용해 벨류 값을 뽑을 수 있다. 그리고 while문을 통해서 키를 뽑아낸다. 마치 키를 벨류처럼 사용해준다.
jsonObject는 데이터 포맷 중에 하나다. (예를 들어 html포맷, json포맷처럼) childSelectBox가 void타입인 이유는 리턴타입이 필요없기 때문이다.
AJAX는 호출한 곳에서 호출한 곳으로 데이터를 전달하기 때문에 특정 주소가 있는 리턴을 보낼 필요가 없다.
1번. hashMap인스턴스를 생성해서 원하는 값을 뺄 수 있게 했다.
2번. submit( )방식이 get방식이면 한글처리가 안되서 server.xml에서 한글처리를 해줬다. json은 톰켓 쪽이 아니여서 한글처리를 따로 해주어야 한다. utf-8세팅은 항상 위쪽에 있어야 한다.
3번. resquest는 화면에서 보내는 것이고 response는 화면에 파라미터를 내린다(받는다).
submit통신은 뷰가 모델과 논리적 주소를 받아서 처리하지만 ajax는 모델이 아닌 response가 내려준다. 예를들어, 모델로 받을때 model.addAttribute를 사용한 것처럼 response 메서드를 사용한 것이다.
PrintWriter out = response.getWriter( ); PrintWriter는 리턴타입이다.
콘솔에 resultMap에서 put( )로 뽑은 값은 AJAX전처리때문에 쿼리스트링 형식으로 나온다.
*response로 내려주면 View가 아니라 mappingJacksonHttpMessageConverter가 받는다. mappingJacksonHttpMessageConverter는 종류가 많다. 우리가 response를 이용해서 내리면 수많은 if문이 있다. 예를 들어, http만 받는 애도 있고
if문에 모델이면 뷰가 받고 또 if else해서 response는 mappingJacksonHttpMessageConverter이 받는다.
그런데 개발할 때는 파라미터를 많이 보내면 안된다. 파라미터는 1개정도 보내는 것이 제일 좋다. apply함수를 안 쓰면 파라미터를 여러 개 써야하지만 쓰면 최소의 파라미터를 쓸 수 있다.
apply함수의 몇 가지 특징이 있다. 1. Math.max.apply(null, arr); 첫번째 파라미터가 null인 이유는 null을 써도 되고 안써도 되는 것이다. 2. Math.max.apply(null, arr); 두번째 파라미터(arr)에는 배열만 들어간다는 것이다. 자동으로 큰값을 뽑아올 수 있다. 파라미터를 여러 개 보내는 상황에서도 간단히 사용할 수 있다.
3. Math.max.apply(null, arr); 첫번째 파라미터가(null) null이 나오게 된 이유? 참고로, 메서드 안에서 this는 해당 스코프의 부모스코프의 오브젝트를 바라본다.
최종적으로 젤 최상위 스코프인 window객체를 바라본다. 함수를 실행하는 순간, apply의 첫번째 파라미터로 보낸 this의 대상이 바뀐다.
첫번째 파라미터로 보낸 부모메서드로 this를 바꾼다. 이것이 실행되는 순간은 함수를 실행하는 순간이다.
그래서 this를 받고싶지 않으면 null로 적어준다.
예를 들어 설명하면
여기서 this는 해당스코프의 부모스코프인 obj를 바라본다. { }중괄호를 스코프라고 한다.