messageConverter
ajax 로 응답을 주고 받을 때 json 설정은 MappingJackson2HttpMessageConverter 를 이용해서
해오다, 같은 로직을 처리하지만 페이지마다 데이터형식을 다르게 보낼 때 메서드를 나누어 만들지 않도록
ContentNegotiatingViewResolver를 이용할 수 있다.
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
ContentNegotiatingViewResolver 은 하나의 url 로 다양한 contentType 으로 응답할 수 있도록 한다.
<!-- ContentType 자동 매칭 후 View 연결 -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="contentNegotiationManager">
<bean id="contentNegotiationManaver" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="false" />
<property name="parameterName" value="mediaType" />
<property name="ignoreAcceptHeader" value="false" />
<property name="defaultContentType" value="text/html" />
<property name="useJaf" value="false" />
<!-- 맵핑될 확장자 정의 -->
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"></entry>
<entry key="json" value="text/plain"></entry>
</map>
</property>
</bean>
</property>
<property name="order" value="1"/>
<property name="defaultViews">
<list>
<!-- JSON 요청을 처리할 뷰 -->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="prefixJson" value="false"/>
</bean>
</list>
</property>
</bean>
<!-- bean을 viewResolver로 사용 -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"></property>
</bean>
<!-- 맵핑되는 확장자가 없을때 JSP 로 뷰 처리 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp" />
<property name="suffix" value=".jsp" />
<property name="order" value="2" />
</bean>
contentNegotiaingViewResolever 는 아래와 같은 사항들을 고려해 return 형식을 결정한다.
1. URL 뒤에 붙는 확장자
2. URL의 특정 파라미터에 설정되는 값
3. Request Header 중 Accept 항목에 설정되어 있는 값
4. 1,2,3을 모두 사용하지 않을 경우 defaultContentType 프로퍼티에서 정해진 값
동일 URL 을 이용해 다양한 데이터타입을 받고록 하려면 1,2 는 사용하지 못하고 3번을 이용해야 한다.
favorPathExtention 은 디폴트가 true 인데 true 는 리턴 형식 기준을 URL 로 보고 URL 에서 MediaType 을 구해 그것을 리턴한다.
parameterName이란 url 형식을 .do?format=xml 으로 하면 format 파라미터 값을 읽어 리턴형식을 결정한다. 디폴트는 format 으로 설정되어 있다.
ignoreAcceptHeader 프로퍼티의 값을 false 로 설정하면
contentNegotiaingViewResolever가 accept 항목 값을 보고 리턴 값을 결정한다.
이런 설정을 모두 거쳐 defaultContentType 프로퍼티를 보고 판단한다.
그리고 이 조건들에 모두 만족하지 못하면 다음 순위의 viewResolver 를 사용한다.