앞의 글에서
curl -X PUT -HContent-type:application/xml --data "<?xml version='1.0' encoding='UTF-8'?><user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://localhost:8080/push_web_server/reg/user/1234.xml
로 접근 했던 방식은 앞의 header 에도 xml 이라고 표시해 주고
URL 뒤에도 확장자 방식으로 뒤에 .xml 을 받기 때문에 좀 맘에 들지 않았다.
또한 쓸데 없이 view 에 대한 jsp 파일도 필요 했다.
그래서 header 에만 받고 url에는 확장자가 붙지 않도록 코드를 좀 바꾸어 보았다.
dispatcher-servlet
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml" />
<entry key="html" value="text/html" />
</map>
</property>
<property name="viewResolvers">
<list>
<!-- JAXB XML View (Controller 에서 view 이름을 bean 이름으로 지정하면 결과가 넘어와서 View 화면에 XML 로 뿌려짐) -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>
<!-- 내부에서 POST 메소드의 body로 넘어오는 XML 값을 자동 파싱 하기 위함 -->
<bean id="jaxbMarshaller"
class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.incross.dto.UserDTO</value>
</list>
</property>
</bean>
<!-- view 로 넘어올 dto 들을 파싱 하여 view 페이지로 넘겨주기 위함 -->
<bean id="userDTO" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg ref="jaxbMarshaller" />
</bean>
==============================================================
controller
@RequestMapping(value = "/user/{user}", method = RequestMethod.PUT)
public String getUser(@PathVariable String user, ModelMap model,HttpServletRequest request,@RequestBody String body) {
//@RequestBody String body => Request 의 body 를 표현함
logger.debug("***********enter controller restful test message send ***********");
Source source = new StreamSource(new StringReader(body));
UserDTO userDTO = (UserDTO) jaxb2Mashaller.unmarshal(source);
//body 가 XML 방식으로 넘어오는 값 parsing 함
//보낼때 http 헤더에 Content-type:application/xml 로 만들어서 데이터 보내야함
//curl -X POST -HContent-type:application/xml --data "<user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://124.136.171.168:8080/push_web_server/reg/user/1234.xml
//와 같이 리눅스 shell 상에서 테스트 가능함
logger.debug("user::"+user);
logger.debug("userDTO::"+userDTO.getUSER_ID()+"::"+userDTO.getPASSWORD());
userDTO.setUSER_ID("shonm");
userDTO.setPASSWORD("koei4444");
model.addAttribute("userDTO",userDTO);
return "userDTO";
}
========================================================
테스트
shell> curl -X PUT -HContent-type:application/xml --data "<?xml version='1.0' encoding='UTF-8'?><user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://localhost:8080/push_web_server/reg/user/1234
결과
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><PASSWORD>koei4444</PASSWORD><USER_ID>shonm</USER_ID></user>
curl -X PUT -HContent-type:application/xml --data "<?xml version='1.0' encoding='UTF-8'?><user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://localhost:8080/push_web_server/reg/user/1234.xml
로 접근 했던 방식은 앞의 header 에도 xml 이라고 표시해 주고
URL 뒤에도 확장자 방식으로 뒤에 .xml 을 받기 때문에 좀 맘에 들지 않았다.
또한 쓸데 없이 view 에 대한 jsp 파일도 필요 했다.
그래서 header 에만 받고 url에는 확장자가 붙지 않도록 코드를 좀 바꾸어 보았다.
dispatcher-servlet
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml" />
<entry key="html" value="text/html" />
</map>
</property>
<property name="viewResolvers">
<list>
<!-- JAXB XML View (Controller 에서 view 이름을 bean 이름으로 지정하면 결과가 넘어와서 View 화면에 XML 로 뿌려짐) -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>
<!-- 내부에서 POST 메소드의 body로 넘어오는 XML 값을 자동 파싱 하기 위함 -->
<bean id="jaxbMarshaller"
class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.incross.dto.UserDTO</value>
</list>
</property>
</bean>
<!-- view 로 넘어올 dto 들을 파싱 하여 view 페이지로 넘겨주기 위함 -->
<bean id="userDTO" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg ref="jaxbMarshaller" />
</bean>
==============================================================
controller
@RequestMapping(value = "/user/{user}", method = RequestMethod.PUT)
public String getUser(@PathVariable String user, ModelMap model,HttpServletRequest request,@RequestBody String body) {
//@RequestBody String body => Request 의 body 를 표현함
logger.debug("***********enter controller restful test message send ***********");
Source source = new StreamSource(new StringReader(body));
UserDTO userDTO = (UserDTO) jaxb2Mashaller.unmarshal(source);
//body 가 XML 방식으로 넘어오는 값 parsing 함
//보낼때 http 헤더에 Content-type:application/xml 로 만들어서 데이터 보내야함
//curl -X POST -HContent-type:application/xml --data "<user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://124.136.171.168:8080/push_web_server/reg/user/1234.xml
//와 같이 리눅스 shell 상에서 테스트 가능함
logger.debug("user::"+user);
logger.debug("userDTO::"+userDTO.getUSER_ID()+"::"+userDTO.getPASSWORD());
userDTO.setUSER_ID("shonm");
userDTO.setPASSWORD("koei4444");
model.addAttribute("userDTO",userDTO);
return "userDTO";
}
========================================================
테스트
shell> curl -X PUT -HContent-type:application/xml --data "<?xml version='1.0' encoding='UTF-8'?><user><USER_ID>3</USER_ID><PASSWORD>guest3</PASSWORD></user>" http://localhost:8080/push_web_server/reg/user/1234
결과
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><PASSWORD>koei4444</PASSWORD><USER_ID>shonm</USER_ID></user>
'SPRING > Restful 웹서비스 설정' 카테고리의 다른 글
[Spring 3.0] Restful 웹 서비스 구현 (2) | 2011.10.19 |
---|
댓글