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 페도라12 yum(rpm)으로 APM 설치 (수호신패치 포함) JaeSoo 2011.06.08 12310
161 특별한 퍼미션 setuid setgid sticky bit JAESOO 2015.05.27 554
160 톰캣(Tomcat) 실시간 로그보기 JAESOO 2015.04.13 1069
159 좀비 프로세스 찾기, 죽이기 JAESOO 2015.05.27 898
158 유닉스 상에서 ls 출력물을 MB 단위로 출력해주는 옵션 JAESOO 2016.05.04 446
157 웹서버 CentOS 6.5 MRTG 설치 JAESOO 2014.12.26 1006
156 올바른 자바 프레임워크 선택하기 JAESOO 2014.05.09 1044
155 안전한 CentOS를 위한 방화벽, 보안 설정 JAESOO 2014.05.26 2093
154 아파치서버 동시접속자수에 따른 메모리 산정 (대략) JAESOO 2015.01.13 1613
153 시스템 관리자가 알아야 할 리눅스 모니터링 툴 20선 (20 Linux System Monitoring Tools Every SysAdmin Should Know) JAESOO 2014.05.29 2301
152 스프링 프레임워크(Spring Framework) 버전(version) 확인하기 JAESOO 2014.05.09 1368
151 스트러츠와 스프링의 비교 JAESOO 2014.05.09 1414
150 쉘 프로그래밍을 이용한 시스템 관리 기법 JAESOO 2016.05.12 540
149 성능 엔지니어링 대한 접근 방법 (Performance tuning) JAESOO 2016.05.05 489
148 리눅스에서 일반 계정으로 httpd 80포트 실행하기 JAESOO 2014.05.26 1106
147 리눅스에서 MYSQL 데이터 디렉토리 변경 JAESOO 2014.06.04 2015
146 리눅스에서 i386,i586,i686, x86의 차이점 JAESOO 2014.05.30 2176
145 리눅스로 MRTG 트래픽분석서버 구축 JAESOO 2014.12.26 730
144 리눅스(Linux)에서 하위 디렉토리까지 파일 찾기, 찾아서 지우기 JAESOO 2015.02.24 1232
143 리눅스(Linux) 디렉토리 구조 JAESOO 2016.10.20 602
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

PageViews   Today : 8903 Yesterday : 5037 Total : 21964955  /  Counter Status   Today : 8607 Yesterday : 4602 Total : 1191330

Edited by JAESOO

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


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

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

설치 취소