요청(ajax) ->
데이터가 항상 들어오는 형식이 같으면 좋음
항상 다르면 복잡해짐
예전에는 거의 x-www-form-urlencoded로 보냈음
요즘에는 json으로 통일함
응답(ajax) ->
여러 데이터 형식으로 보낼 수 있지만 거의 json으로 통일한다.
결과 화면 깜박임없이 (F5)없이 요청해서 통신을 함
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script
src="https://code.jquery.com/jquery-3.6.0.js"
integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
crossorigin="anonymous">
// ajax는 제이쿼리를 사용(cdn주소) 또는 다운받아서 사용도 가능 -> $사용 가능
</script>
</head>
<body>
<button onclick="getajax()">클릭</button>
<script>
// 목적: GET으로 key=value 데이터를 전송하고 응답을 text/plain을 받을 예정
function getajax() {
// 비동기 함수
$.ajax({
type: "GET", // type의 기본값은 GET. GET인경우 생략가능
url: "http://localhost:8080/ajax/ajax1?username=ssar&password=1234", //contextpath가 프로젝트명이라 ajax이다.
// data: GET은 전송할 http의 body가 없음. 그래서 data 필드가 필요없음
// contentType: 전송할 data가 없으니까 그 data를 설명할 필드가 필요없음
dataType: "text" // 목적: 파싱해줌. json데이터를 응답받으면 바이트스트링으로 들어옴. 응답받은 데이터는 json이 아니라 string이다. 그래서 json이 들어오면 자바스크립트 오브젝트로 파싱해줘야 함
// dataType: 응답되는 데이터를 자바스크립트 오브젝트로 파싱하는 용도 text면 생략가능
})
.done(function(result) { // 응답에 따른 text결과가 function의 인자로 들어옴
alert(result);
}) //ajax 통신 완료후에 정상이면 done이 가지고 있는 함수 호출
.fail(function(error) {
}); // ajax 통신 완료후에 비정상이면 fail이 가지고 있는 함수 호출
}
// 위의 비동기 함수를 밑처럼 요약 가능함
// $.ajax("주소").done(함수..)
</script>
</body>
</html>
@WebServlet("/ajax1")
public class Ajax1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Ajax1() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// username이랑 password를 받는다고 가정
String username = request.getParameter("username"); //GET방식이니까 getParameter로 받을 수 있음
String password = request.getParameter("password");
System.out.println("username: " + username);
System.out.println("password: " + password);
// 응답하면 done안에 있는 함수가 실행된다.
// PrintWrtier out에서 out.print한 것들이 done함수의 인자(result)에 꽂힌다
PrintWriter out = response.getWriter();
out.print("ok");
out.flush();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script
src="https://code.jquery.com/jquery-3.6.0.js"
integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
crossorigin="anonymous">
// ajax는 제이쿼리를 사용(cdn주소) 또는 다운받아서 사용도 가능 -> $사용 가능
</script>
</head>
<body>
<button onclick="postajax()">클릭</button>
<script>
// 목적: POST으로 key=value 데이터를 전송하고 응답을 json으로 받을 예정
function postajax() {
// 비동기 함수
$.ajax({
type: "POST",
url: "http://localhost:8080/ajax/ajax1", //contextpath가 프로젝트명이라 ajax이다.
data: "username=ssar&password=1234",
contentType: "application/x-www-form-urlencoded", //contentType은 안줘도 됨. 브라우저에게 주는 것이 아니라 내가 받는거라 나는 이미 알고 있음 ㅋㅋ. 받는 사람이 내가 아니면(브라우저면) 줘야 함
dataType: "json" // 목적: 파싱해줌. json데이터를 응답받으면 바이트스트링으로 들어옴. 응답받은 데이터는 json이 아니라 string이다. 그래서 json이 들어오면 자바스크립트 오브젝트로 파싱해줘야 함
// 적는 것이 좋음. 생략하면 그냥 문자열이 결과로 나옴
})
.done(function(result) { // json으로 들어온 데이터를 자바스크립트 오브젝트로 바꿔서 넣어줌
console.log(result);
}) //ajax 통신 완료후에 정상이면 done이 가지고 있는 함수 호출
.fail(function(error) {
}); // ajax 통신 완료후에 비정상이면 fail이 가지고 있는 함수 호출
}
// 위의 비동기 함수를 밑처럼 요약 가능함
// $.ajax("주소").done(함수..)
</script>
</body>
</html>
@WebServlet("/ajax1")
public class Ajax1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Ajax1() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// username이랑 password를 받는다고 가정
String username = request.getParameter("username"); //GET방식이니까 getParameter로 받을 수 있음
String password = request.getParameter("password");
System.out.println("username: " + username);
System.out.println("password: " + password);
// 응답하면 done안에 있는 함수가 실행된다.
// PrintWrtier out에서 out.print한 것들이 done함수의 인자(result)에 꽂힌다
PrintWriter out = response.getWriter();
out.print("ok");
out.flush();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 보낸 데이터의 타입을 확인 -> 데이터가 있으면 contentType을 확인하는게 좋음
// String contentType = request.getContentType();
// if(contentType == x-www-form-urlencoded이면 getParamter로 파싱하고 그게 아니면 버퍼로 읽기)
// username이랑 password를 받는다고 가정
String username = request.getParameter("username"); //GET방식이니까 getParameter로 받을 수 있음
String password = request.getParameter("password");
System.out.println("username: " + username);
System.out.println("password: " + password);
String jsonData = "{\"username\":\"ssar\", \"password\":\"1234\"}";
// ajax에서 dataType을 안적어주고 여기서 해줘도 됨. ajax가 아니라 여기서 해주는게 맞음. ajax함수가 알아서 분석해서 json으로 바꿔보여줌
//response.setContentType("application/json"); // 브라우저가 응답을 받을거면 어떤 타입을 응답해주는지 말해줘야 함
// ContentType은 자동화를 위한 것임. 내가 코드 짜는데 내가 알고 있으면 굳이 안적어도 됨
PrintWriter out = response.getWriter();
out.print("jsonData"); // 응답을 내가 받음 -> 폼태그로 요청했으면 브라우저가 받음
out.flush();
}
}
요청 : json (POST)
6. 응답 apaplication/json
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script
src="https://code.jquery.com/jquery-3.6.0.js"
integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
crossorigin="anonymous">
// ajax는 제이쿼리를 사용(cdn주소) 또는 다운받아서 사용도 가능 -> $사용 가능
</script>
</head>
<body>
<button onclick="jsonajax()">클릭</button>
<script>
// 목적: POST으로 key=value 데이터를 전송하고 응답을 json으로 받을 예정
// 보낼 데이터
var data= {
username: "ssar",
password: "1234"
}
console.log(data);
// var jsonData = JSON.stringify(data);
// JSON.stringify() - 자바스크립트 오브젝트를 JSON으로 변경. 진짜 JSON타입이 아니라 JSON처럼 생긴 문자열이 됨
// JSON.parse() - JSON을 자바스크립트 오브젝트로 변경
function jsonajax() {
// 비동기 함수
$.ajax({
type: "POST",
url: "http://localhost:8080/ajax/ajax2", //contextpath가 프로젝트명이라 ajax이다.
// data: ' "username: " '+username+ ', "password : " ' +password+ '', // 이렇게 보낼 수 있지만 변수 매핑하기가 힘듬 그리고 변수는 무조건 string이어야 해서 비효율적
data: JSON.stringify(data) ,
contentType: "application/json",
dataType: "json" // 목적: 파싱해줌. json데이터를 응답받으면 바이트스트링으로 들어옴. 응답받은 데이터는 json이 아니라 string이다. 그래서 json이 들어오면 자바스크립트 오브젝트로 파싱해줘야 함
// 응답해줄때 서버쪽에서 contentType을 알려주지만 안알려줄 수도 있으니 적어줌
})
.done(function(result) { // json으로 들어온 데이터를 자바스크립트 오브젝트로 바꿔서 넣어줌
console.log(result);
console.log(result.username);
}) //ajax 통신 완료후에 정상이면 done이 가지고 있는 함수 호출
}
</script>
</body>
</html>
@WebServlet("/ajax2")
public class Ajax2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Ajax2() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// json으로 받아서 request.getParamter로 받을 수 없다.
// 그래서 버퍼로 읽어야 한다.
BufferedReader br = request.getReader(); // http body 데이터 순수하게 읽기- 파싱안함(request.getParameter는 순수하게 읽은 것이 아니라 파싱해서 읽음)
String requestData = br.readLine(); // 한번에 읽음
System.out.println(requestData); // json형식으로 들어옴 -> 파싱해서 js오브젝트로 만들어야 함
// 파싱과정
// DTO를 사용한다.
// gson.fromJson() => json을 자바 오브젝트로
// gson.toJson() => 자바 오브젝트를 json으로
Gson gson = new Gson();
UserDto userDto = gson.fromJson(requestData, UserDto.class); // requestData가 UserDto클래스에 꽂힌다.
System.out.println(userDto);
// 응답
User user = new User();
user.setId(1);
user.setUsername("love");
user.setPassword("1234");
user.setPhone("0102222");
String userJson = gson.toJson(user);
System.out.println("userJson" + userJson);
response.setContentType("application/json; charset=utf-8"); // 여기에 한글들어오면 깨져서 charset=utf-8을 적어줘야 한다.
PrintWriter out = response.getWriter(); // ajax에 응답해야지 html에 응답하면 안된다. => 의미가 없다.
out.print(userJson); //json으로 응답해야 함(스프링은 알아서 필터가 json으로 바꿔서 던져줌) -> 여기서는 직접해야 함
out.flush();
}
}
public class UserDto {
private String username;
private String password;
@Override
public String toString() {
return "UserDto [username=" + username + ", password=" + password + "]";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class User {
// 그냥 유저 모델
private int id;
private String username;
private String password;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}