본문 바로가기
👨‍💻 2. 웹개발_Back end/2-4 JSP & Servlet

[JSP & Servlet] 2장 웹 프로그래밍의 기초 다지기

by 달님🌙 2021. 10. 12.
반응형

 

1. HTTP 프로토콜의 이해

 

 

 

 

 

 

2. GET 요청

 

 

 

<예제> GET 방식을 이용하여 계산기 만들기

 

서블릿 파일 생성 - CalculatorServlet.java

package lesson02.get;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;

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

/**
 * Servlet implementation class CalculatoreServlet
 */
@WebServlet("/CalculatorServlet")
public class CalculatorServlet extends HttpServlet {
	private Hashtable<String, Operator> opTable = new Hashtable<String, Operator>();
	
	public CalculatorServlet() {
		opTable.put("+", new PlusOperator());
		opTable.put("-", new MinusOperator());
		opTable.put("*", new MultipleOperator());
		opTable.put("/", new DivOperator());
	}
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("get 요청");
		process(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("post 요청");
		process(request, response);
	}
	
	public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1. 클라이언트가 보내온 변수값 추출
		String op = request.getParameter("op");
		double v1 = Double.parseDouble(request.getParameter("v1"));
		double v2 = Double.parseDouble(request.getParameter("v2"));
		
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		
		out.println("<html><body>");
		out.println("<h1>계산결과</h1>");
		out.println("결과 : ");
		
		try {
			Operator operator = opTable.get(op);
			if(operator == null) {
				out.println("존재하지 않는 연산자");
			} else {
				double result = operator.execute(v1, v2);
				out.println(String.format("%.3f", result));
			}
		} catch(Exception e) {
			out.println("연산 오류 발생");
			out.println(e.getMessage());
		}
		
		out.println("</body></html>");
	}
}

 

인터페이스 생성 - Operator

package lesson02.get;

public interface Operator {
	public String getName();
	public double execute(double a, double b) throws Exception;
}

 

사칙연산 클래스 생성 - 예) PlusOperator

package lesson02.get;

public class PlusOperator implements Operator {
	@Override
	public String getName() {
		return "+";
	}
	
	@Override
	public double execute(double a, double b) throws Exception {
		return a + b;
	}
}

 

html 파일 생성 - getTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>get 요청</title>
</head>
<body>
	<h3>get 요청  1 : 웹 브라우저의 주소창에 주소를 입력 후 실행 시</h3>
	<h3>get 요청 2 : 링크를 클릭할 때</h3>
	<p>
		<a href="http://www.google.com">구글</a><br>
		<a href="http://www.naver.com">네이버</a>
	</p>
	<h3>get 요청 3 : 입력 폼의 method 속성을 get으로 지정할 때</h3>
	<form action="CalculatorServlet" method="get">
		<input type="text" name="v1" size="4">
		<select name="op">
			<option value="+">+</option>
			<option value="-">-</option>
			<option value="*">*</option>
			<option value="/">/</option>
		</select>
		<input type="text" name="v2" size="4">
		<input type="submit" value="=">
	</form>
</body>
</html>

 

실행 결과

 

 

2. POST 요청

 

 

<예제> POST 방식을 이용하여 로그인 프로그램 만들기

서블릿 파일 생성 - LoginServlet

package lesson02.post;

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;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		
		out.println("<html><body>");
		if(pw.equals("1111")) {
			out.println("<h1>로그인 결과</h1>");
			out.println("<strong>" + id + "</strong> 님을 환영합니다.");
		} else {
			out.println("암호가 틀렸습니다.");
		}
		
		out.println("</body></html>");
	}

}

 

postTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>post 요청</title>
</head>
<body>
	<h3>post 요청 1 : 로그인 폼</h3>
	<p>로그인 폼은 사용자 입력 아이디나 비밀번호 노출을 방지하기 위해 post방식 사용</p>
	<form action="LoginServlet" method="post">
		아이디 : <input type="text" name="id"><br>
		비밀번호 : <input type="password" name="pw"><br>
		<input type="submit" value="로그인">
	</form>
	
	<h3>post 요청 2 : 입력 폼의 method 속성을 post로 지정할 때</h3>
	<form action="CalculatorServlet" method="post">
		<input type="text" name="v1" size="4">
		<select name="op">
			<option value="+">+</option>
			<option value="-">-</option>
			<option value="*">*</option>
			<option value="/">/</option>
		</select>
		<input type="text" name="v2" size="4">
		<input type="submit" value="=">
	</form>
</body>
</html>

 

실행 결과

 

 

<예제> 서블릿을 이용하여 파일 업로드 프로그램 만들기

서블릿 파일 생성 - FileUploadServlet

package lesson02.file;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

///WEB-INF/temp 는 임시 폴더, 외부에서 접근금지하기 위해 일부러 /WEB-INF 아래 두었다
///upload 는 모든 파일정보를 수신하면 temp->upload로 이동

@SuppressWarnings("serial")
@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet{
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 응답데이터를 UTF-8로 해석하자
		req.setCharacterEncoding("UTF-8");
		// 전송데이터를 UTF-8로 해석하도록 하자
		resp.setContentType("text/html; charset=UTF-8");
		
		// 클라이언트와 연결된 통신객체
		PrintWriter out = resp.getWriter();
		out.println("<html><head><title>Multipart Test</title></head><body>");
		
		try {
			String contextRootPath = this.getServletContext().getRealPath("/");
			System.out.println("contextRootPath : " + contextRootPath);
			
			DiskFileItemFactory diskFactory = new DiskFileItemFactory();
			diskFactory.setRepository(new File(contextRootPath + "/WEB-INF/temp"));
			ServletFileUpload upload = new ServletFileUpload(diskFactory);
			
			@SuppressWarnings("unchecked")
			List<FileItem> items = upload.parseRequest(req);
			
			FileItem item = null;
			for(int i=0;i<items.size();i++) {
				item = items.get(i);
				if(item.isFormField())	// 일반 전달변수
					processFormField(out, item);
				else					// 업로드 파일
					processUploadFile(out, item, contextRootPath);
			}
			
		}catch(Exception e) {
			out.println("<pre>");
			e.printStackTrace(out);
			out.println("</pre>");
		}
		
		out.println("</body></html>");
	}
	
	private void processUploadFile(PrintWriter out, FileItem item, String contextRootPath) throws Exception{
		String name = item.getFieldName();
		String fileName = item.getName();
		String contentType = item.getContentType();
		long fileSize = item.getSize();
		
		String uploadedFileName = System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
		
		//실제 경로에 폴더가 없으면 추가
		File folder = new File(contextRootPath + "/uplaod");
		if(!folder.exists()) {
			folder.mkdir();
		}
		
		File uploadedFile = new File(contextRootPath + "/upload/" + uploadedFileName);
	
		item.write(uploadedFile);
		
		// 클라이언트한테 정보보여주기
		out.println("<p>");
		out.println("파라미터 이름: " + name + "<br>");
		out.println("파일 이름: " + fileName + "<br>");
		out.println("콘텐츠 타입: " + contentType + "<br>");
		out.println("파일 크기: " + fileSize + "<br>");
		out.println("<img src='./upload/" + uploadedFileName + "' width='500'><br>");
		out.println("</p>"); 
	}
	
	private void processFormField(PrintWriter out, FileItem item) throws Exception{
		String name = item.getFieldName();
		String value = item.getString("UTF-8");
		
		out.println(name + ":" + value + "<br>");
	}
}

 

라이브러리 추가 및 upload 폴더와 temp 폴더 생성

 

html 파일 생성 - MultipartTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드</title>
</head>
<body>
    <h3>파일 업로드 POST 요청 : Multipart 인코딩</h3>
    <p>입력폼의 method를 POST로 지정하고,
        enctype 속성의 값을 multipart/form-data로 설정
    </p>
    <form action="FileUploadServlet" method="post"
        enctype="multipart/form-data"> <!-- 타입 중요 -->
        사진: <input type="file" name="photo"><br>
        설명: <textarea name="description" cols="50" rows="3"></textarea><br>
        <input type="submit" value="추가"><br>
    </form>
</body>
</html>

 

실행 결과

 

반응형

댓글