RadarURL
Skip to content
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Spring MVC 에서 하나의 Request 요청이 올때 보통 비지니스 로직을 거쳐, 가공된 데이터는 jsp 나 freemarker 같은 view단으로 보내지게 됩니다.

하지만 기존웹 & 모바일웹과 네이티브 모바일앱에 모두 대처하기 위해서는 단일 Request에서 해당 데이터를 jsp와 같은 view단을 위한 request mapping 뿐만 아니라, 모바일 Client을 위한 json , 크로스 도메인에 대처하기 위한 jsonp 까지 제공할려면 어떻게 해야 할까요.


예를 들어,

http://localhost/member/profile - 전통적인 view를 보여줍니다.
http://localhost/member/profile.json - json형태를 반화
http://localhost/member/profile.jsonp - jsonp 형태를 변환


ContentNegotiatingViewResolver


ContentNegotiatingViewResolver 를 이용하면, 위와 같이 하나의 URI에 *.json 등과같이 mediaType 에 변화를 줌으로써 해당 형태의 페이지를 각각 제공 해 줄 수 있습니다.


ContentNegotiatingViewResolver 의 사용 방법은 아래와 같습니다.

<bean class=" org.springframework.web.servlet.view.contentnegotiatingviewresolver">

<!-- ViewResolver 우선순위 설정 -->
<property name="order" value="1" />
<property name="mediaTypes">
<!-- 맵핑될 확장자 정의 -->
<map>
<entry key="json" value="application/json" />
<entry key="jsonp" value="javascript/jsonp" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON 요청을 처리할 뷰 -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
<!-- JSONP 요청을 처리할 뷰 -->
<bean class="com.jce.commons.controller.JSONPView">
<property name="contentType" value="javascript/jsonp"/>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
< /bean>



  • 기존의 FreeMarkerViewResolver 위에 위와 같이 ContentNegotiatingViewResolver를 정의합니다.
    mediaTypes의 entry의 key에 json, jsonp 등과 같이 원하는 형식의 mediaType 을 설정하고,
    entry에 view에는 json이라면 application/json과 같이 contentType을 설정합니다
    .
  • 설정된 mediaType 정보를 바탕으로 아래쪽 defaultViews 목록에 정의된 view들 중에서 랜더링 가능한 view를 찾게 됩니다. 그 기준은 defaultView의 list에 정의된 view class의 contentType 입니다.
  • list 의 JSONPView 같은 경우는 jsonp를 위해 정의한 클래스인데, 이와 같이 필요해 따라 개발자가 AbstractView를 상속받아 직접 구현 할 수 도 있습니다.



JSONPView

public class JSONPView extends AbstractView {

@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String callback = request.getParameter("callback")!=null?request.getParameter("callback"):"?";
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(model);
response.setContentType("javascript/jsonp");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(callback+"("+json+");");
}

}

Controller

@Controller
@RequestMapping("/member")
public class MemberContoller extends BaseController {
@RequestMapping(value="/profile", method=RequestMethod.GET)
public void profile(Model model) throws Exception {
List<Map<String,Object>> dataList = new ArrayList<Map<String, Object>>();
Map<String, Object> data = new HashMap<String,Object>();
data.put("name","정민혁");
data.put("lv:",10);
dataList.add(data);
data = new HashMap<String,Object>();
data.put("name","잡스");
data.put("lv",99);
dataList.add(data);
model.addAttribute("personList", dataList);
}
}


실제로 테스트 해보겠습니다.

default

normal.png

jsonp

jsonp.png

json

json.png

출처 : http://stunstun.tistory.com/37

?

List of Articles
번호 제목 글쓴이 날짜 조회 수
42 CentOS Network 설정 JAESOO 2014.05.26 997
41 RHEL 6.5 에서 bmc-watchdog[xxxx]: Log 가 발생되면서 rebooting 되는 문제 JAESOO 2014.05.22 1433
40 RHEL5, 6 Ctrl + Alt + Del 키 막기 JAESOO 2014.05.22 1213
39 Linux YUM 을 이용하여 보안 업데이트를 진행해 보자 JAESOO 2014.05.22 1039
38 Red Hat RHN 등록이 왜? 안될까? ( RHN connection refused ) JAESOO 2014.05.22 1014
37 RHEL 6.5 Release… JAESOO 2014.05.22 1300
36 sulinux 2.0 + APM + Zend + eaccelerator + nginx + mrtg JAESOO 2014.05.22 1312
35 SULinux 2.0 GUI 버전 - GUI가 편하긴 하구나... JAESOO 2014.05.22 1769
34 sulinux APMtools 설치 위치 정리 JAESOO 2014.05.22 1378
33 howto: RHEL6 x86_64 + APM + mediawiki + CKEditor + IPA(LDAP) JAESOO 2014.05.22 2061
32 RedHat 계정 만들기 ( 평가용 서브스크립션 다운로드 ) JAESOO 2014.05.22 1165
31 리눅스 시스템 성능 모니터링(CPU, 메모리) JAESOO 2014.05.14 1358
30 Linux CPU, I/O, Memory 사용량 측정 JAESOO 2014.05.14 2171
29 리눅스 시스템 모니터링 시스템 최적화 JAESOO 2014.05.14 834
28 Conversion Struts to Spring MVC JAESOO 2014.05.09 909
27 Unix/Linux 디스크 용량 확인 명령어 (df/du) JAESOO 2014.05.09 1668
26 Spring 3.1 Overview JAESOO 2014.05.09 640
» Spring MVC 에서 ContentNegotiatingViewResolver를 이용한 단일 RequestMapping 으로 Muilti-View 처리하기 JAESOO 2014.05.09 1337
24 Struts와 Spring의 Controller 의 차이는? JAESOO 2014.05.09 585
23 Spring MVC JAESOO 2014.05.09 792
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

PageViews   Today : 962 Yesterday : 2356 Total : 21721081  /  Counter Status   Today : 867 Yesterday : 1688 Total : 1146236

Edited by JAESOO

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소