반응형
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>
실행 결과
반응형
'👨💻 2. 웹개발_Back end > 2-4 JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] 4장 서블릿과 JDBC(1) - JDBC와 ODBC 구조 (0) | 2021.10.13 |
---|---|
[JSP & Servlet] 3장 서블릿 프로그래밍 (0) | 2021.10.12 |
[JSP & Servlet] 1장 웹 애플리케이션 이해 (0) | 2021.10.04 |
[JSP & Servlet] 맛보기 2. Servlet으로 Add, Delete, Update, Update_batch 수행하기 (0) | 2021.09.29 |
[JSP & Servlet] 맛보기 1. JSP로 Add, Delete, Update, Update_batch 수행하기 (0) | 2021.09.28 |
댓글