스프링 2.5.6 버전에서는 Ajax를 사용 하려면
View 인터페이스를 구현해서 별도의 Ajax전용 View
만들어서 사용 해야 했습니다.
솔직히 Ajax에 지원에 대해서 많이 미흡했습니다.
이유인즉 기술력 문제는 아니고 스프링 진영에서
Ajax가 J2EE스펙이 아니기 때문이라고
SpringSource 웹 사이트에서 본적이 있습니다.
하지만 Spring 3.0이 나오면서 파워풀한 기능이
추가 되었습니다. 그중에서 Spring3.0 기반에서
Ajax 구현 방법에 대해서 말씀 드리겠습니다.
* web.xml
<servlet>
<servlet-name>springDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring/application/spring.mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springDispatcher</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
"servlet-mapping" 맵핑 태그에 보면 두개를 설정 했습니다.
하나는 View 호출을 위한 "*.htm",다른 하나는 "*.json"
입니다. 예를 들어서 입력 화면을 호출할때는
확장명이 "htm"으로 호출 하고 값을 입력 하고
넘길때는 "json"으로 호출 합니다.
* Controller
@Controller
public class HelloWorldController {
@RequestMapping("/helloWorld")
public ModelAndView helloWorld() {
ModelAndView mav = new ModelAndView();
System.out.println("===================");
mav.setViewName("/helloWorld");
return mav;
}
@RequestMapping("/ajax")
public Map get() {
System.out.println("===get");
Map map = new HashMap();
map.put("key","value");
return map;
}
}
* spring.mvc.xml
<!-- annotation config -->
<context:annotation-config />
<context:component-scan package="org.beyondj2ee">
<context:include-filter type="regex" expression=".*Controller" />
</context:component-scan>
<!-- handler mapping -->
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- view resolver -->
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml" />
<entry key="html" value="text/html" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/jsp" />
<property name="suffix" value=".jsp" />
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="prefixJson" value="true" />
</bean>
</list>
</property>
</bean>
스프링 MVC 설정을 합니다.
나머지 부분은 spring2.5.6에 나온 것들이라 생략 하겠습니다.
"view resolver" 파트르를 보면 뷰에 대해서 chain을
형성 합니다.
먼저 "htm"으로 오면 response의 content type을
"text/html" 응답 합니다. "json"은 "application/json"
content type으로 응답 합니다.
스프링 "DispatcherServlet"은 모든 MVC process를
관장 하는데 먼저 "defaultViews"를 찾아서
해당 viewName이 없을 경우 리턴 합니다.
만약 viewName이 있을경우 "viewResolvers"
property에 선언된 순서로 찾아 갑니다.
예를 들어서
"http://localhost:8080/org-beyondj2ee-web/helloWorld.htm"
을 하면 처리하는 메서드에서 viewName을 가지고 있기
때문에 "InternalResourceViewResolver"로 빠지게 되고
"http://localhost:8080/org-beyondj2ee-web/ajax.json"
으로 호출하면 리턴 메서드가 없기 때문에
"MappingJacksonJsonView"로 빠지게 되어 있습니다.
Controller의 설정과 무관하게 decoupling 되게
구성이 되어 있습니다.
아... 주석 플러그인이 자꾸 XML이 깨지네요
죄송 합니다. 안깨지는 플러그인좀 있으면
추천좀 해주세요 ㅠ.ㅠ
출처 - http://dev-world.springnote.com/pages/6358467
===================================================================================
출처 - http://windvoice.tistory.com/51
===================================================================================
json사용 ContentNegotiatingViewResolver 에서 Converter로
json 을 사용하기 위해 ContentNegotiatingViewResolver 을 사용하였다 .
확장자 json 을 통해 호출하면 결과값이 잘 떨어진다 *.do 에서
json 을 받기 위해 /* 변경해야 했으며 이 방식 Restful 방식에 어울리는듯 하다 .
[spring-context.xml]
<bean class=”org.springframework.web.servlet.view.ContentNegotiatingViewResolver”>
<property name=”mediaTypes”>
<map>
<entry key=”json” value=”application/json” />
</map>
</property>
<property name=”defaultViews”>
<list>
<bean class=”org.springframework.web.servlet.view.json.MappingJacksonJsonView”/>
</list>
</property>
<property name=”order” value=”1″ />
<property name=”ignoreAcceptHeader” value=”true” />
</bean>
[web.xml]
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
결국 기존의 것에서 가장 작은 변화를 주고 json 을 처리하는것은 Converter 를
이용하는것이었다 . jacksonMessageConverter 와 @ResponseBody 를 이용하면 된다 .
controller 에서는 ModelAndView 대신 원하는 형식의 VO 객체를 리턴하거나 Map 을이용해
객체처럼 구성해 리턴해도 된다.
<bean class=”org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter”>
<property name=”messageConverters”>
<list>
<ref bean=”jacksonMessageConverter”/>
</list>
</property>
</bean>
<bean class=”org.springframework.http.converter.json.MappingJacksonHttpMessageConverter” />
@RequestMapping(“/jsonTest”)
@ResponseBody
public List jsonTest(){
}
'Framework & Platform > Spring' 카테고리의 다른 글
Spring - REST Supports (0) | 2012.06.08 |
---|---|
Spring - @ResponseBody 응답 시 한글 인코딩(깨짐) 문제 (3) | 2012.06.08 |
Spring - DispatcherServlet (0) | 2012.05.29 |
Spring - mvc - 각 URL별로 interceptor 적용하기 (0) | 2012.05.29 |
Spring - transactionManager (0) | 2012.05.25 |