(Asynchronous JavaScript And XML)
서버로부터 데이터를 가져와서 전체 페이지를 새로 고치지 않고 일부만 로드할 수 있게 하는 기법
동기식(a, form, submit) : 응답페이지가 돌아와야만 볼 수 있음(페이지가 깜빡거림)
-요청 처리 후 그에 해당하는 응답페이지가 돌아와야만 그 다음 작업 가능
-서버에 요청한 결과까지의 시간이 지연되면 무작정 기다려야 됨(흰 페이지로 보여짐)
-전체 페이지를 응답해주기 때문에 기본적으로 페이지가 깜빡거림
비동기식(ajax)
-현재 페이지를 그대로 유지하면서 중간중간 추가적으로 필요한 요청을 보내 줄 수 있음
-요청을 보냈다고 해서 다른 페이지로 넘어가지 않음(현재 페이지 그대로 유지)
-요청을 보내놓고 그에 해당하는 응답(데이터)가 돌아올 때까지 현재페이지에서 다른 작업을 할 수 있음
-페이지가 깜빡거리지 않음
ex) 실시간 검색어 로딩, 검색어 자동 완성기능, 아이디 중복체크, 찜하기/해제, 추천, 댓글, 무한스크롤 등
* jQuery방식으로 AJAX통신
$.ajax({
속성명:속성값,
속성명:속성값,
속성명:속성값,
...
});
* 주요속성
* 부수적인 속성
--jsp파일
<h1>jQuery 방식을 이용한 AJAX 테스트</h1>
<h3>1. 버튼 클릭시 get방식으로 서버에 요청 및 응답</h3>
입력 : <input id="input1"> <button id="btn1">전송</button>
<br>
응답 : <span id="output1">현재응답없음</span>
<script>
$(function() {
$("#btn1").click(function() {
// 기존 동기식 방식
// location.href = "jqAjax1.do?input=" + $("#input1").val();
$.ajax({
url : "jqAjax1.do",
data : {input : $("#input1").val()}, //키와 값을 쌍으로 하여 객체 생성
type : "get",
success : function(result) { //response로 들어온 값은 변수 result에 들어옴
console.log(result);
$("#output1").text(result);
},
error: function() {
console.log("ajax통신실패");
},
complete: function() {
console.log("ajax통신여부와 상관없이 출력");
}
});
})
})
</script>
<form name="regFrm" method="get" action="idCheck.me"> <!-- 서블릿 확장자는 do, me같은 마음대로 -->
<p>아이디 <input name="id" required>
<input type="button" value="ID중복확인" onclick="idCheck();">
</p>
<input type="submit" value="회원가입" disabled>
</form>
<label id="result"></label>
<script>
//작성박스 바로 밑에 중복결과 보이게 하기
function idCheck() {
$.ajax ({
url : "idCheck.me",
data : {checkId : $("#id").val()},
type : "get",
success: function(result) {
if(result == 'idN') {
$("#result").text("이미 사용중이거나 탈퇴한 아이디입니다").css("color","red");
} else {
$("#result").text("멋진 아이디네요").css("color", "green");
}
},
error:function() {
console.log("아이디 중복체크용 ajax통신 실패");
}
});
}
/* 중복 결과 alert창으로 보이게 하기
function idCheck() {
const $idInput = $("form input[name=id]");//$를 넣으면 jQuery에서 쓰는 변수임을 암시
$.ajax ({
url : "idCheck.me",
data : {checkId : $idInput.val()},
success: function(result) { //idY 또는 idN값이 들어옴
if(result == 'idN') {
alert("이미 사용중이거나 탈퇴한 아이디입니다");
$idInput.val(""); //입력한 값 자동으로 비워지게 하기
$idInput.focus();
} else {
if(confirm("시용가능한 아이디입니다. 사용하시겠습니까?")) {
$("form :submit").removeAttr("disabled");
$idInput.attr("readonly", true);
} else {
$idInput.focus();
}
}
},
error:function() {
console.log("아이디 중복체크용 ajax통신 실패");
}
});
} */
</script>
</body>
</html>
--Ajax java파일(ajax 처음 개념 배우면서 어떻게 통신하는지 배우는 파일)
package com.kh;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/jqAjax1.do")
public class JqAjaxController1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String str = request.getParameter("input");
System.out.println("요청시 전달값: " + str);
// DB에서 요청처리를 다 했다는 가정하에 응답할 데이터
String responseDate = "입력된 값: " + str + ", 길이: " + str.length();
//응답데이터 돌려주기
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html>");
response.getWriter().print(responseDate);
}
}
--servlet파일
package com.kh;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/idCheck.me")
public class AjaxIdCheckController extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String checkId = request.getParameter("checkId");
//데이터 베이스 연동(커넥션풀과 bean파일, Mgr파일, jdbc.jar파일 있어야함)
MemberMgr mm = new MemberMgr();
boolean result = mm.checkId(checkId);
//boolean result = new MemberMgr().checkId(checkId); 한줄로 쓰면 이렇게
/* 되돌려 주는 값에 한글이 없을 경우 생략해도 됨
response.setContentType("text/html; charset=UTF-8");
*/
if(result) {
response.getWriter().print("idN"); //id가 있어서 쓸 수 없음
} else {
response.getWriter().print("idY");
}
}
}
--java파일
package com.kh;
import java.sql.*;
//아이디를 입력하면 db에 있는지 db와 연동하는 프로그래밍 자바 파일
public class MemberMgr {
private DBConnectionMgr pool;
public MemberMgr() {
pool = DBConnectionMgr.getInstance();
}
public boolean checkId(String id) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
boolean flag = false;
try {
con = pool.getConnection();
String sql = "SELECT id FROM MEMBER WHERE id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
flag = rs.next();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return flag;
} //checkId end
//데이터 추가할 때
public boolean insertMember(MemberBean bean) { //자료타입: MemberBean 변수명: bean
Connection con = null;
PreparedStatement pstmt = null;
boolean flag = false;
try {
con = pool.getConnection();
String sql = "INSERT INTO MEMBER VALUES(?,?,?,?,?,?,?,?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bean.getId());
pstmt.setString(2, bean.getPwd());
pstmt.setString(3, bean.getName());
pstmt.setString(4, bean.getGender());
pstmt.setString(5, bean.getBirthday());
pstmt.setString(6, bean.getEmail());
pstmt.setString(7, bean.getZipcode());
pstmt.setString(8, bean.getAddress());
pstmt.setString(9, bean.getDetailAddress());
String hobby[] = bean.getHobby();
char hb[] = {'0','0','0','0','0'};
String lists[] = {"운동","넷플릭스","독서","음악감상","여행"};
if(hobby != null) { //취미는 not null값이 아니니까 선택 안 할 수도 있음
for(int i=0; i<hobby.length; i++) {
for(int j=0; j<lists.length; j++) {
if(hobby[i].equals(lists[j])) {
hb[j] = '1';
break;
}//if end
}//중첩for end
}//for end
}
pstmt.setString(10, new String(hb));
pstmt.setString(11, bean.getJob());
if (pstmt.executeUpdate() == 1) //데이터 베이스의 내용이 바뀌면 executeUpdate, 조회는 executeQuery
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
return flag;
}
public boolean loginMember(String id, String pwd) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
boolean flag = false;
try {
con = pool.getConnection();
String sql = "SELECT id FROM MEMBER WHERE id=? and pwd=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id); //?에 해당하는 값들 불러오기
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
flag = rs.next();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return flag;
}
}