Web개발을 할 때 ajax를 사용해서 통신하는 경우가 매우 많다.
클라이언트에서 Spring Controller로 ajax 등의 요청을 했을 때, json형식으로 return 받기 위해서는 여러 방법이 있을 수 있다. 그 중 두 가지 방법이 주로 쓰인다.
1. Controller return type을 String으로 하고, 별도의 Json API를 사용해 parsing해서 json 형식으로 return 해준다.
2. MappingJackson2JsonView를 사용해서 ModelAndView를 json 형식으로 반환해 준다.
1번은 Gson 등 Json API들을 사용해서 적당히 Parsing하면 될 것이고, 지금 알아볼 것은 2번 방법이다.
별도의 처리 없이 컨트롤러에서 ModelAndView를 넘기면 당연히 안된다.
Spring Bean 설정 없이 구글링으로 ModelAndView mv = new ModelAndView("jsonView") 와 같은 소스를 긁어오면 아래와 같은 에러를 볼 수 있을 것이다.
Error resolving template "jsonView", template might not exist or might not be accessible by any of the configured Template Resolvers
방법은 간단하다.
1) MappingJackson2JsonView 형식의 jsonView를 Spring Bean으로 등록한다.
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="contentType" value="application/json;charset=UTF-8"> </property> </bean>
- Spring boot를 사용하고 따로 DispatcherServlet xml을 사용해서 설정하지 않는다면, @Configuration 을 붙인 WebConfig 파일에서 Bean으로 등록
@Bean MappingJackson2JsonView jsonView(){ return new MappingJackson2JsonView(); }
2) Controller에서 return할 ModelAndView를 생성 할 때 View를 "jsonView"로 설정
ModelAndView mv = new ModelAndView("jsonView"); userVO.setOrderBy(orderDir); userVO.setOrderId(orderColNm); List<UserVO> userList = userMgmtSvc.selectUserList(userVO); int totalCnt = userMgmtSvc.selectUserListCount(userVO); mv.addObject("recordsTotal", totalCnt); mv.addObject("recordsFiltered", totalCnt); mv.addObject("data", userList); return mv;
----------------------------------------------------------------------------------------------------------------------------------------------------------
1. Ajax 처리
Ajax에서는 json 타입으로 데이터를 보낸다. 그런데 Controller에서는 Map<String, Object>로 받고 싶다. 그렇다면 어떻게 해야할까? 답은 간단하다. 보낼때 Map<String,Object> 형식으로 셋팅을 해주면 된다.
Ajax
$('#changeSubmitBtn').click(function(e){
var data = {}
data["name"] = $('#name').val();
data["tel"] = $('#tel').val();
data["email"] = $('#email').val();
var birth = $('#birth').val();
data["birth"] = birth.replace(/-/g,''); // 2015-09-24 => 20150924 로 변경
$.ajax({
contentType:'application/json',
dataType:'json',
data:JSON.stringify(data),
url:'/mypage/updateUser',
type:'POST',
success:function(response){
alert(response.message);
},
error:function(request,status,error){
alert(response.message);
}
});
});
먼저 data를 생성하여, <String,Object> 형식으로 데이터를 넣어준다.
data["name"] = $('#name').val(); 이 그러한 형식이다.
나는 넣을게 별로 없어서 다 일일이 기술해주었지만,
넣을게 너무 많아 넘치게 되면 for문을 이용하는 방법도 고려할 만 하다.
그리고 ajax에서 보낼 때 data:JSON.stringify(data) 라고 작성한다.
우리가 선언한 var data는 javascript 변수인데, ajax에서는 json 형태로 데이터를 반환하므로,
javascript 값을 json 형태로 파싱해야 한다.
그리고 .stringify 는 Javascript 값을 json 으로 파싱해주는 메소드다.
2. Controller 처리
Controller
@RequestMapping(value="/mypage/updateUser", method=RequestMethod.POST)
@ResponseBody
public Map<String, Object> updateUserInfo(@RequestBody Map<String, Object> params){
Map<String, Object> resultMap = new HashMap<String,Object>();
try{
userService.updateUserInfo(params);
}catch(Exception e){
resultMap.put("message",e.getMessage());
return resultMap;
}
resultMap.put("message", "회원 정보가 정상적으로 변경되었습니다");
return resultMap;
}
Controller에서는 해당 메소드 위에 @ResponseBody 를 입력해준다. return 값을 HTTP Response Body 로 전달하라는 뜻이다. ajax 역시 HTTP Request Body 를 통해 파라미터를 전달하므로 파라미터 앞에 @RequestBody 를 명시해준다. 그리고 아래 로직은 다른 컨트롤러와 동일하다. 파라미터를 Service로 전달하고, 다시 DAO로 전달하기. 그러면 끝 :-)
--------------------------------------------------------------------------------------------------------------------------------
파싱
var base_url = 'http://people.cs.uct.ac.za/~swatermeyer/VulaMobi/'; function example() { var response = ""; var form_data = { username: username, password: password, is_ajax: 1 }; $.ajax({ type: "POST", url: base_url + "ajax.php?test/json", data: form_data, success: function(response) { /*response = '[{"Language":"jQuery","ID":"1"},{"Language":"C#","ID":"2"}, {"Language":"PHP","ID":"3"},{"Language":"Java","ID":"4"}, {"Language":"Python","ID":"5"},{"Language":"Perl","ID":"6"}, {"Language":"C++","ID":"7"},{"Language":"ASP","ID":"8"}, {"Language":"Ruby","ID":"9"}]'*/ console.log(response); var json_obj = $.parseJSON(response);//parse JSON var output="<ul>"; for (var i in json_obj) { output+="<li>" + json_obj[i].Language + ", " + json_obj[i].ID + "</li>"; } output+="</ul>"; $('span').html(output); }, dataType: "json"//set to JSON }) }
$.ajax({ type : "GET", url : "home/fetch_regions", dataType: 'html', data : { param : count_val, '_token' : $('meta[name="csrf-token"]').attr('content'), }, success : function(response) { var jsonObject = JSON.parse(response); var $el = $(".regions tbody tr"); $el.empty(); // remove old options $.each($.parseJSON(response), function(key,obj) { //$.parseJSON() method is needed unless chrome is throwing error. $el.append("<td>"+ obj[key] +"</td>"); }); } });
$("#uproducti").fileinput({ uploadUrl: "/myupload.php", allowedFileExtensions: ["jpg", "png", "jpeg"], minImageWidth: 750, minImageHeight: 750, maxFileCount: 4, uploadExtraData: function() { return { userid: $("#usrid").val(), token: $("#tokn").val(), productid : $("#prglid").val() }; }, dataType: "json", success: function (response) { console.log(response); var json = $.parseJSON(response);//parse JSON alert(json.pid); $("#prid").val(json.pid); } });`
댓글 ( 5)
댓글 남기기