다음과 같은 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에 다음 태그들을 추가




    <!-- jsonView 설정 -->
    <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가지 방식을 보면 사용방법은 모두 쉽다.


문제는 반환되는 형식이 어떠하냐인데 마음에 드는 방법에 익숙해지거나


상황에 맞는 방법을 골라서 하면 될거같다.





+ Recent posts