다음과 같은 Ajax 요청이 있다고 하자.
<script type="text/javascript">
function duplicationCheck() {
var userId = $("#userId").val();
$.ajax({
url:"duplicationCheck.me",
type:"post",
data:{userId:userId},
success:function(data){
/* alert(data); */
console.log(data);
console.log(data.userId);
},
error:function(status){
console.log(status);
}
});
return false
}
</script>
duplicationCheck.me로 ID가 중복되는지 체크해달라는 요청이다.
Controller, Service, Dao 중 Service, Dao 사용방법은 단순 DB 조회로 생략
Controller에서 4가지 방법을 확인해보자.
기본적으로 pom.xml을 통해서 관련 라이브러리가 추가되었음을 전제로 진행 ( https://qdgbjsdnb.tistory.com/237?category=733876 )
또한 관련 라이브러리 추가로 인한 xml 설정
servlet.xml, 서블릿 xml에 다음 태그들을 추가
<beans:bean id="jsonView" class="net.sf.json.spring.web.servlet.view.JsonView"></beans:bean>
<!-- beanNameViewResolver는 없는 자원에 대해 논리적 이름을 가지고 view를 지정한다. -->
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<beans:property name="order" value="1"></beans:property>
</beans:bean>
<!-- 메세지 컨버터 추가 -->
<!-- 자바 객체를 자바스크립트 객체로 바꿔주는 역할을 한다. -->
<beans:bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jacksonMessageConverter"></beans:ref>
</beans:list>
</beans:property>
</beans:bean>
xml 설정은 이것으로 마치고 구현
1. 스트림을 이용, 다른 툴은 이용하지 않고 기본 기능을 통해서 값 전달
// 1. 스트림을 이용한 ajax 처리
@RequestMapping("duplicationCheck.me")
public void duplicationCheck(@RequestParam String userId, HttpServletResponse response) {
System.out.println(userId);
try {
response.getWriter().print(false);
} catch (IOException e) {
e.printStackTrace();
}
}
2. ObjectMapper를 이용, 잭슨 라이브러리를 사용
ObjectMapper라는 객체를 생성하여 메소드를 이용해서 객체 자체를 전달
// 2. ObjectMapper를 이용한 ajax
@RequestMapping("duplicationCheck.me")
public void duplicationCheck(@RequestParam String userId, HttpServletResponse response) {
// 잭슨 라이브러리를 사용함
ObjectMapper mapper = new ObjectMapper();
Member m = new Member();
m.setUserId(userId);
try {
response.getWriter().print(mapper.writeValueAsString(m));
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
결과 Data 값은 위와 같이 출력된다.
배열이나 객체 타입이 아닌 String 형으로 나열되어 나온다.
3. jsonView를 이용, Controller의 ModelAndView 방식과 유사
반환 타입이 ModelAndView
// 3. jsonView를 사용한 방식
@RequestMapping("duplicationCheck.me")
public ModelAndView duplicationCheck(String userId, ModelAndView mv) {
Member m = new Member();
m.setUserId(userId);
mv.addObject("member", m);
mv.setViewName("jsonView");
// 한글의 경우 인코딩 처리를 해야함
return mv;
}
결과는 이와같이 오브젝트 타입으로 안에 배열 형식으로 객체가 담겨있다.
4. @ResponseBody를 이용, HashMap을 통해 원하는값을 보냄
// 4. @ResponseBody를 이용한 ajax
@RequestMapping("duplicationCheck.me")
public @ResponseBody HashMap<String, Object> duplicationCheck(@RequestParam String userId, HttpServletResponse response) {
HashMap<String, Object> hmap = new HashMap<String, Object>();
hmap.put("userId", userId);
return hmap;
}
결과는 위와 같다.
HashMap을 통해서 원하는 값만 간편하게 보내면 된다.
4가지 방식을 보면 사용방법은 모두 쉽다.
문제는 반환되는 형식이 어떠하냐인데 마음에 드는 방법에 익숙해지거나
상황에 맞는 방법을 골라서 하면 될거같다.