Ajax 데이터 주고받기

◇ Ajax 포스팅 시리즈 ◇

  1. jsp에서 Ajax데이터 주고받기- 현재 글
  2. Ajax- 회원가입 중복확인하기
  3. Ajax- 댓글 리스트 가져오기
  4. Ajax- 게시판 댓글 추가, 삭제하기

ajax 사용 기본 설정

  • 서버가 클라이언트 간에 비동기 통신을 가능하게 해주는 javascript library다.
  • 페이지가 전환되지 않고, 데이터를 갱신한다.
  • 사용 예시로는 검색어 쳤을 때 페이지가 바뀌지 않고 바로바로 추천 검색어가 나타내는 것이 있다.

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.0</version>
</dependency>

요청보내기

  • @responseBody 가 키워드!

  • 평소와 같이 controller의 method에 @RequestMapping 과 함께 ResponseBody를 써주면 return 의 string 이 .jsp를 반환하지 않고, 문자열 그 자체를 반환하게 된다!

    • 이렇게 public과 string 사이에 @ResponseBody를 써주거나

      @RequestMapping("/reqAjax1")
      	public @ResponseBody String reqAjax1(){}
      
    • RequestMapping 과 함께 써주면 된다.

      @ResponseBody
      @RequestMapping("/reqAjax1")
      	public String reqAjax1(){}
      
  • 페이지가 전환되지 않고 데이터가 화면에 나타난다.

1214aj1

요청보내기 1 - ajax 요청보내기

  • jsp파일. 화면에서 버튼을 누르면
<li>Ajax1 : <input id="reqBtn1" type = "button" value = "1.ajax 요청"><span id="req1" style = "color:red"></span></li>
  • 다음과 같이 .on(‘click’,reqAjax1) 함수가 실행된다.
$(function(){
    $('#reqBtn1').on('click',reqAjax1);}
  • javascript function 인 reqAjax1과 controller function 인 reqAjax1 은 순서대로 서술하기 어렵다.

  • reqAjax에서는 $.ajax(url : ‘url’, method : ‘method’, success : ‘function’) 구조를 사용해 데이터를 서버에서 받는다.

  • 대충 보았을 때, url과 method의 정보(클라이언트)로 controller에 있는 함수(서버)와 매칭이 되고, 서버에서 클라이언트 쪽으로 정보가 제대로 전달됐으면 success 문이 실행된다.

    //클라이언트 쪽
    function reqAjax1() {
        $.ajax({
            url:'reqAjax1'
            , method : 'GET'
            , success :  function(resp){
                if(resp =='cool'){
                    $('#req1').text("전송받은 데이터 : " + resp)
                }
            }
        })
    }
    
  • 그러면 cool이라는 문자를 return 하게 되고, success

  • @ResponseBody 가 붙어있기 때문에, cool.jsp를 보여주는게 아니라 cool이라는 데이터를 반환해준다.

    //서버 쪽
    @Controller
    public class AjaxController {
        @RequestMapping("/reqAjax1")
        public @ResponseBody String reqAjax1() {
            System.out.println("ajax 요청 도착!");
            return "cool";
        }
    

요청보내기 2 - 데이터 파라미터로 보내기(String)

  • 위와 같은 패턴에, data:”name=”+name+’&phone=’+phone 를 추가해 서버에 데이터를 전달한다.

    function reqAjax2() {
        var name = $("#username").val();
        var phone = $("#phone").val();
        if(name.trim() =='' || phone.trim()==''){
            alert('데이터를 입력해주세요')
            return;}
    
        //서버로 보낼 데이터 준비 : 파라미터로 만들기 . json 으로 만들기
        var sendData = "name="+name+'&phone='+phone;
        $.ajax({
            url:'reqAjax2'
            , method : 'POST'
            , data: sendData
            , success :function(resp){}
        })
    }
    
  • data로 넘긴 정보에 변수명 두개, name과 phone 이 있었다. 이걸 이렇게 param으로 받아준다.

    @RequestMapping(value="/reqAjax2", method=RequestMethod.POST)
    public @ResponseBody String reqAjax2(String name, String phone) {
        System.out.println("ajax 요청 도착!"+name +"," + phone);
        return "success";
    }
    

요청보내기 3 - JSON으로 보내기 (String으로 받기)

  • data를 string 이 아닌 JSON 데이터로 보낸다.

  • 이렇게 보내면, 서버쪽에서 param으로 받는다. map으로 안 받고

    var sendData = {"name":name,"phone":phone}
    //json 은 key를 반드시 큰 따옴표로 해줘야한다. 작은 따옴표 안됨.
    $.ajax({
        url:'reqAjax2'
        , method : 'POST'
        , data: sendData
        ,  success :function(resp){
            var respData = "이름 : " + resp["name"]+", 전화번호 : "+ resp["phone"]
            $("#req2").html(respData);
        }
    })
    }
    
  • 클라이언트에서 받은 정보를 서버에서 map에 넣어서 다시 반환한다. 그럼 그 정보를 처리할 수 있게 위 함수 success: function(resp)에서 정보를 풀어서 화면에 넣어준다. 여기서 resp는 당연 map타입이다.

    @ResponseBody
    @RequestMapping(value="/reqAjax2", method=RequestMethod.POST)
    public Map<String,String> reqAjax2(String name, String phone) {
        System.out.println("ajax 요청 도착!"+name +"," + phone);
        Map<String,String> map = new HashMap<String,String>();
        map.put("name",name);
        map.put("phone",phone);
        return map;
    }
    

요청보내기 4 - JSON으로 보내기 (map으로 받기)

  • map으로 받기 위해서, 요청을 보낼때와 받을 때 추가 작업을 해줘야한다.

  • $.ajax 안에 , contentTpye과 dataType을 추가로 넣어주고, 데이터도 JSON.stringify() 안에 넣어 보낸다.

    function reqAjax2() {
        var name = $("#username").val();
        var phone = $("#phone").val();
        if(name.trim() =='' || phone.trim()==''){
            alert('데이터를 입력해주세요')
            return;}
        //서버로 보낼 데이터 준비 : 파라미터로 만들기 . json 으로 만들기
        var sendData = {"name":name,"phone":phone}
        $.ajax({
            url:'reqAjax2'
            , method : 'POST'
            , data: JSON.stringify(sendData)
            ,contentType : 'application/json; charset=UTF-8'
            ,dataType : 'json'
            , success :function(resp){
                alert( JSON.stringify(sendData))
            }
        })
    }
    
  • 받은 쪽에서도 추가작업이 필요하다. @RequestBody param에 붙여줘야지 jsp에서 넘어온 json 데이터를 무사히 받을 수 있다.!

    @ResponseBody
    @RequestMapping(value="/reqAjax2", method=RequestMethod.POST)
    public Map<String,String> reqAjax2(@RequestBody Map<String,String> map ) {
        System.out.println(map);
        return map;
    }
    

요청보내기 5 - vo로 보내기

  • 링크를 클릭하면 javascript의 특정 함수가 실행되게 하기 위해 a href 다음 “javascript:함수명()” 이렇게 쓰면된다.

    <li>Ajax 3 (VO)<br>
        <a href ="javascript:reqAjax3()">VO데이터 수신</a><br>
        <span id ="req3" style = "color : red"></span>
    
  • 그러면 다음의 js 함수가 호출된다. url와 method는 서버의 어떤 함수로 가야하는지 알려주고, 그 함수를 갔다 온 후 성공실패를 success 를 통해 알 수 있다.

    function reqAjax3() {
        $.ajax({
            method : 'GET',
            url:'reqAjax3',
            success : function(resp){
                var respData = "replyseq : " + resp["replyseq"]+", boardseq : "+ resp["boardseq"]+", userid : "+ resp["userid"]+", replytext : "+ resp["replytext"]+", regdate : "+ resp["regdate"];
                $("#req3").html(respData);
            }
        })
    }
    
  • 다음과 같이 서버에서 객체의 값을 넣는다. 이걸 위 함수 success의 resp로 받는다. 비록 객체로 서버에서 전송을 했지만, JSON 타입으로 전송이 온다!

    @ResponseBody
    @RequestMapping("/reqAjax3")
    public  Reply reqAjax3(String name, String phone) {
        Reply reply = new Reply();
        reply.setBoardseq(1);
        reply.setRegdate(new Date().toString());
        reply.setReplytext("댓글입니다.");
        reply.setUserid("hong");
        return reply;
    }
    

    응답 받기1 - VO보내고 VO리스트 받기

  • 앞의 예시들은 클라이언트에서 요청을 보내고 서버에서 요청을 받는데 집중했다.

  • 이번에는 서버에서 온 응답을 받는 것을 볼 것이다.

  • 서버에서 리스트를 받아 화면에 출력하는 예제

    - 버튼 누르기 전, - 버튼 누른 후

  • javascript 코드

    • 요청보내기 4번 에서 나온 것과 같이 객체를 보낸다.
    • 서버에서 응답 받으면 success : 후 코드가 실행된다.
    • $.each 문을 사용해 리스트의 객체들을 하나씩 꺼내주고, 그걸 table에 나타나게 해준다.
    function reqList() {
        //서버로 보낼 데이터 준비 : 파라미터로 만들기 . json 으로 만들기
        var sendReply = {"regdate":"2020/12/21","replytext":"I am so cute!","userid":"pin","replyseq":"1"}
        $.ajax({
            url:'reqList'
            , method : 'POST'
            , data: JSON.stringify(sendReply)
            ,contentType : 'application/json; charset=UTF-8'
            ,dataType : 'json'
            , success :output
        })
    }
    function output(resp){
        var result = '';
        result +='<table border="1">'
        result +='<tr><th>글쓴이</th><th>댓글내용</th><th>글쓴날</th></tr>'
        $.each(resp,function(index,item){
            result +='<tr><td>'+item["userid"]+'</td>'
            result +='<td>'+item["replytext"]+'</td>'
            result +='<td>'+item["regdate"]+'</td></tr>'
        })
        result +='</table>'
        $(resultList).html(result)
    }
    
  • 서버에서 list 에 add하고, return 하는 코드. requestBody를 넣어서 json 데이터를 받을 수 있게 한다.

    @ResponseBody
    @RequestMapping(value="/reqList", method=RequestMethod.POST)
    public List<Reply> reqList(@RequestBody Reply reply ) {
        List<Reply> list = new ArrayList<Reply>();
        list.add(reply);
        list.add(new Reply(2,1,"김","김먹고싶다","2020/12/12"));
        list.add(new Reply(3,1,"이","이상해","2020/12/12"));
        list.add(new Reply(4,1,"박","박수쳐","2020/12/13"));
        list.add(new Reply(5,1,"최","최근에","2020/12/14"));
        list.add(new Reply(6,1,"조","조조영화","2020/12/15"));
        return list;
    }
    

© 2018. All rights reserved.

Powered by Hydejack v8.5.2