[javascript] ajax object담긴 Array 보내고 Controller에서 받기

 

평소처럼 ajax로 controller에 데이터를 보내야 하는데 이번에는 데이터를 하나 두 개 정도가 아니고

내가 선택한 Row에 데이터를 삭제하기 위해 선택한 만큼의 id를 모아서 JSON Array형태로 만들어 보내야 했다.

여러 가지를 이번에 시도하면서 ajax에서 controller로 데이터를 보내는 형식을 내가 너무 몰랐구나 싶었던

생각이 들었다.

 

 

1차 시도

원래 하던 식으로 var list = []에 내가 원하는 형식 data = { "exampleKey1" : value1, "exampleKey2" : value2 }를 만들어 list에 넣어주고 보내줄 생각이었다.

 

실패

controller에서 받을 수 조차 없었다. 이유는 back에서 data를 String []로 받았는데 이상하게 null이 떨어진다.

 

다시 검색

 ajax 속성에 traditional : true주면 배열의 값을 자바단에 넘겨줄 수 있게 만든다 이것을 바탕으로 2차시도

 

 

2차시도

traditional 속성을 주고 보내고 String []을 for문으로 돌렸다.

 

실패

Object형이 나온다?

더욱 더 뭐가 뭔지 알 수가 없었다.

 

다시 검색

확인해 보니 javascript를 이용해서 View -> back으로 데이터를 만들어서 보내 주었기 때문에

결국은 쉽게 말해 back 입장에서는 view에서 다른 언어를 하는 친구가 뭔가를 보내긴 했는데 알 수가 없으니 Object형으로 인식을 해버리는 서글픈 상황이 나타나는 것이었다. 

 

그럼 이제 어떻게 해야할지 알았으니, 확실히 판단을 해야 한다.

1. View에서 내가 어떤 가공 순으로 만들어서 보낼지

2. controller에서 어떻게 역 순으로 풀어낼지 

 


 

아래에서 볼 데이터의 가공 및 해체 흐름

View :  dataArray 생성 -> json.stringify( json 객체를 String 객체로 변환 ) -> ajax 통신

 

Back :  String으로 data를 받음 -> jsonArray로 array형태를 만들어줌 -> jsonobject로 array안에 있는 것들을 받아줌

 

위의 가공과 해체순이 완료되면

 

 Map<String, Object>으로 내가 원하는 Key와 Value값을 넣어줌 -> List<Map<String, Object>>로 map을 list에 넣음

그러고선 mapper에 값을 넘기면 끝

 

 

 

index.html

	var list = [];
	var test1 = $('input[name=main_checkbox]:checked');
	$(test1).each(function(){
		var jbString = $(this).val();
		var jbSplit = jbString.split(',');
		var listdata = {"Nation" : jbSplit[0],"Brand" : jbSplit[1]};
		list.push(listdata);
	});
	var jsonData = JSON.stringify(list);

	$.ajax({
		url    : "home.class"
		, type : "POST"
		, traditional :true
		, data   : {'jsonData' : jsonData}
		, dataType : "json"
		, success : function(xhr){
			alert(xhr.message);
		}
	});

 

 

home.class

		String str = reqVo.getString("jsonData");
		JSONArray arr = JSONArray.fromObject(str);
		
		 List<Map<String, Object>> resendList = new ArrayList<Map<String, Object>>();
		 for(int i=0; i<arr.size(); i++){
		           
		        JSONObject obj = (JSONObject)arr.get(i);
		        Map<String, Object> resendMap = new HashMap<String, Object>();
		        resendMap.put("Nation", obj.get("Nation"));
		        resendMap.put("Brand", obj.get("Brand"));
		            
		        resendList.add(resendMap);
		  }
		  reqVo.put("i_arrStr", resendList);
          	services.defaultMapper(reqVo);

 

 

defaultMapper.xml

	DELETE FROM GLB_TB WHERE
<foreach collection="i_arrStr" item="item" separator="OR">
	V_NATION = #{item.Nation} AND V_BRAND = #{item.Brand}
</foreach>

 

 

 

 

참고 블로그

https://mingggu.tistory.com/m/91

 

Object 배열 ajax 로 Java 에 넘기기 (String 을 JSONArray 로, JSONArray 를 List Map 으로)

jsp 나 xml 같은 화면단에서 같은 형식의 여러 데이터를 object 배열에 담아 java 로 보낸 후 java에서 list map 형식으로 바꿔 사용할때! 데이터를 담아 보낸 뒤 java 에서 푸는 과정에 오류가 생겨 고생햇

mingggu.tistory.com