[Ajax] POST 전송 (Javascript, jQuery)

2025. 3. 11. 17:53·Web

ajax_post.html

Javascript를 사용한 Ajax POST 전송

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax POST 전송방식 (Javascript)</title>
</head>
<body>
아이디 : <input type="text" id="mid"><br>
이메일 : <input type="text" id="memail"><br>
<input type="button" value="전송" onclick="ajaxs()">
</body>
<script src="./ajax_post.js?v=1">
</script>
</html>
  • form 태그를 사용하지 않음
    • name을 사용하지 않음 => id 사용하여 js로 넘김

ajax_post.js

Javascript를 사용한 Ajax POST 전송

function ajaxs(){	//전송 버튼 클릭시 이벤트 함수 
	var mid = document.getElementById("mid");
	var memail = document.getElementById("memail");
	if(mid.value == ""){
		alert("아이디를 입력하세요!");
	}else if(memail.value == ""){
		alert("이메일을 입력하세요!");
	}else {
		this.ajax_post(mid.value, memail.value);	//ajax post 통신을 위한 함수 
	}
}

//Ajax POST 전송하는 함수 (실무용! 짧은코드! 조음!)
function ajax_post(mid, memail){
	var http, result;	//http : Back-end 통신용 , result : Back-end 제공한 데이터 
	http = new XMLHttpRequest();
	http.onreadystatechange = function(){
		if(http.readyState == 4 && http.status == 200){	//4 == DONE (url유효) || 200 == 정상통신
			console.log(this.response);
		}else if(http.status == 404){
			console.log("경로 오류 발생");
		}else if(http.status == 405){
			console.log("통신 규격 오류 발생");
		}
	} 
	//post 통신 
	http.open("post","./ajax_postok.do",true);
	//⭐️ajax post 전송시 content-type 적용하여 urlencoded 적용해야만 정상적으로 Back-end에게 값을 전송함 
	http.setRequestHeader("content-type", "application/x-www-form-urlencoded");	//form enctype 쓰고 컨스페하면 나오는거
	//post는 값 여러개 보낼때 &를 이용해서 함께 보냄 
	http.send("userid="+mid+"&usermail="+memail);
	//값 하나 보낼때
	//http.send("userid="+mid);
	
	/* 
	//get 방식에서는 주소 뒤에 붙였었음
	http.open("get","./ajax_postok.do?userid="+mid,true);
	http.send();
	*/
	 
}

ajax_post2.html

jQuery를 사용한 Ajax POST 전송

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax POST 전송방식 (jQuery)</title>
<script src="../jquery/jquery.js"> </script>
<script>
//실무 고수 코드 
$(()=>{
	$("#btn").click(()=>{
		if($("#mid").val()==""){
			alert("아이디를 입력하세요!");
		}else if($("#memail").val()==""){
			alert("이메일을 입력하세요!");
		}else{
			//ajax post 통신문법
			$.ajax({
				url : "./ajax_postok.do",	//백엔드 경로 
				type: "post",		//전송방식 
				contentType : "application/x-www-form-urlencoded",	//전송시 암호화 //이거 굳이 안넣어도됨 jQuery는 기본적으로 탑재되어있음
				cache : false,	//브라우저 캐시메모리 초기화 //매우중요 이거안쓰면 캐시에 저장됨
				//post전송시 해당 방식으로 전송 
				/*
				//데이터 하나 전송
				data : {	
					"userid" : $("#mid").val()
				},
				*/
				//데이터 여러개 전송 (콤마로 연결) 
				data : {	
					"userid" : $("#mid").val(),
					"usermail" : $("#memail").val() 
				},
				success:function(response){	//xhr : 200 통신 발생시 작동되는 함수  
					console.log(response);
				},
				error:function(error){		//xhr 200외의 숫자 적용된 경우 
					console.log("오류발생 : ", error);
				}
			});
		}
	});
});
</script>
</head>
<body>
아이디 : <input type="text" id="mid"><br>
이메일 : <input type="text" id="memail"><br>
<input type="button" value="전송" id="btn">
</body>
</html>

ajax_postok.java (servlet)

POST 전송된 값 처리하여 Front-end로 보내는 Controller

package ajax;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ajax_postok extends HttpServlet {
	private static final long serialVersionUID = 1L;
	PrintWriter pw = null;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//CORS를 해결하기 위해서 사용하는 방식의 코드
		//해당 Origin, Credentials 을 사용하여 도메인이 다르게 접근을 하더라도 ajax통신이 되도록 허락을 하는 명령어 
		//실무에서는 "*"를 안쓰고 서버아이피나 특정 도메인을 걸어서 사용함 
		//ajax통신시 웬만하면 써두는것이 좋음!!! 
		//아래 두 줄은 상대방의 주소로 전송시 CORS를 방지하는 코드
		response.addHeader("Access-Control-Allow-Origin", "*");	// 모든 아이피 허용 //*대신 아이피넣으면 해당 아이피만 허용  
		response.addHeader("Access-Control-Allow-Credentials", "true");
		
		String userid = request.getParameter("userid");
		String usermail = request.getParameter("usermail");
		String msg = "";	//ok : 정상 아이디, no : 아이디 오류 발생, error : 백엔드 오류
		
		this.pw = response.getWriter();
		if(userid.equals("hong") && usermail.equals("hong@nate.com")) {
			msg = "no";
		}else {
			msg = "ok";
		}
		this.pw.print(msg);	//Front-end에게 보내는 값 
	}
}
  • CORS : 도메인 규칙이 조금이라도 다를 경우 Ajax 통신 에러
    • 프론트엔드에서는 처리가 안됨 => 백엔드가 처리해야함
    • 아래 두줄의 코드로 해결
      response.addHeader(
      "Access-Control-Allow-Origin", "*");
      response.addHeader("Access-Control-Allow-Credentials", "true");

ajax_file.html

Javascript를 사용한 Ajax POST 파일 전송

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax Javascipt - File 전송</title>
</head>
<body>

이미지 첨부파일 : <input type="file" id="mfile"><br>
<input type="button" value="전송" onclick="ajax_file()">

</body>
<script src="./ajax_file.js?v=2"></script>
</html>

ajax_file.js

Javascript를 사용한 Ajax POST 파일 전송

function ajax_file(){	//전송 버튼 클릭시 이벤트 함수 
	var mfile = document.getElementById("mfile");
	
	if(mfile.value == ""){
		alert("파일을 첨부해주세요");
	}else {
		this.ajax_post(mfile);	//ajax post 통신을 위한 함수 
	}
}

//ajax I/O로 파일 전송하는 방식 
function ajax_post(mfile){
	var http,result;
	var formdata = new FormData();	//form태그를 이용하는 방식과 동일 
	formdata.append("mfile",mfile.files[0]);	//배열 기준으로 파일을 처리 //0넣은 이유는 파일 하나만 써서 
	
	http = new XMLHttpRequest();
	http.onreadystatechange = function(){
		if(http.readyState == 4 && http.status == 200){
			console.log(this.response);		
		}
	}
	//파일 전송하니까 POST로 전송 
	http.open("post","./ajax_fileok.do", true);
	//http.setRequestHeader("content-type","multipart/form-data");	//formdata사용시 필요없음 
	http.send(formdata);	//FormData 함수의 값을 send 함수에 인자값으로 적용하여 전송 
}

ajax_file2.html

jQuery를 사용한 Ajax POST 파일 전송

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>Ajax - File 전송 (Jquery)</title>
      <script src="../jquery/jquery.js"></script>
      <script>
      $(function() {
         $("#btn").click(function() {
            if($("#mfile").val==""){
               alert("파일을 첨부해야 합니다.");
            }else{
            	/*
            	[jQuery Ajax I/O 형태 두가지 방식]
            	1. <form>태그 선언 후 new FormData()를 이용하여 Back-end로 전달		//실무에서 안씀  
            	2. <form>태그가 없는 경우 : 아이디로 []배열기호 + files 배열기호[] 모두 적용해야함  
            	*/
            	
				/* 				
				id가 frm인 폼태그가 있을때 
				var $formdata = new FormData($("#frm")[0]); 
				*/
				
            	//폼태그가 없을때 => FormData 사용 
            	/*
            	//정통핸들링 
            	var $fileup = $("#mfile")[0];
            	var $file = $fileup.files[0];
            	console.log($file);
            	var $formdata = new FormData();
            	console.log($formdata);
            	$formdata.append("mfile",$file);
            	console.log($formdata.get("mfile"));
            	*/
            	
            	//위 코드 축약형 ! 고수코드 
            	var $formdata = new FormData();
            	$formdata.append("mfile",$("#mfile")[0].files[0]);
            	console.log($formdata.get("mfile"));
            	
            	
               $.ajax({
                  url : "./ajax_fileok.do",
                  cache : false,
                  type : "post",
                  dataType : "HTML",
                  data : $formdata,
                  contentType : false,		//multipart/form-data를 위해 false로 설정 
	              processData : false,		//data를 문자화하지 않도록 설정 
                  success : function(result){
                	  console.log(result);
                	  if(result=="ok"){
                		  alert("올바르게 파일이 전송되었습니다");
                	  }
                  },
                  error : function(error){
                	  console.log(error);
                  }
               });
               
               //보이는것처럼 제이쿼리가 자스보다 더 복잡함 그래서 실무에서는 웬만하면 사람들이 핸들링이 쉬운 자스를 쓰려고 함 
               
            }
         });
      });
      </script>
   </head>
   <body>
      이미지 첨부파일 : <input type="file" id="mfile"><br>
      <input type="button" value="전송" id="btn">
   </body>
</html>

 

ajax_fileok.java (servlet)

POST 전송된 값 처리하여 Front-end로 보내는 Controller

package ajax;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@MultipartConfig(
	fileSizeThreshold = 1024 * 1024 * 5,
	maxFileSize = 1024 * 1024 * 50,
	maxRequestSize = 1024 * 1024 * 100
)
public class ajax_fileok extends HttpServlet {
	private static final long serialVersionUID = 1L;
	PrintWriter pw = null;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//ajax통신시 CORS 방지 
		response.addHeader("Access-Control-Allow-Origin", "*");	
		response.addHeader("Access-Control-Allow-Credentials", "true");
		
		request.setCharacterEncoding("utf-8");	//한글파일명이 올수도 있으니까
		
		this.pw = response.getWriter();
		
		//경로확인 
		//String url = request.getServletContext().getRealPath("");
		//System.out.println(url);
		/*
		/Users/nayeong/Documents/web_servlet/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/web/
		*/
		
		//파일 저장
		Part mfile = request.getPart("mfile"); 	//전송된 파일 데이터를 받는 역할 
		String url = request.getServletContext().getRealPath("/upload/");	//전송될 파일 디렉토리 
		String filenm = mfile.getSubmittedFileName();	//파일명
		mfile.write(url + filenm);
		this.pw.print("ok");
	}
}
저작자표시 비영리 변경금지 (새창열림)
'Web' 카테고리의 다른 글
  • [Spring] 기초
  • [Servlet] 미니미니미니프로젝트 - 쇼핑몰 만들기
  • [Servlet] 아이디 찾기, 비밀번호 변경
  • [Servlet] 제휴 메일 시스템
9na0
9na0
응애
  • 9na0
    구나딩
    9na0
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • Web (118)
      • Java (28)
      • 데이터베이스 (14)
      • 세팅 (12)
      • 과제 (3)
      • 쪽지시험 (2)
      • 정보처리기사 (4)
      • 서버 (25)
  • 블로그 메뉴

    • 링크

      • 포폴
      • 구깃
    • 공지사항

    • 인기 글

    • 태그

      file25_t
      spring-boot
      file25
      re2
      macbook pro m4
      net2
      net3
      net5~10
      notice_writer
      net1
      file24
      net4
      exam1_1~10
      ab1
      datalist
      java_io1~10
      noticewriteok
      io_dto
      re_java10
      Oracle
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    9na0
    [Ajax] POST 전송 (Javascript, jQuery)
    상단으로

    티스토리툴바