티스토리 뷰
출처: http://aljjabaegi.tistory.com/148 [알짜배기 프로그래머]
ajax success 넘어가지 않을때 해결방법 @ResponseBody 에 대하여
전자정부프레임워크의 Spring 구조에서 ajax 사용 시 통신은 이상없이 이루어지는데
success로 넘어가지 않는 문제가 발생했다.
DB저장도 되고, 데이터도 리턴해 주는데 ajax의 success로 넘어가지 않는 것이다.
문제는 controller에서의 @ResponseBody 를 해주지 않았기 때문!
몇날 몇일동안 왜안될까를 고민 했었는데
원인은 한줄이였다.
복사해 쓸줄만 알았지 기본지식의 부족을 다시한번 느꼈다.
ajax 에서 success로 넘어가는 조건은 http 요청에 성공했을 경우이다.
그런데 @RequestMapping 메서드에 적용되면 해당 메소드의 리턴값을 http 응답데이터로 사용하는 @ResponseBody를
빼먹었으니 요청데이터가 없었던것 같다.
그럼 @RequestBody 와 @ResponseBody 에 대해서 알아보자.
@RequestBody 와 @ResponseBody 어노테이션은 각각 HTTP 요청 몸체를 자바 객체로 변환하고 자바 객체를 HTTP 응답 몸체로 변환해주는데 사용된다.
@RequestBody 어노테이션을 이용하면 HTTP 요청 몸체를 자바 객체로 전달 받을 수 있다. @RequestMapping 에 의해 POST 방식으로 전송된 HTTP 요청 데이터를 String 타입의 body 파라미터로 전달한다.
@ResponseBody 어노테이션을 이용하면 자바 객체를 HTTP 응답 몸체로 전송 할 수 있다. @RequestMapping 메서드에 적용되면 해당 메소드의 리턴값을 HTTP 응답데이터로 사용한다.
문제가 발생했던 jsp
해당 ajax에서는 아무 문제가 없다. 아무 문제가 없는데 success로 넘어가지 않았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $.ajax({ type : 'POST', dataType : 'json', data:param, url : '${ctx}/mobileReq/regMobileReq.do', success : function(Data){ if(Data.resultCode==200){ alert("성공"); location.replace("${pageContext.request.contextPath}/request/MobileReq.do") }else if(Data.resultCode==300){ alert("실패"); location.replace("${pageContext.request.contextPath}/request/MobileReq.do") } }, error:function(e){ if(e.status==300){ alert("단말기 신청을 하는데 실패하였습니다."); location.replace("${pageContext.request.contextPath}/request/MobileReq.do") } } }); | cs |
원인이였던 controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @ResponseBody <- 원인이었던 @ResponseBody @RequestMapping(value="/mobileReq/regMobileReq.do", method = RequestMethod.POST, produces="text/plain;charset=UTF-8") public String regMobileReq(MobileReqVO mobileReqVO, HttpServletRequest request, HttpServletResponse response, ModelMap model)throws Exception { Gson gson = new Gson(); MobileReqSet set = new MobileReqSet(); try{ getMobileReqService.regMobileReq(mobileReqVO); set.setResultCode(200); set.setResultMsg("LOGIN_SUCCESS"); }catch(Exception e){ e.printStackTrace(); set.setResultCode(300); } return gson.toJson(set); } | cs |
-- 참고로 ajax 사용 시 이유 없이 error가 날 경우에는
async:false 옵션을 주세요. 이것만으로도 해결될 때가 있습니다.
(버튼클릭에 ajax를 걸어둬 중복호출될 경우 error발생)
출처: http://aljjabaegi.tistory.com/148 [알짜배기 프로그래머]
이분께 무한 감사를 표한다. 미루고미루다 문제해결을 해야될 때가 왔을 때 기적처럼 제게 오신 당신은 앞으로 모든 일이 행복하시고 만수무강하시길...!