Ajax
Ajax_개념_JSON
climb-up
2022. 5. 13. 19:17
JSON (JavaScript Object Notation)
: Map(키, 밸류)방식
: 라이브러리 필요
문제점
1) 형태는 객체인데 타입이 String이라 활용이 어렵다.
2) 인코딩을 해줘야한다.
해결방법
response.setContentType("application/json; charset=UTF-8");
: 제이슨방식+인코딩 문제를 한 번에 해결.
(dataType에서 작성해주는 것을 권장한다.) --> dataType: 'json',
1) obj[attr] : 불완전했을 때 $_ 등등 들어가있을 때 사용
2) obj.attr : 완전했을 때 사용
$('#p').text(resultStr);
$('#textarea').val(resultStr); --> input, textarea는 val()을 사용해야한다.
<데이터 전송, 서버에서 객체 반환>
유저 번호 보내서 해당 유저 정보 가져오기
유저번호: <input type="text" id="userNo">
<button id="getB">정보 가져오기</button>
<p class="test" id="p"></p>
<textarea class="test" id="textarea" rows="5" cols="40"></textarea>
<script>
$('#getB').click(function(){
var userNo = $('#userNo').val();
$.ajax({
url:'jQuery.do',
data:{userNo:userNo},
dataType: 'json',//제이슨 데이터타입을 작성해주는 것을 권장
success: function(data){//data(object) 안에 key가 있다. key=userNation, userNo, userName
console.log(data);//String이라 활용하기 어려움
var resultStr = "";
if(resultStr != null){
resultStr = data.userNo + ", " + data.userName + ", " + data.userNation;
} else {
resultStr = "해당 회원이 없습니다.";
}
$('#p3').text(resultStr);
$('#teatarea').val(resultStr);//input, textarea는 val() 사용.
},
error: function(data){
console.log(data);
}
});
});
</script>
@WebServlet("/jQuery5.do")
public class JQueryAjaxServlet5 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ArrayList<User> userList = new ArrayList<User>();
userList.add(new User(1, "강건강", "대한민국"));
userList.add(new User(2, "타일러 라쉬", "미국"));
userList.add(new User(3, "쯔위", "중국"));
userList.add(new User(4, "모모", "일본"));
userList.add(new User(5, "리사", "태국"));
userList.add(new User(6, "알베르토 몬디", "이탈리아"));
userList.add(new User(7, "조나단", "콩고"));
//원래 디비에 갔다와야되는데 일단 그런 효과만 주기위해 작성한 것이다.
int userNo = Integer.parseInt(request.getParameter("userNo"));
User user = null;
for(int i = 0; i < userList.size(); i++) {
if(userList.get(i).getUserNo() == userNo) {
user = userList.get(i);
}
}
JSONObject userObj = null;
if(user != null) {//해당 유저번호가 있을때
userObj = new JSONObject();//JSONObject() Map형식이라 put 사용
userObj.put("userNo", user.getUserNo());//키,벨류로 다 옮겨적음
userObj.put("userName", user.getUserName());
userObj.put("userNation", user.getUserNation());
}
// response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=UTF-8");//제이슨방식+인코딩 문제점을 한번에 해결
PrintWriter pw = response.getWriter();
pw.print(userObj);//스트링으로 넘어가서 활용하기 좋지 않은 방법이다.User [userNo=6, userName=알베르토 몬디, userNation=이탈리아]
}
<서버로 기본 값 전송, 서버에서 리스트 객체 반환>
유저 번호 전송 -> 해당 유저가 있는 경우 유저 정보, 없는 경우 전체 가져오기
유저 번호 : <input type="text" id="userNo2">
<button id="getUserInfoBtn2">정보 가져오기</button>
<p class="test" id = "p4"></p>
<textarea rows="5" cols="40" class="test" id="textarea4"></textarea>
<script>
$('#getUserInfoBtn2').click(function(){
$.ajax({
url: 'jQuery6.do',
data: {userNo:$('#userNo2').val()},
success: function(data){
console.log(data);//객체배열 , 없는 유저번호를 찍으면 객체배열
//JSONObject 중첩
// var result = "";
// for(var i in data){//data:객체 i:객체의 키 (벼열이라면 인덱스)
// if(typeof data[i] != 'object'){//타입이 오브젝트인지 아닌지 나눠준다.//키값이 쭉 나오기때문에
// result = data.userNo + ", " + data.userName + ", " + data.userNation;
// } else{//객체의 오브젝트
// // result += data[i].userNo + ', ' + data[i].userName + ', ' + data[i].userNation + "<br>";//p태그 버전
// result += data[i].userNo + ', ' + data[i].userName + ', ' + data[i].userNation + "\n";//textarea 버전
// }//이어서 들어가니까 꼭 +=를 사용한다
// }
// // $('#p4').html(result);//br을 텍스트로 인지해서 .html로 해준다.
// $('#textarea4').val(result);//textarea 버전
////JSONArray 사용 (ArrayList와 비슷)
var result = "";
for(var i in data){//i:인덱스
// result += data[i].userNo + ", " + data[i].userName + ", " + data[i].userNation + "<br>";//p
result += data[i].userNo + ", " + data[i].userName + ", " + data[i].userNation + "\n";//textarea
}
$('#p4').html(result);
$('#textarea4').val(result);
},
error: function(data){
console.log(data);
}
});
});
</script>
@WebServlet("/jQuery6.do")
public class JQueryAjaxServlet6 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ArrayList<User> userList = new ArrayList<User>();
userList.add(new User(1, "강건강", "대한민국"));
userList.add(new User(2, "타일러 라쉬", "미국"));
userList.add(new User(3, "쯔위", "중국"));
userList.add(new User(4, "모모", "일본"));
userList.add(new User(5, "리사", "태국"));
userList.add(new User(6, "알베르토 몬디", "이탈리아"));
userList.add(new User(7, "조나단", "콩고"));
//원래 디비에 갔다와야되는데 일단 그런 효과만 주기위해 작성한 것이다.
int userNo = Integer.parseInt(request.getParameter("userNo"));
User user = null;
for(int i = 0; i < userList.size(); i++) {//없으면 다 출력, 있으면 그 유저정보만 출력
if(userList.get(i).getUserNo() == userNo) {
user = userList.get(i);
}
}
//JSONObject 중첩
// JSONObject userObj = new JSONObject();
// if(user != null) {
// //user 1개 => 해당 user 전송
// userObj.put("userNo", user.getUserNo());//키,벨류로 다 옮겨적음
// userObj.put("userName", user.getUserName());
// userObj.put("userNation", user.getUserNation());
// } else {
// //user null => 전체 user 전송
// for(int i = 0; i < userList.size(); i++) {
// JSONObject obj = new JSONObject();
// obj.put("userNo", userList.get(i).getUserNo());//키,벨류로 다 옮겨적음
// obj.put("userName", userList.get(i).getUserName());
// obj.put("userNation", userList.get(i).getUserNation());
//
// userObj.put(i, obj);
// }
// }
//JSONArray 사용 (ArrayList와 비슷)
//순서를 유지하면서 여러개를 담을 수 있다.
JSONArray userArr = new JSONArray();
JSONObject userObj = null;
if(user != null) {
userObj = new JSONObject();
userObj.put("userNo", user.getUserNo());
userObj.put("userName", user.getUserName());
userObj.put("userNation", user.getUserNation());
userArr.add(userObj); //else일때 여러개를 담을 수 있게 이렇게 설정한다
} else {
for(User userInfo : userList) {
userObj = new JSONObject();
userObj.put("userNo", userInfo.getUserNo());
userObj.put("userName", userInfo.getUserName());
userObj.put("userNation", userInfo.getUserNation());
userArr.add(userObj);
}
}
response.setContentType("application/json; charset=UTF-8");
// response.getWriter().print(userObj);
response.getWriter().print(userArr);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}