jQuery (23)

반응형

 

fetch

 

: Promise기반 ES6 내장 라이브러리API를 간편하게 호출할 수 있다.
  
기존 비동기처리는 이벤트를 기반으로 하는 XHR객체를 사용했으나 이후 http요청에 최적화된 api들이 생겨나기 시작

=> fetch(Promise), Axios(xhr, promise)

 

 
- 결과 반환 전까지의 3개 상태 (이행/거부에 해당하는 두 개의 콜백함수를 인자로 받음)
resolve : 해결, 이행, 완료시 결과를 표현하며 then()을 통해 처리결과를 전달받을 수 있음
reject : 거부, 실패시 결과를 표현하며 catch()로 에러정보를 받을 수 있음

 

 

- 사용 방법

Fetch(requestInfo(URL), requestInit(OPTION))

 

 

 

- 응답 객체 제공 메소드

형태
text() 응답을 텍스트로 변환
json() 응답을 JSON형태로 파싱
blob() 응답을 blob형태로 반환(멀티미디어 데이터를 다룰 때 사용)

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input id="userId" value="b001">
	<input type="password" id="userPw" value="1004">
	<button>버튼</button>
	<div></div>

<script>
	document.querySelector('button').addEventListener('click', function(){
		

		let userId = document.querySelector('#userId').value;
		let userPw = document.querySelector('#userPw').value;
	
		let opt = {
				method: 'post', 
				body: new URLSearchParams("uId=" + userId + "&uPw=" + userPw)
			};
		
		let rst = fetch("loadTest.jsp", opt);
	// 	console.log(rst);
	 			
		rst.then( rst => rst.json() ) // json정보를 파싱처리
			.then( data => data.rst ) // 파싱처리된 결과 (=객체로 변환된) 결과를 매개변수가 받음 
	// 		.then( data1 => console.log("1회 출력된 정보는 더이상 출력되지 않음", data1))
			.then( data2 => {
				if(data2 == "ok") document.querySelector('div')
													.innerHTML = "<mark>로그인 " + data2 + "</mark>";
				else document.querySelector('div').innerText = "회원정보가 맞지 않음";
			})
			.catch(err => console.log("에러>> ", err))
			.finally(alert("성공/실패 상관없이 무조건 뜸"));
	});
</script>
</body>
</html>

 

결과 화면1-1 : 버튼 클릭 후

 

결과 화면1-2 : 로그인 성공 시

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

jQuery를 이용한 Ajax

 

 

Eclipse를 사용하며 프로젝트를 진행한다.

 

방법
type 데이터를 전송하는 방법을 지정한다. (“GET”, “POST”)
data 서버로 데이터를 전송할 때 사용한다. 
success 성공했을 때 호출할 콜 백을 지정한다.
ex) function( PlainObject result, String textStatus, jqXHR )
error 실패했을 때 호출할 콜 백을 지정한다 
ex) function(jqXHR  xhr,  String status,  String error)
datatype 서버 측에서 전송한 응답 데이터를 어떤 형식의 데이터로 해석할 것인가를 지정한다.
ex) xml, json, script, html

 

 

 

jQueryAJAX.html

<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
	//jQuery AJAX
	$.ajax({
		url : 'dummy.txt',
		type : 'get', // method속성도 활용가능, get방식일때 생략가능
// 		data : , // 요청 보낼 정보가 없을 때는 생략 가능
		success : function(rst) {
			console.log("응답 결과 >> ", rst);
		},
		error : function(xhr) { // xmlhttpsrequest
			alert("에러 상태 : " + xhr.status)
		},
// 		dataType : 'text' // 생략 가능하며, 응답데이터의 형식에 맞춰 자동 설정됨
	})

</script>

 

결과 화면1

 

 

 

단축 메뉴 형식 사용

 

 

위치

webPro > WebContent > ajax > sample

 

 

ajax.json, ajax.xml, dummy.txt 파일

 

 

 

  • get 방식 : $.get()
<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
	// 단축메뉴
	// $.get(url, data, success, dataType)
	// $.post(url, data, success, dataType)
	// $.getJSON(url, data, success)

	$.get('sample/ajax.json', function(data){console.log(data)});
</script>

 

결과 화면2

 

 

 

  • post 방식  : $.post()
<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
	// 단축메뉴
	// $.get(url, data, success, dataType)
	// $.post(url, data, success, dataType)
	// $.getJSON(url, data, success)
    
	$.post('sample/ajax.xml', function(data){console.log(data)});
</script>

 

결과 화면3

 

 

 

  • $.getJSON()
<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
	// 단축메뉴
	// $.get(url, data, success, dataType)
	// $.post(url, data, success, dataType)
	// $.getJSON(url, data, success)

	$.getJSON('sample/ajax.json', function(rst){console.log(rst)})

</script>

 

결과 화면4

 

 

 

단축 메소드 : load()

 

: 서버와 통신하여 데이터를 가져오는 메소드로 ajax()보다 간소화된 비동기 호출 메소드
불필요한 리소스를 줄이고 코드를 간결하게 함

 

ex) $(selector).load(url, data, callback)

 

 

+JDBC로 DB정보 얻기

1. 연결할 DB가 설치되어야 함
2. 자바와 DB를 연결하기 위한 라이브러리 필요 ojdbc.jar
3. Class.forName("JDBC Driver명")을 이용해 드라이버 로딩
4. DriverManager를 통해 Connection객체 생성
5. SQL구문 실행을 위한 Statement객체 생성

 

 

 

- 사용 방법

$(selector).load(URL, data, callback);

 

 

 

load.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
div {
  border: 1px solid;
  width: 50%;
  height: 10vh;
}
</style>
</head>
<body>

	<input id="userId">
	<input type="password" id="userPw">
	<button>버튼</button>
	
	<div id="d1"></div>
	<div id="d2"></div>
	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>

	$('button').on('click', function() {
		
/* 
	load() : 서버로부터 응답받은 데이터를 선택한 html요소 콘텐츠로 대체
		서버와 통신하여 데이터를 가져오는 메소드로 ajax()보다 간소화된 비동기 호출 메소드
		불필요한 리소스를 줄이고 코드를 간결하게 함
		
		$(selector).load(url, data, callback)
*/
		let $uId = $('#userId').val();
		let $uPw = $('#userPw').val();
		
		$('#d1').load('loadTest.jsp', {uId:$uId, uPw:$uPw}, f_cb);
		
	});
	
	// a - 성공시 결과 전달, b - 호출상태문자(statusText), c - xhr객체(로 속성접근가능)
	function f_cb(a,b,c) {
// 		alert( JSON.parse(a).rst ); // ok 또는 false
		let data = JSON.parse(a).rst;
		if(data == "ok") {
			$('#d2').text("회원 정보로 로그인 " + data).css('color', 'green');
		} else {
			$('#d2').text("회원 정보로 로그인 " + data).css('color', 'red');
		}
		alert(b); // success
		alert(c.statusText); // success
	}

</script>
</body>
</html>

 

 

loadTest.jsp

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String uId = request.getParameter("uId");
	String uPw = request.getParameter("uPw");
	System.out.println("이클립스 콘솔상에서 확인해주세요. >> " + uId);

	Class.forName("oracle.jdbc.driver.OracleDriver");
	String url = "jdbc:oracle:thin:@localhost:1521:xe";
	Connection conn = DriverManager.getConnection(url, "pc10", "java");
	Statement stmt = conn.createStatement();
	
	String sql = "select mem_id from member "
				+ "where mem_id = '" + uId
				+ "' and mem_pass = '" + uPw + "'";
	ResultSet rs = stmt.executeQuery(sql);
	
	if(rs.next()) {
		// 정보 있는 응답 데이터 생성
%>
		{"rst" : "ok"}
<%
	} else {
		// 정보 있는 응답 데이터 생성
%>
		{"rst" : "fail"}
<%
	} // if end
%>

 

결과 화면5

 

 

반응형

'jQuery' 카테고리의 다른 글

[jQuery] 23장 fetch  (0) 2024.03.04
[jQuery] 21장 Ajax를 이용한 페이지 예제  (0) 2024.02.28
[jQuery] 20장 Ajax  (0) 2024.02.27
[jQuery] 19장 JSON  (1) 2024.02.27
[jQuery] 18장 콜백 함수와 체이닝, 동기와 비동기  (1) 2024.02.27
반응형

 

예제

 

 

Eclipse를 사용하며 프로젝트를 진행한다.

 

 

  • get 방식

 

ajax.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input value="저스티스타이탄">
	<input type="button" value="get">
	<div></div>
	
<script>
	"use strict";
	
	let v_btns = document.querySelectorAll('[type=button]');
	let v_disp = document.querySelector('div');
	
	v_btns[0].addEventListener('click', function() {
		
		let textVal = document.querySelector('input').value;
		
		// AJAX문법
		// 객체 생성은 각 함수마다 하나씩 정의해서 사용하고 전역으로 공통사용하지 않음(충돌위험성 높아짐)
		// 1. XMLHttpRequest()객체 생성
		let req = new XMLHttpRequest();
		
		// 2. open(설정) - url test.jsp
		req.open('get', 'test.jsp?senData='+textVal);
		
		// 4. onreadystatechange - readyState, status - responseText
		req.onreadystatechange = function(){
			if(req.readyState == 4 && req.status == 200) {
				console.log("응답 확인 >> ", req.responseText);
				v_disp.innerHTML = req.responseText;
			}
		}
		
		// 3. send()
		req.send();
	});
</script>

</body>
</html>

 

 

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	String data = request.getParameter("senData"); // get key
%>

<h4 style='color: red;'>응답 데이터: <%= data%></h4>

 

결과 화면1 : get 버튼 클릭 시

 

 

 

  • post 방식

 

ajax.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input value="저스티스타이탄">
	<input type="button" value="post">
	<div></div>
	
<script>
	"use strict";
	
	let v_btns = document.querySelectorAll('[type=button]');
	let v_disp = document.querySelector('div');
	
	// post
	v_btns[0].onclick = function(){
		
		let data = document.querySelector('input').value;
		
		let ajax = new XMLHttpRequest();
		ajax.open('post', 'test.jsp');
		ajax.addEventListener('readystatechange', function(){
			if(this.readyState == 4 && this.status == 200) {
				console.log("post response : ", this.responseText);
			}
		});
		ajax.setRequestHeader('content-type','application/x-www-form-urlencoded;');
        
 		// 데이터 '전달하는' 위치에서 인코딩 처리 >> 받는 곳에서 인코딩 처리 하지 않아도 됨
// 		ajax.setRequestHeader('content-type','application/x-www-form-urlencoded;charset=utf-8;');
		ajax.send("imkey=" + data); // urlencoded형식(key=value)으로 
	};
	
</script>

</body>
</html>

 

 

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	request.setCharacterEncoding("UTF-8"); // post로 데이터를 '전달받는' 위치에서 인코딩 처리하기
	
	// post의 경우 get과 달리 인코딩 처리를 하지 않아 한글이 깨짐 > 인코딩 처리해줘야 함
	String data = request.getParameter("imkey"); // post key
%>

<h4 style='color: red;'>응답 데이터: <%= data%></h4>

 

결과 화면2

 

 

 

서블릿 이용한 예제

 

 

ajax.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input value="저스티스타이탄">
	<input type="button" value="get">
	<input type="button" value="post">
	<div></div>
	
<script>
	"use strict";
	
	let v_btns = document.querySelectorAll('[type=button]');
	let v_disp = document.querySelector('div');
	
	v_btns[0].addEventListener('click', function() {
		
		let textVal = document.querySelector('input').value;
		
		// 1. XMLHttpRequest()객체 생성
		let req = new XMLHttpRequest();
		
		// 2. open(설정) - url test.jsp		
		// content-root유무에 따라 접근 경로 path를 다르게 작성해야 함 - [(context-root)/urlPatten]
		req.open('get', '/webPro/Ajax?senData='+textVal);
		
		// 4. onreadystatechange - readyState, status - responseText
		req.onreadystatechange = function(){
			if(req.readyState == 4 && req.status == 200) {
				console.log("응답 확인 >> ", req.responseText);
				v_disp.innerHTML = req.responseText;
			}
		}
		
		// 3. send()
		req.send();
	});
	
	// post
	v_btns[1].onclick = function(){
		
		let data = document.querySelector('input').value;
		
		let ajax = new XMLHttpRequest();
		ajax.open('post', 'test.jsp');
		ajax.addEventListener('readystatechange', function(){
			if(this.readyState == 4 && this.status == 200) {
				console.log("post response : ", this.responseText);
 				v_disp.innerHTML = req.responseText.replace('\n','<br>');
			}
		});
		ajax.setRequestHeader('content-type','application/x-www-form-urlencoded;');

		ajax.send("imkey=" + data);
	};
	
</script>

</body>
</html>

 

 

2. open(설정)에서의 /webPro/Ajax?senData= 부분 경로 확인

더보기
프로젝트에서 오른쪽 마우스 클릭 > Properties

 

Web Project Settings > Context root 부분의 경로 확인

 

 

Ajax.java

package ajax;

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("/Ajax")
public class Ajax extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Ajax() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String param = request.getParameter("senData");
		System.out.println("넘어온 데이터>>>>>>>>>>> " + param);
		
		response.setCharacterEncoding("utf-8");
		
		// 응답데이터 생성은 대부분 text(html)로 작성하며, 데이터는 바이너리기반/텍스트기반 스트림으로 작성
		PrintWriter wrt = response.getWriter();
		wrt.write(65); // A / 인수를 단일문자로 해석
		wrt.write(97); // a
		wrt.print(97); // 97 / 인수를 문자열로 변환
		wrt.write("전달하는 정보 >> " + param); // 요청 위치로 보내줄 응답 생성
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

}

 

결과 화면3-1 : get 버튼 클릭 시

 

결과 화면3-2

 

 

 

json  형식으로 응답정보 보내기

 

 

  • get 방식

 

ajax.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input value="저스티스타이탄">
	<input type="button" value="get">
	<input type="button" value="post">
	<div></div>
	
<script>
	"use strict";
	
	let v_btns = document.querySelectorAll('[type=button]');
	let v_disp = document.querySelector('div');
	
	v_btns[0].addEventListener('click', function() {
		
		let textVal = document.querySelector('input').value;
		
		// 1. XMLHttpRequest()객체 생성
		let req = new XMLHttpRequest();
		
		// 2. open(설정) - url test.jsp
		req.open('get', '/webPro/Ajax?senData='+textVal);
		
		// 4. onreadystatechange - readyState, status - responseText
		req.onreadystatechange = function(){
			if(req.readyState == 4 && req.status == 200) {
				let jsonObj = JSON.parse(req.responseText);
				console.log( "응답 확인 >> ", jsonObj);

				v_disp.innerHTML = "value정보만 >>> " + jsonObj.abc;
			}
		}
		
		// 3. send()
		req.send();
	});
	
</script>

</body>
</html>

 

 

Ajax.java

package ajax;

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("/Ajax")
public class Ajax extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Ajax() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String param = request.getParameter("senData");
		System.out.println("넘어온 데이터>>>>>>>>>>> " + param);
		
		response.setCharacterEncoding("utf-8");
		
		// 응답데이터 생성은 대부분 text(html)로 작성하며, 데이터는 바이너리기반/텍스트기반 스트림으로 작성
		PrintWriter wrt = response.getWriter();
		
		// JSON형태의 응답정보 보내기
		wrt.write("{\"abc\":\""+ param +"\"}");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

}

 

결과 화면4 : get 버튼 클릭시

 

 

  • post 방식

 

ajax.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input value="저스티스타이탄">
	<input type="button" value="get">
	<input type="button" value="post">
	<div></div>
	
<script>
	"use strict";
	
	let v_btns = document.querySelectorAll('[type=button]');
	let v_disp = document.querySelector('div');
	
	v_btns[0].addEventListener('click', function() {
		
		let textVal = document.querySelector('input').value;
		
		// AJAX문법
		// 1. XMLHttpRequest()객체 생성
		let req = new XMLHttpRequest();
		
		// 2. open(설정) - url test.jsp		
		// content-root유무에 따라 접근 경로 path를 다르게 작성해야 함 - [(context-root)/urlPatten]
		req.open('get', '/webPro/Ajax?senData='+textVal);
		
		// 4. onreadystatechange - readyState, status - responseText
		req.onreadystatechange = function(){
			if(req.readyState == 4 && req.status == 200) {
				let jsonObj = JSON.parse(req.responseText);
				console.log( "응답 확인 >> ", jsonObj);

				v_disp.innerHTML = "value정보만 >>> " + jsonObj.abc;
			}
		}
		
		// 3. send()
		req.send();
	});
	
	// post
	v_btns[1].onclick = function(){
		
		let data = document.querySelector('input').value;
		
		let ajax = new XMLHttpRequest();
		ajax.open('post', '/webPro/Ajax');
		
		ajax.addEventListener('readystatechange', function(){
			if(this.readyState == 4 && this.status == 200) {
				console.log("post response : ", this.responseText);
			}
		});

		// JSON형식 데이터로 요청
		ajax.setRequestHeader('content-type','application/json;');
		ajax.send(JSON.stringify({imkey : data})); 
	};
	
</script>

</body>
</html>

 

 

Ajax.java

package ajax;

import java.io.BufferedReader;
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("/Ajax")
public class Ajax extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Ajax() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String param = request.getParameter("senData");
		System.out.println("넘어온 데이터>>>>>>>>>>> " + param);
		
		response.setCharacterEncoding("utf-8");
		
		// 응답데이터 생성은 대부분 text(html)로 작성하며, 데이터는 바이너리기반/텍스트기반 스트림으로 작성
		PrintWriter wrt = response.getWriter();
		
		// JSON형태의 응답정보 보내기
		wrt.write("{\"abc\":\""+ param +"\"}");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String parameter = request.getParameter("imkey"); // JSON형식 데이터는 받지 못함
		System.out.println("post >>>>>>> " + parameter);
		
		request.setCharacterEncoding("utf-8");
		
		BufferedReader rd = request.getReader();
		String data = rd.readLine();
		System.out.println("데이터를 확인해보자 >> " + data);
	}

}

 

결과 화면5-1 : post 버튼 클릭시

 

결과 화면5-2

 

 

 

gson 라이브러리 사용

 

 

라이브러리 파일 lib 안에 집어 넣음

 

 

 

Ajax.java

package ajax;

import java.io.BufferedReader;
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;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

@WebServlet("/Ajax")
public class Ajax extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Ajax() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String param = request.getParameter("senData");
		System.out.println("넘어온 데이터>>>>>>>>>>> " + param);
		
		response.setCharacterEncoding("utf-8");
		
		// 응답데이터 생성은 대부분 text(html)로 작성하며, 데이터는 바이너리기반/텍스트기반 스트림으로 작성
		PrintWriter wrt = response.getWriter();
		
		// JSON형태의 응답정보 보내기
		wrt.write("{\"abc\":\""+ param +"\"}");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String parameter = request.getParameter("imkey"); // JSON형식 데이터는 받지 못함
		System.out.println("post >>>>>>> " + parameter);
		
		request.setCharacterEncoding("utf-8");
		
		BufferedReader rd = request.getReader();
		String data = rd.readLine();
		System.out.println("데이터를 확인해보자 >> " + data);

		// java에서 활용가능한 객체 형태로 변환하기 위해 gson라이브러리 사용
		JsonParser parser = new JsonParser();
		JsonObject jsonObj = (JsonObject)parser.parse(data);
		
		System.out.println(jsonObj.get("imkey").getAsString());
		
		response.setCharacterEncoding("utf-8");
		PrintWriter wrt = response.getWriter();
		wrt.print("넘어감 >> " + jsonObj.get("imkey").getAsString());
	}

}

 

결과 화면6-1

 

결과 화면6-2

 

 

반응형

'jQuery' 카테고리의 다른 글

[jQuery] 23장 fetch  (0) 2024.03.04
[jQuery] 22장 jQuery를 이용한 Ajax  (0) 2024.02.29
[jQuery] 20장 Ajax  (0) 2024.02.27
[jQuery] 19장 JSON  (1) 2024.02.27
[jQuery] 18장 콜백 함수와 체이닝, 동기와 비동기  (1) 2024.02.27
1 2 3 4 ··· 8