Servlet 실행 (공지사항, 회원가입, 파일전달, 쿠키전달, 세션전달)

woom·2022년 11월 30일
0

Servlet

목록 보기
2/3
post-thumbnail

🎀 1. 공지사항 전달

  • 오늘 날짜의 공지사항 파일을 읽어 파일내용을 웹문서로 생성하여 클라이언트에게 전달하는 서블릿
  • 오늘 날짜의 공지사항 파일이 없는 경우 클라이언트에게는 공지사항이 없음을 알리는 웹문서 전달
  • 공지사항 파일은 /WEB-INF/notice 폴더이름이 년월일(yyyyMMdd.txt)로 작성하여 작성

🐣 Servlet (웹프로그램 - 실행)

package xyz.itwill.servlet;


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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//서버 시스템의 현재 날짜와 시간이 저장된 Date 객체 생성
		Date now=new Date();
		//[yyyyMMdd] 형식의 패턴이 저장된 SimpleDateFormat 객체 생성
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMdd");
		//SimpleDateFormat객체를 이용하여 Date객체에 저장된 날짜와 시간을 특정 패턴의 문자열로 변환
		String nowString=dateFormat.format(now);
		//공지사항 파일의 이름 생성
		String noticeFileName=nowString+".txt";
		
		//불필요한 변수를 줄이기 위해 간단하게 작성 가능
		String noticeFileName=new SimpleDateFormat("yyyyMMdd").format(new Date())+".txt";
        
		
		//공지사항 파일의 시스템 경로를 반환받아 저장
		String noticeFilePath=
        request.getServletContext().getRealPath("/WEB-INF/notice/"+noticeFileName);


		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1 style='text-align: center;'>공지사항</h1>");
		out.println("<hr>");
		String displayNow=new SimpleDateFormat("yyyy년 MM월 dd일").format(new Date());
		out.println("<p style='text-align: center;'>"+displayNow+"의 공지사항</p>");
		try {
			//공지사항 파일을 읽기 위한 입력스트림 생성
			// → 공지사항 파일이 없는 경우 FileNotFoundException 발생
			BufferedReader in=new BufferedReader(new FileReader(noticeFilePath));
			
			//공지사항 파일을 읽어 클라이언트에게 응답할 문서에 전달하여 저장
			while(true) {
				String text=in.readLine();
                //공지사항 파일에 저장된 내용을 한 줄 읽어 변수에 저장
				if(text==null) break;
				if(text.equals("")) text="&nbsp;";
				out.println("<div>"+text+"</div>");//응답파일에 전달
			}
			
			in.close();//파일 입력스트림 제거
		} catch (FileNotFoundException e) {
			out.println("<p>오늘은 공지사항이 없습니다.");
		}
		out.println("<hr>");
		out.println("<div style='text-align: center;'>");
		out.println("<button type='button' onclick='window.close();'>닫기</button>");
		out.println("</div>");
		out.println("</body>");
		out.println("</html>");
	}
}





🐣 html 파일 (웹문서 - 결과)

  • window.open(url[,name][,option]) : 자식 브라우저(팝업창)를 생성하여 웹프로그램(웹문서)을 요청하여 처리결과를 응답받아 출력하는 메소드
    • window.open("notice.itwill","notice","width=400,height=400");
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
	<h1>공지사항</h1>
	<hr>
	<!-- 서블릿을 요청하여 이미지 파일을 응답받아 출력 -->
	<img alt="코알라" src="/servlet/image.itwill" width="300">
	<hr>
	<button type="button" id="btn">오늘의 공지사항 보기</button>
	
	<script type="text/javascript">
	document.getElementById("btn").onclick=function() {
		window.open("notice.itwill","notice","width=400,height=400");
	}
	</script>
</body>
</html>





💡 form 태그 복습

  • form 태그 : 사용자로부터 값을 입력받아 웹프로그램을 요청하여 전달하기 위한 태그

    • action 속성 : 요청할 웹프로그램의 URL 주소를 속성값으로 설정 (생략하면 현재 요청 웹프로그램의 URL 주소를 사용)
    • method 속성 : 웹프로그램에 대한 요청방식(GET 또는 POST)를 속성값으로 설정 (생략하면 GET 방식을 기본값으로 사용)
    • GET 방식 : 입력값을 질의문자열(QueryString)으로 변환하여 전달
      (소용량의 보안이 필요없는 값을 전달할 때 사용하는 요청방식)
    • POST 방식 : 입력값을 리퀘스트 메세지의 몸체부(Body)에 저장하여 전달
      (대용량이거나 보안을 필요로 하는 값을 전달할 때 사용하는 요청방식)
  • 웹프로그램 요청시 전달값은 이름(식별자)과 값이 하나의 쌍으로 전달 (이름=값&이름=값&...)


🎀 2. 회원가입


🐣 html 파일 (입력페이지)

  • 사용자에게 회원정보를 입력받아 처리페이지(join.itwill)를 POST 방식으로 요청하여
    입력값을 전달하는 웹문서 (입력페이지)

  • form 태그를 이용하여 POST 방식으로 웹프로그램 요청하면 입력값은 리퀘스트 메세지의
    몸체부(Body)에 저장되어 전달

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Servlet</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="css/common.css" type="text/css"/>
<script type="text/javascript" src="js/common.js"></script>
<script type="text/javascript">
function loading() {
	window.document.join.id.focus();
}

function inputCheck(form) {
	if(is_null(form.id)) {
		alert("아이디를 입력해 주세요.");
		form.id.focus();
		return false;
	}
	
	if(!isID(form.id)) {
		alert("아이디는 영문자로 시작되며 영문자,숫자,_의 조합만 가능합니다.");
		form.id.focus();
		return false;
	}
	
	if(is_null(form.pass)) {
		alert("비밀번호를 입력해 주세요.");
		form.pass.focus();
		return false;
	}
	
	if(is_null(form.repass)) {
		alert("비밀번호확인을 입력해 주세요.");
		form.repass.focus();
		return false;
	}			
	
	if(isShort(form.pass, 6, "비밀번호는 6글자 이상 입력해 주세요.")) {
		return false;
	}
	
	if(!isSame(form.pass, form.repass)) {
		alert("비밀번호와 비밀번호확인이 서로 같지 않습니다.");
		form.pass.focus();
		return false;
	}
	
	if(is_null(form.name)) {
		alert("이름을 입력해 주세요.");
		form.name.focus();
		return false;
	}	
	
	if(is_null(form.addr)) {
		alert("주소를 입력해 주세요.");
		form.addr.focus();
		return false;
	}
	
	return true;			
}
</script>
</head>
<body onload="loading();">
<h3 align="center">◆◆◆ 회원가입 ◆◆◆</h3>
	<form name="join" method="post" action="join.itwill" 
		onsubmit="return inputCheck(join);">
	<table bgcolor="black" cellspacing="1" cellpadding="5" align="center">
	<tr>
		<th bgcolor="44ff44"><font size="2">아이디</font></th>
		<td bgcolor="white" width="300">
			<input type="text" size="10" name="id" class="TXTFLD">
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">비밀번호</font></th>
		<td bgcolor="white" width="300">
			<input type="password" size="10" name="pass" class="TXTFLD">
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">비밀번호확인</font></th>
		<td bgcolor="white" width="300">
			<input type="password" size="10" name="repass" class="TXTFLD">
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">이름</font></th>
		<td bgcolor="white" width="300">
			<input type="text" size="10" name="name" class="TXTFLD">
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">주소</font></th>
		<td bgcolor="white" width="300">
			<input type="text" size="30" name="addr" class="TXTFLD">
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">성별</font></th>
		<td bgcolor="white" width="300">
			<input type="radio" name="gender" value="남자" checked><font size="2">남자</font>
			<input type="radio" name="gender" value="여자"><font size="2">여자</font>
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">직업</font></th>
		<td bgcolor="white" width="300">
			<select name="job">
				<option value="학생">학생</option>
				<option value="주부">주부</option>
				<option value="회사원">회사원</option>
				<option value="기타">기타</option>
			</select>
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">취미</font></th>
		<td bgcolor="white" width="300">
			<input type="checkbox" name="hobby" value="게임" checked><font size="2">게임</font>
			<input type="checkbox" name="hobby" value="등산"><font size="2">등산</font>
			<input type="checkbox" name="hobby" value="낚시"><font size="2">낚시</font>
			<input type="checkbox" name="hobby" value="운동"><font size="2">운동</font>
			<input type="checkbox" name="hobby" value="기타"><font size="2">기타</font>
		</td>
	</tr>
	<tr>
		<th bgcolor="44ff44"><font size="2">자기소개</font></th>
		<td bgcolor="white" width="300">
			<textarea rows="5" cols="40" name="profile"></textarea>
		</td>
	</tr>		
	<tr>
		<th colspan="2" bgcolor="ff8888">
			<input type="submit" value="가입">
			<input type="reset" value="취소">
		</th>
	</tr>
	</table>
	</form>
</body>
</html>





🐣 Servlet (입력값 전달)

  • 입력페이지(form.html)에서 전달된 입력값(회원정보)를 반환받아 클라이언트에게 전달하는 서블릿
  • 현재 실행되는 서블릿은 입력페이지(form.html)의 form 태그를 사용하여 [POST] 방식으로 요청
    • 서블릿을 [GET] 방식으로 요청한 경우 비정상적인 요청
    • 클라이언트가 웹프로그램을 비정상적으로 요청한 경우 클라이언트에게 에러코드를 전달하거나 에러페이지(입력페이지)로 이동되도록 처리
    • HttpServletRequest.getMethod() : 클라이언트의 요청방식(GET 또는 POST)을 반환하는 메소드
  • HttpServletResponse.sendError(int sc) : 클라이언트에게 에러코드(4XX or 5XX)를 전달하는 메소드
    • 상태코드(Status Code) : 요청에 대한 응답 관련 정보를 제공하기 위한 정수값
    • 100 : 처리 중, 200 : 처리 완료(응답결과 제공), 300 : 재요청, 400 : 잘못된 요청, 500 : 실행 오류
    • HttpServletResponse 인터페이스의 상수(Constant)를 이용하여 상태코드 제공
  • HttpServletResponse.sendRedirect(String url) : 클라이언트에게 URL 주소를 전달하는 메소드 (페이지 이동)
    • 클라이언트에게 처리결과를 파일로 응답하지 않고 301 상태코드(재요청)와 URL 주소를 전달하여 응답
    • 301 상태코드와 URL 주소를 전달받은 클라이언트는 브라우저의 URL 주소를 변경하고 변경된 URL 주소의 웹프로그램을 요청하여 처리결과를 응답받아 출력 (리다이렉트 이동)
    • response.sendRedirect("/servlet/error.html");//에러페이지 이동
  • 서블릿(웹프로그램)을 [POST] 방식으로 요청한 경우 사용자 입력값이 리퀘스트 메세지의 몸체부(Body)에 저장되어 전달
    • 리퀘스트 메세지의 몸체부에 저장되어 전달된 값의 문자형태(캐릭터셋)는 기본적으로 서유럽어(ISO-8859-1)로 설정 (입력값에 한글이 있는 경우 비정상적인 전달값으로 처리)
    • 리퀘스트 메세지의 몸체부에 저장되어 전달된 값을 원하는 문자형태(캐릭터셋)로 변경
  • HttpServletRequest 객체의 캐릭터셋을 변경하는 메소드
    • 형식) HttpServletRequest.setCharacterEncoding(String encoding)
    • request.setCharacterEncoding("utf-8");
  • 웹프로그램 요청시 전달된 값을 반환받아 저장 (입력태그 받아와서 저장)
    • 형식) HttpServletRequest.getParameter(String name) : 전달값을 반환하는 메소드
    • 전달값은 무조건 문자열(String 객체)로 반환
    • 전달값을 매개변수에 전달된 이름(식별자)로 구분하여 값 반환
    • 이름(식별자)로 전달된 값이 없는 경우 null 반환
    • String id=request.getParameter("id");
  • 같은 이름으로 전달되는 값이 있는 경우 첫번째 전달값만 반환받아 저장
  • 같은 이름으로 전달된 모든 값을 얻어와 문자열 배열(String[])로 반환하는 메소드
    • 형식) HttpServletRequest.getParameterValues(String name)
    • String[] hobby=request.getParameterValues("hobby");
  • 엔터(Enter)는 브라우저에서 동작되지 않으므로 br 태그로 변환하여 출력
    • out.println("<p><br>"+profile.replace("\n", "<br>")+"</p>");


package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//서블릿은 입력페이지(form.html)의 form 태그를 사용하여 [POST] 방식으로 요청
		//[GET] 빙식으로 요청한 경우 비정상적인 요청 → 에러페이지로 이동되도록 처리
		//HttpServletRequest.getMethod() : 클라이언트의 요청방식을 반환
		if(request.getMethod().equals("GET")) {
        //클라이언트가 웹프로그램을 [GET] 방식으로 요청한 경우 (비정상적인 요청)
			
            //방법1
			//HttpServletResponse.sendError(int sc):client에게 에러코드 전달
			//HttpServletResponse 인터페이스의 상수를 이용하여 상태코드 제공
			response.sendError(400);//response.sendError(405);
			response.sendError(HttpServletResponse.SC_BAD_REQUEST);//400
			response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);//405
			return;//요청 처리 메소드 종료
			
            
			//방법2
			//HttpServletResponse.sendRedirect(String url):client에게 URL 주소 전달
			//client는 변경된 URL 주소의 웹프로그램을 요청하여 처리결과를 출력(리다이렉트 이동)
			response.sendRedirect("/servlet/error.html");//에러페이지 이동
			response.sendRedirect("form.html");//입력페이지 이동
			return;
			
			
            //방법3
			out.println("<script type='text/javascript'>");
			out.println("alert('비정상적인 접근입니다.');");
			out.println("location.href='form.html';");
			out.println("</script>");
			return;
		}
		
		//리퀘스트 메세지의 전달된 값의 문자형태는 기본적으로 서유럽어로 설정
        //한글이 있는 경우 비정상적인 전달값으로 처리 → 문자형태(캐릭터셋) 변경
		//형식) : HttpServletRequest.setCharacterEncoding(String encoding)
		request.setCharacterEncoding("utf-8");
		
        
		//웹프로그램 요청시 전달된 값을 반환받아 저장 (매개변수에 전달된 식별자로 구분)
		//형식) HttpServletRequest.getParameter(String name) : 전달값을 반환
		String id=request.getParameter("id");

		
        
		//입력값에 대한 검증(생략 가능):보안성을 견고하게 구현하기 위해 작성하는 것을 권장
		if(id==null || id.equals("")) {//입력값이 없는 경우 (비정상적인 요청)
			response.sendRedirect("error.html");
			return;
		}
		
		if(!Pattern.matches("^[a-zA-Z]\\w{5,19}$", id)) {
        //입력형식이 맞지 않은 경우 (비정상적인 요청)
			response.sendRedirect("error.html");
			return;
		}
		
		
		String pass=request.getParameter("pass");
		String name=request.getParameter("name");
		String addr=request.getParameter("addr");
		String gender=request.getParameter("gender");
		String job=request.getParameter("job");
        
		//같은 이름으로 전달되는 값이 있는 경우 첫번째 전달값만 반환받아 저장
		//HttpServletRequest.getParameterValues(String name) : 같은 이름으로
        //전달된 모든 값을 얻어와 문자열 배열(String[])로 반환하는 메소드
		String[] hobby=request.getParameterValues("hobby");
		String profile=request.getParameter("profile");
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>회원정보확인</h1>");
		out.println("<hr>");
		out.println("<p>아이디 = "+id+"</p>");
		out.println("<p>비밀번호 = "+pass+"</p>");
		out.println("<p>이름 = "+name+"</p>");
		out.println("<p>주소 = "+addr+"</p>");
		out.println("<p>성별 = "+gender+"</p>");
		out.println("<p>직업 = "+job+"</p>");
		//out.println("<p>취미 = "+hobby+"</p>");
		if(hobby==null) {//전달값이 없는 경우 (취미를 선택하지 않은 경우)
			out.println("<p>취미 = 미선택</p>");
		} else {
			out.println("<p>취미 = ");
			for(int i=0;i<hobby.length;i++) {
				out.println(hobby[i]);
				if(i<hobby.length-1) {//배열의 마지막 요소가 아닌 경우
					out.println(",");
				}
			}
		}
		//엔터(Enter)는 브라우저에서 동작되지 않으므로 br 태그로 변환하여 출력
		out.println("<p>자기소개<br>"+profile.replace("\n", "<br>")+"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}





🎀 3. 파일 전달 (변환 불가)


🐣 html 파일 (입력페이지)

  • 올린이와 파일을 입력받아 처리페이지(view.itwill)를 요청하여 전달하는 웹문서

  • 사용자로부터 파일을 입력받아 웹프로그램을 요청하여 전달하기 위해서는 반드시 method
    속성값을 [POST]로 설정하고 enctype 속성값을 [multipart/form-data]로 설정

    • enctype 속성 : [application/x-www-form-urlencoded] 또는 [multipart/form-data] 중 하나를 속성값으로 설정
    • [application/x-www-form-urlencoded] : 입력값을 인코딩 처리된 문자값으로 전달(기본으로 파일 전달 불가능)
    • [multipart/form-data] : 모든 입력값을 원시데이타(멀티파트 폼데이타)로 전달 (파일 전달 가능)
    • <form action="view.itwill" method="post" enctype="multipart/form-data">



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Servlet</title>
<link rel="stylesheet" href="css/common.css" type="text/css"/>
</head>
<body>
<h1>파일 업로드-1</h1>
<hr/>
입력 데이타 및 입력 파일을 웹브라우저에 출력<br/>
<hr/>
<!--파일을 전달하기 위해 method 속성값:[POST], enctype 속성값:[multipart/form-data]로 설정-->
<!--[multipart/form-data] : 모든 입력값을 원시데이타로 전달 (파일 전달 가능) -->
<form action="view.itwill" method="post" enctype="multipart/form-data">
<table border="0" cellpadding="0" cellspacing="0" width="500" align="center">
<tr>
	<td valign="top" bgcolor="#000000" align="center">
		<table border="0" cellpadding="1" cellspacing="1" width="500">
			<tr bgcolor="#556b2f" class="menu">
				<td align="center" colspan="2">
					멀티파트/파일업로드(업로드 데이터 보기)
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td width="100" align="center" class="t1">
					올린이
				</td>
				<td width="400" align="left">
					&nbsp;<input type="text" name="name" 
						size="10" maxlength="10" class="TXTFLD">
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td width="100" align="center" class="t1">
					파일선택
				</td>
				<td width="400" align="left">
					&nbsp;<input type="file" name="fileone" 
						size="40" class="TXTFLD">
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td align="center" colspan="2">
					<input type="submit" value="올라가라..">
				</td>
			</tr>
		</table>
	</td>
</tr>
</table>
</form>
</body>
</html>





🐣 Servlet (원시데이터 전달)

  • 입력페이지(file_view.html)에서 전달된 입력값(올린이)과 입력파일을 반환받아 클라이언트에게 전달하는 서블릿
    • 입력페이지에서 전달된 원시데이타(멀티파트 폼데이타)를 클라이언트에게 전달하여 응답 처리
  • 원시데이타(멀티파트 폼데이타)로 전달되는 값 또는 파일은 HttpServletRequest 객체의 getParameter() 메소드를 호출하여 값 또는 파일의 반환 불가능

    • 원시데이터로 전달되는 값을 문자데이터로 저장 불가능
  • HttpServletRequest.getInputStream() : 리퀘스트 메세지의 몸체부에 저장되어 전달되는 원시데이타를 읽기 위한 입력스트림(ServletInputStream 객체)을 반환하는 메소드



package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//비정상적인 요청에 대한 처리
		if(request.getMethod().equals("GET")) {
			response.sendRedirect("file_view.html");
			return;
		}
		
		
		//리퀘스트 메세지의 몸체부의 저장값에 대한 캐릭터셋 변경
		request.setCharacterEncoding("utf-8");
		
		//전달값 및 전달파일을 반환받아 저장
		//원시데이타로 전달되는 값 또는 파일은 HttpServletRequest 객체의
		//getParameter() 메소드를 호출하여 값 또는 파일의 반환 불가능
		String name=request.getParameter("name");
		String fileone=request.getParameter("fileone");
		
		//응답결과 생성 원시데이터로 전달되는 값을 문자데이터로 저장 불가능
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>입력값과 입력파일</h1>");
		out.println("<hr>");
		out.println("<p>올린이 = "+name+"</p>");
		out.println("<p>파일명 = "+fileone+"</p>");
		out.println("</body>");
		out.println("</html>");
		
        
		
        
        
		//HttpServletRequest.getInputStream() : 원시데이타를 읽기 위한 입력스트림을 반환
		ServletInputStream in=request.getInputStream();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>입력값과 입력파일</h1>");
		out.println("<hr>");
		out.println("<p>리퀘스트 메세지의 몸체부에 저장되어 전달된 원시데이타(멀티파트 폼데이타)</p>");
		out.println("<hr>");
		out.println("<pre>");//입력된 내용을 그대로 출력하는 태그
		while(true) {
			int readByte=in.read();
			if(readByte==-1) break;
			out.write(readByte);
		}
		out.println("</pre>");
		out.println("</body>");
		out.println("</html>");
	}

}





🎀 4. 파일 전달 (upload)



🐣 html 파일 (입력페이지)

  • 올린이와 파일을 입력받아 처리페이지(upload.itwill)를 요청하여 전달하는 웹문서
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Servlet</title>
<link rel="stylesheet" href="css/common.css" type="text/css"/>
</head>
<body>
<h1>파일 업로드-2</h1>
<hr/>
입력 파일을 서버에 저장 후 입력 데이타 및 입력 파일명을 웹브라우저에 출력<br/>
<hr/>
<form action="upload.itwill" method="post" enctype="multipart/form-data">
<table border="0" cellpadding="0" cellspacing="0" width="500" align="center">
<tr>
	<td valign="top" bgcolor="#000000" align="center">
		<table border="0" cellpadding="1" cellspacing="1" width="500">
			<tr bgcolor="#556b2f" class="menu">
				<td align="center" colspan="2">
					멀티파트/파일업로드(업로드 파일 저장)
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td width="100" align="center" class="t1">
					올린이
				</td>
				<td width="400" align="left">
					&nbsp;<input type="text" name="name" 
						size="10" maxlength="10" class="TXTFLD">
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td width="100" align="center" class="t1">
					파일선택-1
				</td>
				<td width="400" align="left">
					&nbsp;<input type="file" name="fileone" 
						size="40" class="TXTFLD">
				</td>
			</tr>
			<tr bgcolor="#f4f4f4">
				<td width="100" align="center" class="t1">
					파일선택-2
				</td>
				<td width="400" align="left">
					&nbsp;<input type="file" name="filetwo" 
						size="40" class="TXTFLD">
				</td>
			</tr>

			<tr bgcolor="#f4f4f4">
				<td align="center" colspan="2">
					<input type="submit" value="올라가라..">
				</td>
			</tr>
		</table>
	</td>
</tr>
</table>
</form>
</body>
</html>





📌 업로드 위한 lib 파일 빌드처리

  • Oreilly 그룹에서 배포한 cos 라이브러리 파일을 다운로드 받아 프로젝트에 연결하는 방법 (Build 처리)
  1. http://www.servlets.com 사이트 접속 → 좌측 COS File Upload Library 메뉴 클릭 → 하단 cos-22.05.zip 다운로드

  2. cos-22.05.zip 파일 압축 풀기 → cos-22.05 폴더 이동 → lib 폴더로 이동 → cos.jar 파일 복사

  3. 프로젝트 → src/main/webapp → WEB-INB → lib → cos.jar 파일 붙여넣기

  4. 라이브러리 파일이 자동으로 빌드 처리됨 - Web App Libraries 확인


🐣 Servlet (파일 upload)

  • 원시데이타(멀티파트 폼데이타)를 전달받은 경우 원시데이타를 처리하기 위한 클래스를 사용하여 서블릿 작성

    • Apache 그룹에서 배포한 commons-fileupload 라이브러리의 클래스 사용
      (선택적 파일 업로드로 효율적(입력값에 대한 검증 가능)이지만 복잡)
    • Oreilly 그룹에서 배포한 cos 라이브러리의 클래스 사용
      (무조건적인 파일 업로드로 간단하지만 비효율적(입력값에 대한 검증 불가))
  • 입력페이지(file_upload.html)에서 전달된 입력값(올린이)과 입력파일명을 반환받아 클라이언트에게 전달하는 서블릿

    • 전달된 입력파일은 서버 디렉토리에 저장되도록 처리 - 업로드(Upload)
  • 전달파일을 저장하기 위한 서버 디렉토리의 파일 시스템 경로를 반환받아 저장
    • (전달된 값을 저장하도록 eclipse webapp파일에 폴더 미리 생성 필요)
    • 작업 디렉토리(WorkSpace)가 아닌 웹디렉토리(WebApps)의 파일 시스템 경로 반환
    • String saveDirectory=request.getServletContext().getRealPath("/upload");
  • MultipartRequest 클래스로 객체 생성
    • MultipartRequest 객체 : 멀티파트 폼데이타를 처리하기 위한 기능을 제공하는 객체
    • MultipartRequest 객체를 생성하면 모든 입력파일을 전달받아 서버 디렉토리에 자동 저장 (자동 업로드 처리)
  • MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy policy)
    • request(필수) : 요청정보가 저장된 HttpServletRequest 객체 전달
    • saveDirectory(필수) : 전달파일을 저장하기 위한 서버 디렉터리의 파일 시스템 경로 전달
    • maxPostSize(선택) : 처리 가능한 멀티파트 폼데이타의 크기 전달 (단위 : Byte)
    • encoding(선택) : 멀티파트 폼데이타로 전달되는 문자값에 대한 캐릭터셋 전달
    • policy(선택) : 파일이름을 변경하기 위한 기능을 제공하는 FileRenamePolicy 객체 전달
    • MultipartRequest mr=new MultipartRequest(request, saveDirectory, 20*1024*1024, "utf-8");
    • policy가 생략되었으므로 같은 이름의 파일이 업로드 될경우 덮어씌우기 하여 저장됨
  • FileRenamePolicy 객체 : 전달파일을 업로드 처리할 때 서버 디렉토리에 전달파일과 같은 이름의 파일이 이미 존재할 경우 전달파일의 이름을 변경하여 업로드 처리하기 위한 기능을 제공하는 객체
    • 생성자 매개변수에 FileRenamePolicy 객체를 전달하지 않으면 서버 디렉토리에 전달파일과 같은 이름의 파일이 있는 경우 전달파일로 기존 파일을 덮어씌우기(OverWrite) 하여 저장
    • FileRenamePolicy 객체는 FileRenamePolicy 인터페이스를 상속받은 자식클래스로 생성
    • cos 라이브러리의 DefaultFileRenamePolicy 클래스를 사용하여 FileRenamePolicy 객체 생성
    • MultipartRequest mr=new MultipartRequest(request,saveDirectory,1024,"utf-8",new DefaultFileRenamePolicy()); 
  • MultipartRequest.getParameter(String name) : 멀티파트 폼데이타로 전달된 문자값을 문자열(String 객체)로 반환하는 메소드
  • 전달받은 파일명(입력파일명)을 반환받아 저장
  • MultipartRequest.getOriginalFileName(String name) : 멀티파트 폼데이타로 전달된 입력 파일의 이름을 문자열로 반환하는 메소드
  • 업로드 처리된 파일명을 반환받아 저장
    • MultipartRequest.getFilesystemName(String name) : 멀티파트 폼데이타로 전달된 파일에 대한 업로드 파일의 이름을 문자열로 반환하는 메소드
    • String fileone=mr.getFilesystemName("fileone");


package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//비정상적인 요청에 대한 처리
		if(request.getMethod().equals("GET")) {
			response.sendRedirect("file_upload.html");
			return;
		}
		
		//전달파일을 저장하기 위한 서버 디렉토리의 파일 시스템 경로를 반환받아 저장
		String saveDirectory=request.getServletContext().getRealPath("/upload");
		
		//MultipartRequest 클래스로 객체 생성 : 입력파일 전달받아 자동 업로드 처리
		//MultipartRequest(HttpServletRequest request, String saveDirectory,
        //int maxPostSize, String encoding, FileRenamePolicy policy)
		//FileRenamePolicy 객체 : 업로드 처리할 때 서버 디렉토리에 같은 이름의 파일이
        //존재할 경우 전달파일의 이름을 변경하여 업로드 처리하기 위한 기능을 제공
		//자식클래스인 DefaultFileRenamePolicy 클래스로 FileRenamePolicy 객체 생성 
		MultipartRequest mr=new MultipartRequest(request, saveDirectory
				, 20*1024*1024, "utf-8", new DefaultFileRenamePolicy());
	
		//전달값을 반환받아 저장
		//MultipartRequest.getParameter(String name) : 멀티파트 폼데이타로 전달된
        //문자값을 문자열(String 객체)로 반환하는 메소드
		String name=mr.getParameter("name");
		
		//MultipartRequest.getOriginalFileName(String name) : 멀티파트 폼데이타로
        //전달된 입력 파일의 이름을 문자열로 반환하는 메소드
		String fileone=mr.getOriginalFileName("fileone");//변경전 파일이름 반환
		String filetwo=mr.getOriginalFileName("filetwo");
		
		//MultipartRequest.getFilesystemName(String name) : 멀티파트 폼데이타로
        //전달된 파일에 대한 업로드 파일의 이름을 문자열로 반환하는 메소드
		String fileone=mr.getFilesystemName("fileone");//변경된 파일이름 반환
		String filetwo=mr.getFilesystemName("filetwo");
		
		//응답결과 생성
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>파일 업로드</h1>");
		out.println("<hr>");
		out.println("<p>올린이 = "+name+"</p>");
		out.println("<p>파일-1 = "+fileone+"</p>");
		out.println("<p>파일-2 = "+filetwo+"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}





📌 server location 변경 방법

  1. apache tomcat server stop (연결 중단)

  2. servers Tomcat v9.0 ... 오른쪽버튼 add and remove

  3. 활성화되어있는거 remove all 해서 비활성화 처리하면 변경 가능

  4. 변경 후 restart 하면 실행 확인 가능


💡 파일 업로드시 주의

  • 파일을 업로드하면 작업 디렉토리가 아닌 웹디렉토리에 저장되므로 서버를 재시작할경우 작업 디렉토리와 동기화 처리되면서 웹디렉토리에 저장되었던 파일 소멸

  • WAS 프로그램 실행(Start)될때 작업 디렉토리의 프로젝트 파일이 웹디렉토리의 자원으로 동기화 처리
    → 작업 디렉토리에는 업로드 파일이 없으므로 동기화 처리될 경우 웹디렉토리의 업로드 파일 소멸

  • 작업 디렉토리에서는 값에 대한 검증을 하기 위해 사용하며 업로드할경우에는 사용하지 않을 것을 권장


🎀 5. 쿠키 전달

  • 쿠키(Cookie) : 서버(웹프로그램)와 클라이언트(브라우저)의 연결 지속성을 제공하기 위해 클라이언트에 저장되는 값
    • 쿠키는 접속 서버 정보를 식별자로 구분하여 클라이언트에 저장

🐣 CreateCookie Servlet

  • 쿠키를 클라이언트에게 전달하는 서블릿
  • Cookie 클래스로 객체 생성 (Cookie 객체 : 쿠키 관련 정보를 저장하기 위한 객체)
  • Cookie(String name, String value) : 쿠키명과 쿠키값을 매개변수에 전달하여 객체 생성
    • 쿠키명 : 쿠키값을 구분하기 위한 식별자, 쿠키값 : 연결 지속성을 제공하기 위한 문자값
    • 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자만 사용하여 작성 가능
    • Cookie cookiename=new Cookie("name", "value");
  • 클라이언트에게 전달되어 저장될 쿠키의 유지시간 변경
  • Cookie.setMaxAge(int expiry) : 쿠키의 유지시간(초)를 변경하는 메소드
    • 쿠키의 유지시간을 변경하지 않은 경우 기본값은 [-1]로 자동 설정
    • 쿠키의 유지시간이 [-1]로 설정된 경우 쿠키는 브라우저 종료시 자동 소멸
    • cookiename.setMaxAge(24*60*60);//쿠키 유지시간 : 1일
  • 클라이언트에게 쿠키 전달 (쿠키를 전달받은 클라이언트는 쿠키를 저장)
    • 쿠키의 유지시간을 변경하지 않은 쿠키는 브라우저 메모리에 저장 (브라우저 종료시 자동 소멸)
    • 쿠키의 유지시간을 변경한 쿠키는 쿠키 파일에 저장 (유지시간이 지나면 자동 소멸)
    • HttpServletResponse.addCookie(Cookie cookie) : 클라이언트에게 쿠키(Cookie 객체)를 전달하는 메소드
    • response.addCookie(cookiename);
package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//Cookie(String name, String value) : Cookie 클래스로 객체 생성
		Cookie idCookie=new Cookie("id", "abc123");
		Cookie countCookie=new Cookie("count", "0");
		
		//Cookie.setMaxAge(int expiry) : 쿠키의 유지시간(초)를 변경하는 메소드
		//쿠키의 유지시간이 [-1](기본)로 설정된 경우 쿠키는 브라우저 종료시 자동 소멸
		countCookie.setMaxAge(24*60*60);//쿠키 유지시간 : 1일
		
		//클라이언트에게 쿠키 전달 → 쿠키를 전달받은 클라이언트는 쿠키를 저장
		//HttpServletResponse.addCookie(Cookie cookie):client에게 쿠키를 전달하는 메소드
		response.addCookie(idCookie);
		response.addCookie(countCookie);
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>쿠키 전달</h1>");
		out.println("<hr>");
		out.println("<p>네 안에 쿠키 있다.</p>");
		out.println("<hr>");
		out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
		out.println("</body>");
		out.println("</html>");
	}
}





🐣 ReadCookie Servlet

  • 클라이언트에 의해 전달된 쿠키를 읽어 쿠키값을 클라이언트에 전달하는 서블릿
  • 클라이언트는 요청 URL 주소의 접속 서버 정보를 이용하여 해당 서버 정보로 저장된 모든 쿠키를 웹프로그램 요청시 무조건 전달
  • 클라이언트에서 보내온 모든 쿠키를 반환받아 저장
    • HttpServletRequest.getCookies() : 클라이언트에서 보내온 모든 쿠키를 Cookie 객체 배열로 반환하는 메소드
    • Cookie[] cookies=request.getCookies();
    • Cookie.getName() : Cookie 객체에 저장된 쿠키명을 반환하는 메소드
    • Cookie.getValue() : Cookie 객체에 저장된 쿠키값을 반환하는 메소드
    • 클라이언트에 저장된 기존 쿠키의 이름과 같은 이름의 쿠키를 전달하면 쿠키값 변경
package xyz.itwill.servlet;

//클라이언트에 의해 전달된 쿠키를 읽어 쿠키값을 클라이언트에 전달하는 서블릿
@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//HttpServletRequest.getCookies() : 클라이언트에서 보내온 모든 쿠키를 
        //Cookie 객체 배열로 반환하는 메소드
		Cookie[] cookies=request.getCookies();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>쿠키 읽기</h1>");
		out.println("<hr>");
		if(cookies==null) {//클라이언트에서 보내온 쿠키가 없는 경우
			out.println("<p>네 안에 쿠키 없다.</p>");
		} else {
			String id="";//초기값 저장
			String count="";
			
			//Cookie 객체 배열에 저장된 요소값(Cookie 객체)를 반복적으로 제공받아 처리
			for(Cookie cookie:cookies) {
				//client에서 보내온 쿠키들 중 쿠키명을 비교하여 원하는 쿠키값을 반환받아 저장
				//Cookie.getName() : Cookie 객체에 저장된 쿠키명을 반환하는 메소드
				if(cookie.getName().equals("id")) {
					//Cookie.getValue() : Cookie 객체에 저장된 쿠키값을 반환하는 메소드
					id=cookie.getValue();
				} else if(cookie.getName().equals("count")) {
					count=cookie.getValue();
				}
			}
			
			//클라이언트에게 쿠키값을 전달하여 출력
			if(!id.equals("")) {//id 쿠키값이 있는 경우
				out.println("<p>아이디 = "+id+"</p>");
			}
			
			if(!count.equals("")) {//count 쿠키값이 있는 경우
				int cnt=Integer.parseInt(count)+1;
				out.println("<p>서블릿 요청횟수 = "+cnt+"</p>");
				
				//client에 저장된 기존 쿠키의 이름과 같은 이름의 쿠키를 전달하면 쿠키값 변경
				Cookie cookie=new Cookie("count", cnt+"");
				cookie.setMaxAge(24*60*60);
				response.addCookie(cookie);
			}
		}
		out.println("<hr>");
		out.println("<p><a href='create.itwill'>쿠키 전달</a></p>");
		out.println("<p><a href='remove.itwill'>쿠키 제거</a></p>");
		out.println("</body>");
		out.println("</html>");
	}
}





🐣 RemoveCookie Servlet

  • 클라이언트에 저장된 모든 쿠키를 제거하는 서블릿
    • 클라이언트에 저장된 쿠키의 유지시간을 [0]으로 변경하면 쿠키 제거
package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//클라이언트에서 보내온 모든 쿠키를 반환받아 저장
		Cookie[] cookies=request.getCookies();
		
		if(cookies!=null) {//클라이언트에서 보내온 쿠키가 있는 경우
			//Cookie 객체 배열에 저장된 요소값(Cookie 객체)를 반복적으로 제공받아 처리
			for(Cookie cookie:cookies) {
				//client에서 보내온 쿠키의 유지시간을 [0]으로 변경하여 클라이언트에게 전달
				//유지시간이 지난 쿠키는 client에서 자동 소멸(client에 저장된 쿠키 제거)
				cookie.setMaxAge(0);
				response.addCookie(cookie);
			}
		}
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>쿠키 제거</h1>");
		out.println("<hr>");
		out.println("<p>네 안에 쿠키 없다.</p>");
		out.println("<hr>");
		out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
		out.println("</body>");
		out.println("</html>");
	}
}





🎀 6. 세션 전달 ★

  • 세션(Session) : 서버(웹프로그램)와 클라이언트(브라우저)의 연결 지속성을 제공하기 위해 서버에 저장되는 값

    • 보안 관련 정보(권한)를 저장할 목적으로 사용 (client에서 조작 불가능)
    • 세션 아이디(식별자)를 이용하여 클라이언트를 구분해 세션에 값(객체)을 저장하여 사용
  • 세션 바인딩(Session Binding) : 세션을 웹프로그램에서 사용할 수 있도록 결합하는 작업 (WAS)
  • 클라이언트에서 [JSESSIONID] 이름의 쿠키를 제공하지 않을 경우 새로운 세션을 생성하여 바인딩 처리

    • 생성된 세션의 아이디(식별자)를 [JSESSIONID] 이름의 쿠키값으로 저장하여 클라이언트에게 전달
    • 서버로부터 전달받은 [JSESSIONID] 쿠키를 클라이언트는 브라우저 메모리에 저장 (브라우저가 종료되면 소멸)
  • 클라이언트에서 [JSESSIONID] 이름의 쿠키를 제공받은 경우 세션 트렉킹하여 바인딩 처리

    • 세션 트렉킹(Session Tracking) : [JSESSIONID] 이름의 쿠키값을 서버에 존재하는 세션의 아이디와 비교하여 검색하는 작업

🐣 Session Servlet

  • 세션을 바인딩하여 클라이언트에게 바인딩된 세션정보를 전달하는 서블릿
  • HttpServletRequest.getSession() : 바인딩 처리된 세션(HttpSession 객체)을 반환하는 메소드
    • 새로운 세션을 생성하여 바인딩하거나 기존 세션을 트렉킹하여 바인딩 처리
  • HttpSession 객체 : 세션 관련 정보를 저장한 객체
    • 연결 지속성을 제공하기 위한 값(객체)을 Map 형식(이름과 값을 하나의 요소로 표현)으로 저장
    • HttpSession session=request.getSession();
  • HttpSession.isNew() : 세션을 트렉킹하여 바인딩된 경우 [false]를 반환하고 세션을 생성하여 바인딩 경우 [true]를 반환하는 메소드

  • HttpSession.getId() : 세션을 구분하기 위한 식별자(세션 아이디)를 반환하는 메소드

  • HttpSession.getMaxInactiveInterval() : 바인딩된 세션의 유지시간(초)를 반환하는 메소드

    • 기본적으로 세션의 유지시간은 1800초(30분)로 설정
  • HttpSession.setAttribute(String attributeName, Object attributeValue)
    • 바인딩된 세션에 속성명(문자열)과 속성값(객체)을 전달받아 저장(변경)하는 메소드
    • 기존 세션에 저장된 값과 같은 이름의 속성명을 사용할 경우 속성값 변경
    • 연결 지속성을 제공하기 위한 정보를 이름과 값의 엔트리(Entry) 형식으로 저장
  • 동일한 세션을 바인딩한 모든 웹프로그램에서 속성명으로 속성값을 제공받아 사용
    • 하나의 클라이언트는 세션을 통해 모든 웹프로그램에서 객체를 공유하여 사용 가능
    • session.setAttribute("now", new Date());
      (다른 웹프로그램에서 (Date)객체를 사용할 수 있도록 공유)
  • HttpSession.getAttribute(String attributeName) : 바인딩된 세션에 저장된 속성값을 속성명을 전달받아 반환하는 메소드
    • 세션에 저장된 속성값을 Object 타입으로 반환하므로 반드시 명시적 객체 형변환 후 사용
    • 매개변수로 전달받은 속성명의 속성값이 없는 경우 null 반환
  • HttpSession.removeAttribute(String attributeName) : 바인딩된 세션에 저장된 속성값을 속성명을 전달받아 삭제하는 메소드
  • HttpSession.invalidate() : 바인딩된 세션의 결합을 해제하는 메소드
    • 세션의 언바인딩(UnBinding) 처리 (세션 소멸)
package xyz.itwill.servlet;

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

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//HttpServletRequest.getSession():바인딩 처리된 세션(HttpSession 객체)을 반환
		//새로운 세션을 생성하거나 기존 세션을 트렉킹하여 바인딩처리(이름과 값을 하나의 요소로 표현)
		HttpSession session=request.getSession();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>세션(Session)</h1>");
		out.println("<hr>");
		//HttpSession.isNew(): 트렉킹하여 바인딩: [false] 반환, 생성하여 바인딩: [true] 반환
		if(session.isNew()) {
			out.println("<p>세션을 생성하여 바인딩 하였습니다.</p>");
		} else {
			out.println("<p>세션을 트렉킹하여 바인딩 하였습니다.</p>");
		}
		
		//HttpSession.getId() : 세션을 구분하기 위한 식별자(세션 아이디)를 반환하는 메소드
		out.println("<p>세션 아이디 = "+session.getId()+"</p>");
		
		//HttpSession.getMaxInactiveInterval() : 바인딩된 세션의 유지시간(초)를 반환
		out.println("<p>세션 유지시간="+session.getMaxInactiveInterval()+"초</p>");
	
		//HttpSession.setAttribute(String attributeName, Object attributeValue)
		//: 바인딩된 세션에 속성명(문자열)과 속성값(객체)을 전달받아 저장(변경)하는 메소드
		//같은 이름의 속성명을 사용할 경우 속성값 변경, 이름과 값의 엔트리 형식으로 저장
		//동일한 세션을 바인딩한 모든 웹프로그램에서 속성명으로 속성값을 제공받아 사용
		// → 하나의 클라이언트는 세션을 통해 모든 웹프로그램에서 객체를 공유하여 사용 가능
		session.setAttribute("now", new Date());//다른 웹프로그램에서 객체를 사용하도록 공유
		
        
		//HttpSession.getAttribute(String attributeName) : 속성명을 전달받아 속성값 반환
		//→세션에 저장된 속성값을 Object 타입으로 반환하므로 반드시 명시적 객체 형변환 후 사용
		Date now=(Date)session.getAttribute("now");
		out.println("<p>세션으로부터 제공받은 객체 = "+now+"</p>");
		
		//HttpSession.removeAttribute(String attributeName):속성명을 전달받아 속성값 삭제
		session.removeAttribute("now");
		
		//HttpSession.invalidate() : 바인딩된 세션의 결합을 해제하는 메소드 (세션 소멸)
		session.invalidate();
		
		out.println("</body>");
		out.println("</html>");
	}
}





profile
Study Log 📂

0개의 댓글