Java

Servlet과 Cookie

걷는 청년 2024. 7. 30. 17:44

오늘은 서블렛과 쿠키에 대해 배우고 실습해보았다.

 

package pack;

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("/HelloServlet")
@WebServlet( name = "ServletGo",  urlPatterns = {  "/HelloServlet",  "/good.kor",  "/wj"  }, loadOnStartup = 1 )

public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("get 요청 성공");
		
		// 서블릿(웹용 자바)으로 클라이언트 브라우저에 데이터 전송
		response.setContentType("text/html;charset=utf-8");	// Mime type과 문자 코드
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1>서블릿 문서</h1>");
		out.println("안녕 반가워");
		out.println("</body></html>");
		out.close();
		
	}

}

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>서블릿 연습</h2>
<a href="HelloServlet">HelloServlet 보여줘1</a><br>
<a href="good.kor">HelloServlet 보여줘2</a><br>
<a href="wj">HelloServlet 보여줘3</a><br>
<br>
<a href="ServletEx02">ServletEx02 보여줘</a><br>
<br>
<a href="ServletEx03">Servlet lifeCycle</a><br>

<form action="ServletEx03" method="get">
<input type="submit" value="Servlet lifeCycle 테스트">
</form>

<form action="ServletEx03" method="post">
<input type="submit" value="Servlet lifeCycle 테스트">
</form>

<hr>
<a href="getdata.html">get 요청 처리</a><br>
<a href="postdata.html">post 요청 처리</a><br>

<hr>
<a href="ServletEx06Cookie">쿠키 처리</a><br>
<a href="ServletEx07Session">session 처리</a><br>



</body>
</html>

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>wproject1</display-name>
  <welcome-file-list>
    <welcome-file>main.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>
  
	 <!-- servlet 생성 후 등록 -->
	 <!-- 
	<servlet>
		<servlet-name>abc</servlet-name>
		<servlet-class>pack.HelloServlet</servlet-class> 
	</servlet>
	<servlet-mapping>
		<servlet-name>abc</servlet-name>
		<url-pattern>/HelloServlet</url-pattern>
		<url-pattern>/good.kor</url-pattern>
		<url-pattern>/wj</url-pattern>
	</servlet-mapping>
  	 -->
  	 
</web-app>

 

 

package pack;

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

import javax.servlet.ServletConfig;
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 pack.other.ServletEx02Other;

/**
 * Servlet implementation class ServletEx02
 */
@WebServlet("/ServletEx02")
public class ServletEx02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	ServletEx02Other other;

	public void init(ServletConfig config) throws ServletException {
		// 서버는 init() 메소드를 호출해서 Servlet을  초기화 합니다.
		other = new ServletEx02Other("고길동");
	}


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");	// Mime type과 문자 코드
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1>서블릿 문서 Ex2</h1>");
		
		// 지역 변수 출력
		int a = 10, b = 20;
		out.println("a : " + a + ", b : " + b);
		
		// 현재 클래스의 메소드 호출
		int tot = calcData(a, b);
		out.println("<br>두 수의 합은? " + tot);
		
		// 클래스 호출
		//ServletEx02Other other = new ServletEx02Other("홍길동");
		String ir = other.getIrum();
		out.println("<br>이름은 : " + ir);
		
		out.println("</body></html>");
		out.close();
	}

	private int calcData(int a, int b) {
		int imsi = a + b;
		return imsi;
	}
	
}

 

 

package pack.other;

public class ServletEx02Other {
	private String irum;
	
	public ServletEx02Other(String irum) {
		this.irum = irum;
	}
	
	public String getIrum() {
		return irum;
	}
	
}

 

 

package pack;

import java.io.IOException;
import javax.servlet.ServletConfig;
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 ServletEx03
 */
@WebServlet("/ServletEx03")
public class ServletEx03 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	int num = 0;

	public void init(ServletConfig config) throws ServletException {
		// 웹 서버 서비스가 시작되면 자동 호출.
		// 현재 서블릿 클래스의 초기화를 담당 (1회만 수행)
		num = 1;
		System.out.println("init 수행 : num = " + num);
	}
/*
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get, post 요청 시 매번 수행. (doGet, doPost보다 우선순위가 높다)
		// doGet, doPost를 호출 가능
		// 참고 : jsp 파일은 service 메소드만을 가진 파일
		num += 1;
		System.out.println("service 수행 : num = " + num);
		
		//doGet(request, response);
	}
*/
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get 요청 시 매번 수행
		num += 1;
		System.out.println("doGet 수행 : num = " + num);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// post 요청 시 매번 수행
		num += 1;
		System.out.println("doPost 수행 : num = " + num);
	}
	
	public void destroy() {
		// 웹 서버 서비스가 종료되면 자동 호출
		// 마무리 작업 담당
		System.out.println("destroy 수행");   
	}

}

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = () => {
	let btnOk = document.querySelector("#btnOk").addEventListener("click", func);
	
}

function func(){
	if(frm.name.value === "" || frm.addr.value === "" || frm.age.value === "" ){
		alert("자료 입력");
		return;
	}else frm.submit();
}

</script>
</head>
<body>
<h2>get 요청</h2>
<a href="ServletEx04Get?name=james&addr=jeju&age22">ServletEx04Get 요청(get)</a>
<br>
form tag로 get 요청

<form action="ServletEx04Get" method="get" name="frm">
이름 : <input type="text" name="name" size="10" value="tom"><br>
주소 : <input type="text" name="addr" size="50" value="seoul"><br>
나이 : <input type="text" name="age" size="3" value="23"><br>
<input type="button" id="btnOk" value="자료전송">
<input type="reset" id="btnCancel" value="입력취소">

</form>
</body>
</html>

 

 

package pack;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String addr = request.getParameter("addr");
		String age = request.getParameter("age");
		// 받은 자료로 Business Logic, DB에 등록, ... 등을 할 수 있다.

		// 클라이언트로 출력
		response.setContentType("text/html;charset=utf-8"); // Mime type과 문자 코드
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h2>get 요청 결과</h2>");
		out.println("이름 " + name + "의 주소 : " + addr + "의 나이는 : " + age);
		out.println( "<br>" + calcAge(age));
		out.println( "<br><br><a href='getdata.html'>자료 다시 입력</a>");
		out.println("</body></html>");
		out.close();

	}

	private String calcAge(String age) {
		int imsi = Integer.parseInt(age) / 10 * 10;
		String result = "기타";

		switch (imsi) {
		case 20:
			result = "20대";
			break;
		case 30:
			result = "30대";
			break;
		case 40:
			result = "아저";
			break;
		}

		return result;
	}
}

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>


</head>
<body>
<h2>post 요청</h2>
<form action="post.do" method="post">
이름 : <input type="text" name="name" value="한국인"><br>
주소1 : <input type="text" name="addr" value="서울시"><br>
주소2 : <input type="text" name="addr" value="서대문구"><br>
<br>
좋아하는 스포츠는? <br>
<input type="checkbox" name="sports" value="축구">축구&nbsp;&nbsp;
<input type="checkbox" name="sports" value="농구">농구&nbsp;&nbsp;
<input type="checkbox" name="sports" value="롤" checked="checked">롤<br>
<br>
자신있는 언어는? <br>
<input type="radio" name="lan" value="자바" checked="checked">자바&nbsp;&nbsp;
<input type="radio" name="lan" value="자바스크립트">자바스크립트&nbsp;&nbsp;
<input type="radio" name="lan" value="파이썬">파이썬<br>
<br>
교통수단은? <br>
<select name="tr">
	<option>전철</option>
	<option>버스</option>
	<option>도보</option>
</select>

<input type="hidden" name="edu" value="에이콘">
<br><br>
<input type="submit" value="자료전송">
</form>

</body>
</html>

 

package pack;

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("/post.do")
public class ServletEx05post extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");	// 수신자료 한글 깨짐 방지
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h2>post 요청 결과</h2>");
		
		String irum = request.getParameter("name");
		String[] juso = request.getParameterValues("addr");	// 매개변수 중복인 경우 배열 처리
		
		out.println("이름 : " + irum + ", 주소1 : " + juso[0] + ", 주소2 : " + juso[1]);
		
		// checkbox
		try {
			String[] sports = request.getParameterValues("sports");	
			out.println("선택한 종목은 ");
			for(String s:sports) {
				out.println(s + " ");
			}
		} catch (Exception e) {
			out.println("<br>종목 하나 이상을 선택하시죠??");
			return;	
		}
		
		// radio
		String language = request.getParameter("lan");
		out.println("<br>자신있는 언어는 : " + language);
		
		// select
		String tr = request.getParameter("tr");
		out.println("<br>교통수단은 : " + tr);
		
		// hidden
		String edu = request.getParameter("edu");
		out.println("<br>교육센터는 : " + edu);
		
		
		out.println( "<br><br><a href='postdata.html'>자료 다시 입력</a>");
		out.println("</body></html>");
		out.close();
		
	}

}

 

 

package pack;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

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

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		
		// 쿠키가 있는 경우 로그인한 상태를 알리고 없다면 로그인 창 띄우기
		String id = null;
		String pwd = null;

		try {
			Cookie[] cookies = request.getCookies(); // 클라이언트의 모든 쿠키 읽기
			for(int i=0; i<cookies.length; i++) {
				// 쿠키는 키 : 값 형태로 구성됨
				String name = cookies[i].getName();
				System.out.println("name : " + name);
				
				if(name.equalsIgnoreCase("id")) {
					// 쿠키값 디코딩(암호 해제)
					id = URLDecoder.decode(cookies[i].getValue(), "utf-8");
				}
				if(name.equals("pwd")) {
					// 쿠키값 디코딩(암호 해제)
					pwd = URLDecoder.decode(cookies[i].getValue(), "utf-8");
				}
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		if(id != null && pwd != null) {
			out.println(id + "님 쿠키를 통해 로그인한 상태입니다.");
			out.println("</body></html>");
			out.close();
			return;
		}
		
		// id, pwd가 없는 경우
		out.println("<h2>로그인</h2>");
		out.println("<form method='post'>");
		out.println("id : <input type='text' name='id'><br>");
		out.println("pwd : <input type='text' name='pwd'><br>");
		out.println("<input type='submit' value='로그인'><br>");
		out.println("</form>");
		out.println("</body></html>");
		out.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		//System.out.println(id + " " + pwd);
		
		if(id.equals("aaa") && pwd.equals("111")) {
			//쿠키 생성
			try {
				id = URLEncoder.encode(id, "utf-8"); // 암호화
				Cookie idCookie = new Cookie("id", id);
				idCookie.setMaxAge(60 * 60 * 24 * 365);	// 쿠키 유효기간
				
				pwd = URLEncoder.encode(pwd, "utf-8"); // 암호화
				Cookie pwdCookie = new Cookie("pwd", pwd);
				pwdCookie.setMaxAge(60 * 60 * 24 * 365);
				
				response.addCookie(idCookie);
				response.addCookie(pwdCookie);	// 클라이언트 컴퓨터에 쿠키를 저장
				
				out.println("로그인 성공 - 쿠키가 설정되었습둥~~~");
				
			} catch (Exception e) {
				// TODO: handle exception
			}
		}else {
			out.println("로그인 실패");
		}
		
		
		
		out.println("</body></html>");
		out.close();
	}

}

'Java' 카테고리의 다른 글

mvc 패턴  (0) 2024.07.30
html과 jsp 맛보기  (10) 2024.07.24
웹 서버 만들기 기초  (1) 2024.07.24
네트워크, URL, 서버  (0) 2024.07.24
Stream, 람다식 DB 연동 활용  (1) 2024.07.24