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
번호 제목 글쓴이 날짜 조회 수
162 AIX - tar,gzip 명령어 (한번에 압축하기) - Linux참고 JAESOO 2016.02.02 636
161 AIX Admin Study 교육 자료 JAESOO 2016.05.11 547
160 AIX 서버 기초 JAESOO 2016.05.11 560
159 AIX 시스템상의 core, SMT(Simultaneous Multi Threading) 수 확인하기 JAESOO 2016.05.12 604
158 AIX 자주 쓰이는 관리 명령 모음 JAESOO 2016.05.12 554
157 AIX에서 논리적 볼륨 크기 확장 JAESOO 2016.01.28 531
156 Apache HTTP Server, Rewrite가 안되는 경우 JAESOO 2014.05.26 930
155 Apache 파일시스템 권한 설정 JAESOO 2014.05.26 1004
154 Apache/FastCGI JaeSoo 2013.03.08 5915
153 CC 및 GCC 컴파일러 설치와 환경 설정 처누 2004.06.09 16696
152 CentOS - samba 자동실행 JAESOO 2014.05.26 1525
151 CentOS 5.0에 net-snmpd 설치 JAESOO 2014.12.26 782
150 CentOS 5.2 + Xmanager 설정 방법 JAESOO 2014.05.26 1226
149 Centos GeoIP 설치 JAESOO 2014.12.21 643
148 CentOS Network 설정 JAESOO 2014.05.26 1019
147 CentOS nmon 설치하기 JAESOO 2014.05.29 1701
146 CentOS Samba Server 설정 JAESOO 2014.05.26 1283
145 CentOS samba 공유 폴더 생성하기 JAESOO 2014.05.26 1048
144 CentOS Samba 설치 및 설정 JAESOO 2014.05.26 1291
143 CentOS X Window + Gnome Desktop 설치 JAESOO 2014.05.26 1297
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

PageViews   Today : 6967 Yesterday : 5037 Total : 21963019  /  Counter Status   Today : 6718 Yesterday : 4602 Total : 1189441

Edited by JAESOO

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


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

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

설치 취소