DispatcherServlet 클래스를 상속 받아 유동적인 VIEW 맵핑
Spring MVC JSON Response 처리하기
사전 정의 사항
1. Controller는 ModelAndView 객체를 리턴한다
2. 이때 View Name 이 successView 일경우에는 JSON으로 응답을 주도록한다.
Step #1 . DispatcherServlet을 Override하여 랜더링 되기 직전에 뷰 네임을 검사하여 위에 정의한 successView 라는 이름을 가질경우 JacksonJsonView를 리턴하도록 한다.
MyDispatcherSerlvet.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
@SuppressWarnings("serial")
public class MyDispatcherServlet extends DispatcherServlet {
@Override
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
//return 되는 view name 이 successView 일때 JacksonJsonView 로 처리
if (mv.getViewName().equals("successView")) {
mv.addObject("successFlag", true);
mv.setView(new MappingJacksonJsonView());
super.render(mv, request, response);
} else {
// TODO Auto-generated method stub
super.render(mv, request, response);
}
}
}
Step #2 . web.xml을 수정하여 servlet class를 위에서 생성한 MyDispatcherServlet으로 변경한다.
Change
daum-servlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/daum-servlet-context.xml
1
daum-servlet
*.daum
To
daum-servlet
net.daum.MyDispatcherServlet
contextConfigLocation
classpath:spring/daum-servlet-context.xml
1
daum-servlet
*.daum
MappingJacksonJsonView 클래스를 상속 받아 JSON VIEW 를 컨트롤
JSONP 응답 처리하기
사전 정의 사항
1. jQuery ajax jsonp 요청시 jsonp 항목은 callback 으로 통일한다.
$.ajax({
~ 생략 ~
dataType : 'jsonp'
, jsonp : 'callback'
~ 생략 ~
});
2. callback이라는 파라메터명칭은 어떠한 경우에도 사용하지 않는다.
단 json 리턴이 아닌(뷰 네임이 successView가 아니라면) 사용해도 무방하다
3. 파라메터로 넘어온 callback 항목을 callback 이라는 키 그대로 model에 셋팅하도록 한다.
Step #3. MappingJacksonJsonView 를 override 한다
MyMappingJacksonJsonView.java
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.web.servlet.view.json.MappingJacksonJsonView;
public class MyMappingJacksonJsonView extends MappingJacksonJsonView {
/**
* jquery ajax jsonp 요청에 대한 응답 처리를 위하여 해당 메서드 오버라이딩 (일반 json 요청일때는 기존 방식 그대로 사용)
*/
@Override
protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (model.get("callback") != null && StringUtils.isNotEmpty(String.valueOf(model.get("callback")))) {
String callback = String.valueOf(model.get("callback"));
//컨트롤러에서 모델에 셋팅한 파라메터로 넘온 callback function 명을 모델에서 제거한다 (응답 json data에 포함되지 않도록 하기위해)
model.remove("callback");
Object value = filterModel(model);
ObjectMapper objectMapper = new ObjectMapper();
String jsonpResult = callback + "(" + objectMapper.writeValueAsString(value) + ")";
response.getOutputStream().write(jsonpResult.getBytes("UTF-8"));
response.getOutputStream().flush();
response.getOutputStream().close();
} else {
// TODO Auto-generated method stub
super.renderMergedOutputModel(model, request, response);
}
}
}
Step #4. 위의 Step #2 항목에 ModelAndView에 MappingJacksonJsonView 객체를 생성하여 셋팅하던 것을 Override한 MyMappingJacksonJsonView 를 생성하여 셋팅하도록 수정한다.
'History' 카테고리의 다른 글
[MongoDB] Spring JSON response, JSON view - TEXT (0) | 2014.06.05 |
---|---|
[MongoDB] Spring JSON 응답처리 설정 방법 정리 (0) | 2014.06.05 |
[MongoDB] Spring JSON response, JSON view (0) | 2014.06.05 |
java-mongo-driver CRUD 예제 (0) | 2014.06.05 |
mongo-java-driver 사용하기 (0) | 2014.06.05 |