본문 바로가기
CLASS/AJAX

#21-1 / front에서 JSON 전송 => Ajax , @ResponseBody

by hingu 2024. 7. 26.

⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐

@ResponseBody

값을 다시 되돌려 보낼땐 이걸 꼭 mapping 아래 작성 해야함!!!!!!!

 

 

❗ 

post : data를 front에서 보내고 다시 돌려받을게 없는 경우

get : 주고 받아서 front에서 출력해야하는 경우엔 필히 get 사용

 

 

❗ ajax 통신 - CORS방식 무조건 넣어줘야함! (CORS 무조건 핸들링해야함)

@CrossOrigin(origins="*", allowedHeaders = "*")

 

  👀 @GetMapping

- jsp

<body>
	<input type="button" value="클릭" id="btn">
</body>

<script>

    $(function(){
        $("#btn").click(function(){
            var $data = new Array();
            $data[0] = "20";
            $data[1] = "30";
            $data[2] = "40";
            //console.log($data); //배열 출력
            //console.log($data.join(",")); //20,30,40 문자로 출력

            $.ajax({
                url:"./ajaxok.do",
                cache:false,
                dataType:"json", //or text
                contentType:"application/json",
                type:"get",
                data:{
                    //key
                    "all_data":$data.join(",")
                },
                success:function($result){
                    console.log($result)
                },
                error:function(){
                    console.log("에러발생")
                }
            });
        });
    })

</script>

 

=>  join : JSON.stringfy 형태로 변화

 

- controller

@CrossOrigin(origins="*", allowedHeaders = "*")
@GetMapping("/ajaxok.do")
public String ajaxok(
            @RequestParam(value="all_data") List<String> alldata,
            HttpServletResponse res
        ) throws Exception{
        //requestparam의 value는 꼭 front 에서 data: 에 key 작성한 대로 받아야함
          //List 변수명은 달라도 상관 없음
    System.out.println(alldata); //[20, 30, 40]
    System.out.println(alldata.get(0)); //20

    this.pw = res.getWriter();

    //-- front에서 dataType:json으로 받는 경우
    JSONObject jo = new JSONObject();
    jo.put("result", "ok");
    this.pw.print(jo);

    //-- front에서 dataType:text으로 받는 경우
    //this.pw.print("ok");

    return null;
}

 

@RequestParam 

배열을 이용하여 대표키로 전달 또는 대표키 없이  보조키로 전달 될 경우 사용 가능

requestparam의 value는 꼭 front 에서 data: 에 key 작성한 대로 받아야함 ( List 변수명은 달라도 상관 없음 )

=> get으로 주고 받을 경우

 

@RequestBody

: post일 때 @RequestBody를 넣으면 날라옴

: JSON기반일 경우에 사용 (contentType:"application/json" 일 때) => json이 아니면 RequestParam

 

@ResponseBody

: 미디어타입 형태일 경우 (ajax로도 파일을 전송할 수 있다!) / 파라미터타입 형태일 경우

: 단 , 절대 인자값 위치에 선언하지 않음 (  public String test( 여기들어오면 안됨 ){}  ) => 별도로 빼세욤

 

 

  👀 @PostMapping

- jsp

<body>
	<input type="button" value="클릭" id="btn"><br><br>
	<input type="button" value="post_ajax" id="btn2">
</body>

<script>

	$("#btn2").click(function(){
		var $data = new Array();
		$data[0] = "홍길동";
		$data[1] = "강감찬";
		$data[2] = "이순신";
		
		$.ajax({
			url:"./ajaxok2.do",
			type:"post",
			cache:false,
			dataType: "json",
			contentType:"application/json",
			data:JSON.stringify({
				"all_data":$data
			}),
			success:function($result){
				console.log($result);
			},
			error:function(){
				console.log("에러발생")
			}
		})
	})

</script>

=> JSON.stringfy : Object 형태로 전달

 

- controller

@CrossOrigin(origins = "*", allowedHeaders = "*")
@PostMapping("/ajaxok2.do")
public String ajaxok2(@RequestBody String all_data,HttpServletResponse res) throws Exception{
    res.setContentType("text/html;charshet=utf-8");
    this.pw = res.getWriter();
    //System.out.println(all_data);

    /* 1. (@RequestBody String all_data) 일 경우 
        System.out.println(all_data);
       {"all_data":["홍길동","강감찬","이순신"]} =>jsonObject로 뜯을수 있다(key : all_data)
       => 이걸 배열로 뜯으려면 (JSONArray)로 받아야함;
       */

    JSONObject jo = new JSONObject(all_data);
    //System.out.println(jo.get("all_data")); //["홍길동","강감찬","이순신"]

    JSONArray ja = (JSONArray)jo.get("all_data");
    //이렇게 받아야 back에서 array 핸들링 가능(그냥 jo.get("all_data") 이걸로는 get으로 안받아짐 )
    
    System.out.println(ja.get(0)); //홍길동

    //front에서 dataType:json으로 받겠다고 해서 json으로 보내줘야함
    JSONObject result = new JSONObject();
    result.put("result","ok"); //잘 받았다

    this.pw.print(result);

    return null;
}

=> @RequestBody 로 받은 이유 : front에서 JSON.stringfy 로 보냈기 때문에

 

⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐

=> front에서 JSON.stringfy 로  보내진 {"all_data":["홍길동","강감찬","이순신"]} 

     저 key 배열 형태로 받은 JSONObject를 ja로 옮겨담아야  ( (JSONArray) 로 형변환 )

     get(0) 등으로 진짜 배열로써 핸들링 할 수 있다!

 

 

요렇게 잘 찍힘

 

 

 

  👀 json배열 응용

- test1

/**/

 

 

- test1

/**/

 

 

- test1

/**/

 

 

  👀 숙제