복습

+ Apache Tomcat 을 설치시 선행 설치되어야하는 jre 의 rt.jar 를 통해 자바 라이브러리 사용 가능

+ 출력시 out 객체, 표현식 태그, 표현 언어를 쓰는 방법이 있다

+ Model 1 에선 표현식 태그를 사용하지만 Model 2 에서는 표현식 태그보다 표현언어 ${} 를 사용

 

page  지시어 태그

- 이클립스로 jsp 파일 만들면 1 라인에 자동 생성되는 태그

 

page 지시어 태그 속성

1. contentType : 현재문서의 형식, 텍스트인지 이미지인지, 텍스트라면 text/html 

2. charset : 현재문서를 브라우저로 출력시 어떻게 인코딩 시킬지, 한글은 EUC-KR 또는 UTF-8

+ UTF-8 로 해야 영문 브라우저에서도 한글값 깨지 않음

- 값이 넘어가는것과 관련없다, 현재 문서를 인코딩

3. import : 외부의 클래스등을 사용하려면 import 해야함

4. errorPage / isErrorPage : 페이지 처리시 사용해서 한 페이지에서 에러를 한꺼번에 처리할 수 있게 함

 

주석

1. JSP 주석 : 아무곳이나 기술 가능

2. JSP 스크립트 주석 : 스크립틀릿, 표현식, 선언문 태그 안에서 사용

- JSP 주석과 JSP 스크립트 주석은 웹 브라우저에 전송되지 않음, 소스보기에 표시안됨

+ HTML 주석 : 웹 브라우저에 전송되므로 소스보기에 표시됨

 

내장 객체

- 보통 클래스로 직접 객체를 생성해서 사용해야하지만 Javascript 나 JSP 는 내장객체가 지원됨 

- JSP 는 jre 를 불러왔기 때문에 직접 객체 생성도 가능하고 내장객체도 사용 가능 

- request 객체, response 객체, session 객체, out 객체 등

 

내장 객체의 메소드

- 이 내장객체는 클래스가 아니기 때문에 지원 메소드를 찾기 힘들다

- 메소드를 찾으려면 '실제 타입' 으로 되어있는 해당 클래스나 인터페이스로 찾아야한다

- 여기 들어있는 클래스나 인터페이스의 패키지는 모두 Java EE 이다 (자바시간에 배운건 Java SE)

- 이러한 Java EE 라이브러리 클래스들, 즉 특정 객체의 지원 메소드들은 Apache Tomcat 의 라이브러리를 사용하는 것이다

 

Apache Tomcat 의 라이브러리

- Java EE 라이브러리 클래스들은 Apache Tomcat 의 라이브러리 이다

- 주로 servlet-api.jar 를 많이 사용, 이 파일 안에 request 객체의 메소드들이 있다

 

request 객체

- 클라이언트가 get / post 로 요청하면 그 요청을 받아서 처리해주는 객체

- 가장 사용빈도 높은 객체

 

request 객체 메소드

- 6가지 메소드가 중요

 

request 객체의 메소드

void setCharacterEncoding(String env) 한글 인코딩 처리, post 방식일때 사용
getParameter(String name) name에 해당하는 파라미터 값을 구함
String[] getParameterValues(String name) checkbox 같이 여러 개의 파라미터 값을 구함
String getRemoteAddr() client의 IP주소를 구함
String getRequestURI() 요청 URI를 구함
String getContextPath() 컨텍스트 패스(project명)를 구함

 

request 객체의 setCharacterEncoding() 메소드

- "한글 값" 이 post 방식으로 넘어갈때는 반드시 setCharacterEncoding() 을 통해 인코딩 코드를 위에 추가해야함

+ Model 2 에서 action 값 대신 Controller 로 페이지가 넘어간다는 것 빼고 한글 인코딩 문제는 Model 2 도 같다

 

request 객체의 getParameter() 메소드

- 값 전달시 사용

- name 값이 변수가 되어서 입력양식에서 입력된 값이나 선택양식의 value 값을 구해옴

 

request 객체의 getParameter() 메소드

- 체크박스와 같이 여러개의 값이 넘어갈때 사용

- name 값이 변수가 되어서 입력양식에서 입력된 값이나 선택양식의 value 값을 구해옴

- 리턴으로 String 배열을 리턴해준다

- 첫번째 전달된 값은 0 번방, 두번째 전달된 값은 1번방

 

request 객체의 getRequestURI() 메소드

- 요청 URI 를 구해줌

 

request 객체의 getContextPath() 메소드

- 현재 프로젝트 명을 구해줌

 


JSP 내장 객체 예제 7

request 객체 예제 7

- WebContent/request/board

- HTML 시간에 만든 로그인 폼, 게시판 폼, 회원가입 폼에서 값을 전달하고 출력해보자

- HTML 과 jQuery 시간에 폼 만들기, 유효성 검사했던 내용에 값 전달 기능을 추가해보자

- boardform.html & board.js & board.jsp

- boardform.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 폼</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
	/* $(function(){
		$("form").submit(function(){
			if($.trim($("#writer").val()) == ""){
				alert("작성자명을 입력하세요.");
				$("#writer").focus();
				return false;
			}
			if($.trim($("#passwd").val()) == ""){
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			if($("#passwd").val().length <2 || 
			   $("#passwd").val().length >8	){
				alert("비밀번호는 2~8자로 입력하세요");
				$("#passwd").val("").focus();
				return false;
			}
			if($.trim($("#subject").val()) == ""){
				alert("제목을 입력하세요.");
				$("#subject").focus();
				return false;
			}
			if($.trim($("#content").val()) == ""){
				alert("내용을 입력하세요.");
				$("#content").focus();
				return false;
			}
			if($.trim($("#content").val()).length > 200){
				alert("내용은 200자 이내로 입력하세요");
				$("#content").focus();
				return false;
			}
		});		
	});	 */
</script>

<script src="board.js"></script>

</head>
<body>

<form method="post" action="board.jsp">
<table border=1 width=600 align=center>
	<caption>게시판</caption>
	<tr><th>작성자</th>  <!-- th : 가운데 정렬, 찐하게 출력 -->
		<td><input type=text size=30 id="writer" name="writer" 
							         placeholder="작성자명 입력"></td>
	</tr>
	<tr><th>비밀번호</th>
		<td><input type=password size=30 id="passwd" name="passwd" placeholder="2~8자 이내 입력"></td>
	</tr>
	<tr><th>제목</th>
		<td><input type=text size=60 id="subject" name="subject"></td>
	</tr>
	<tr><th>내용</th>
		<td><textarea rows="5" cols="50" id="content" name="content" placeholder="200자 이내로 입력"></textarea></td>
	</tr>
	<tr><th>파일첨부</th>
		<td><input type=file></td>
	</tr>
	<tr><td colspan=2 align=center>
			<input type=submit value="글작성">	 <!-- submit :전송기능 있는 버튼 -->
			<!-- <input type=button value="글작성2">  -->  <!-- button :전송기능 없는 버튼 -->
			<!-- <button>글작성3</button>	 -->			 <!-- 전송기능이 있는 버튼 -->
			<!-- <button type=submit>글작성4</button>  --> <!-- 전송기능이 있는 버튼 -->
			<!-- <button type=button>글작성5</button> -->  <!-- 전송기능이 없는 버튼 --> 
			<input type=reset value="취소">      <!-- 초기화 버튼 -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

- board.jsp 파일 생성하고 작성하기

- board.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	request.setCharacterEncoding("UTF-8");

	String writer = request.getParameter("writer");
	String passwd = request.getParameter("passwd");
	String subject = request.getParameter("subject");
	String content = request.getParameter("content");

%>

작성자 : <%=writer%> <br>
비밀번호 : <%=passwd %> <br>
제목 : <%=subject %> <br>
내용 : <%=content %> <br>

1. 한글 값 인코딩

2. getParameter() 로 전달된 값 받기

3. 전달된 값을 표현 태그에서 출력

 

- boardform.html 실행 결과

- 내용 textarea 에 두줄을 입력시 두줄로 나오지 않고 한줄로 나온다

 

줄이 바뀐상태로 출력하게 하기 해결 방법 2가지 

1. 표현식태그 좌우에 <pre> </pre> 태그로 감싸기

 

2. 자바의 replace() 함수로 값을 치환

- '내용'을 전달받아서 replace() 함수로 "\n"을 <br> 태그로 치환시켜준다

- textarea 에서 사용자가 값을 입력하면서 Enter 를 누르면 \n 이 입력됨

- 이걸 출력할때 줄을 바꾸려면 <br> 태그가 있어야하므로 <br> 태그로 치환

+ 글꼴, 글자크기 차이가 있지만 CSS 에서 처리할 수 있다

 

- board.jsp (수정)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	request.setCharacterEncoding("UTF-8");

	String writer = request.getParameter("writer");
	String passwd = request.getParameter("passwd");
	String subject = request.getParameter("subject");
	String content = request.getParameter("content");
	
	// replace("n","<br>") : \n을 <br> 태그로 치환시킨다.
	String contents = request.getParameter("content").replace("\n", "<br>");

%>

작성자 : <%=writer%> <br>
비밀번호 : <%=passwd %> <br>
제목 : <%=subject %> <br>
내용1 : <pre><%=content %></pre> <br>
내용2 : <br>
<%=contents %>

+ 이후엔 DB 연동해서 insert sql 문 실행해서 만들어진 테이블에 insert 할 것

+ 지금은 클라이언트가 요청한 것을 변수로 받아서 출력만 하고 있다

 

- board.js

$(function(){
		$("form").submit(function(){
			if($.trim($("#writer").val()) == ""){
				alert("작성자명을 입력하세요.");
				$("#writer").focus();
				return false;
			}
			if($.trim($("#passwd").val()) == ""){
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			if($("#passwd").val().length <2 || 
			   $("#passwd").val().length >8	){
				alert("비밀번호는 2~8자로 입력하세요");
				$("#passwd").val("").focus();
				return false;
			}
			if($.trim($("#subject").val()) == ""){
				alert("제목을 입력하세요.");
				$("#subject").focus();
				return false;
			}
			if($.trim($("#content").val()) == ""){
				alert("내용을 입력하세요.");
				$("#content").focus();
				return false;
			}
			if($.trim($("#content").val()).length > 200){
				alert("내용은 200자 이내로 입력하세요");
				$("#content").focus();
				return false;
			}
		});		
	});

- jQuery 로 유효성 검사를 구현했다

 

+ 에러 500 : 주로 코드 오류

 

JSP 내장 객체 예제 8

request 객체 예제 8

- WebContent/request/member

- HTML 시간에 만든 로그인 폼, 게시판 폼, 회원가입 폼에서 값을 전달하고 출력해보자

- HTML 과 jQuery 시간에 이미 폼 만들기, 유효성 검사 처리 내용에 값 전달 기능을 추가해보자

- memberform.html & member.js & idcheck.jsp & member.jsp

- memberform.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입 폼</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
	function openDaumPostcode() {
		new daum.Postcode({
			oncomplete : function(data) {
				// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
				// 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
//				document.getElementById('join_zip1').value = data.postcode1;
				document.getElementById('post').value = data.zonecode;
				document.getElementById('address').value = data.address;				
			}
		}).open();
	}
</script>

<script src="member.js"></script>

<script>

	/* $(document).ready(function(){
	
		// ID중복 검사
		$("#idcheck").click(function(){
			if($("#id").val()==""){
				alert("ID를 입력하세요.");
				$("#id").focus();
				return false;
			}else{
				// window.open("팝업창에 실행될 문서명","윈도우이름","옵션")
				var ref="idcheck.jsp?id="+$("#id").val();
				window.open(ref,"idcheck","width=250, height=150")
			}
		});	
		
		// 주민번호 뒷자리로 포커스 이동
		$("#jumin1").keyup(function(){
			
			if($("#jumin1").val().length == 6)
				$("#jumin2").focus();
		});
		
		
		// 도메인 선택
		$("#email").change(function(){
			if($("#email").val() == ""){		// 직접 입력 선택
				$("#domain").attr("readOnly", false);		// 활성화
				$("#domain").val("").focus();
			}else{								// 도메인 선택
				$("#domain").val($("#email").val());
				$("#domain").attr("readOnly", "readOnly");	// 비활성화
			}			
		});			
		
		// 유효성 검사
		$("form").submit(function(){
			
			if($("#id").val() == ""){
				alert("ID를 입력하세요.");
				$("#id").focus();
				return false;
			}
			if($("#passwd").val() == ""){
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			if($("#name").val() == ""){
				alert("이름을 입력하세요.");
				$("#name").focus();
				return false;
			}
			if($("#jumin1").val() == ""){
				alert("주민번호 앞자리를 입력하세요.");
				$("#jumin1").focus();
				return false;
			}
			if($("#jumin1").val().length != 6){
				alert("주민번호 앞자리 6자리를 입력하세요.");
				$("#jumin1").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴하는 함수
			if(isNaN($("#jumin1").val())){
				alert("숫자만 입력하세요.");
				$("#jumin1").val("").focus();
				return false;
			}
			if($("#jumin2").val() == ""){
				alert("주민번호 뒷자리를 입력하세요.");
				$("#jumin2").focus();
				return false;
			}
			if($("#jumin2").val().length != 7){
				alert("주민번호 앞자리 7자리를 입력하세요.");
				$("#jumin2").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴하는 함수
			if(isNaN($("#jumin2").val())){
				alert("숫자만 입력하세요.");
				$("#jumin2").val("").focus();
				return false;
			}
			if($("#mailid").val() == ""){
				alert("EMail주소를 입력하세요.");
				$("#mailid").focus();
				return false;
			}
			if($("#domain").val() == ""){
				alert("도메인명을 입력하세요.");
				$("#domain").focus();
				return false;
			}
			if($("#tel1").val() == ""){
				alert("전화번호 앞자리를 입력하세요.");
				$("#tel1").focus();
				return false;
			}
			if(isNaN($("#tel1").val())){
				alert("숫자만 입력하세요.");
				$("#tel1").val("").focus();
				return false;
			}
			if($("#tel2").val() == ""){
				alert("전화번호 중간자리를 입력하세요.");
				$("#tel2").focus();
				return false;
			}
			if(isNaN($("#tel2").val())){
				alert("숫자만 입력하세요.");
				$("#tel2").val("").focus();
				return false;
			}
			if($("#tel3").val() == ""){
				alert("전화번호 끝자리를 입력하세요.");
				$("#tel3").focus();
				return false;
			}
			if(isNaN($("#tel3").val())){
				alert("숫자만 입력하세요.");
				$("#tel3").val("").focus();
				return false;
			}
			if($("#phone1").val() == ""){
				alert("핸드폰  앞자리를 선택하세요.");
				return false;
			}
			if($("#phone2").val() == ""){
				alert("핸드폰 중간자리를 입력하세요.");
				$("#phone2").focus();
				return false;
			}
			if(isNaN($("#phone2").val())){
				alert("숫자만 입력하세요.");
				$("#phone2").val("").focus();
				return false;
			}
			if($("#phone3").val() == ""){
				alert("핸드폰 끝자리를 입력하세요.");
				$("#phone3").focus();
				return false;
			}
			if(isNaN($("#phone3").val())){
				alert("숫자만 입력하세요.");
				$("#phone3").val("").focus();
				return false;
			}
			if($("#post").val() == ""){
				alert("우편번호를 입력하세요.");
				$("#post").focus();
				return false;
			}
			if($("#address").val() == ""){
				alert("주소를 입력하세요.");
				$("#address").focus();
				return false;
			}
			if($("#male").is(":checked") == false &&
			   $("#female").is(":checked") == false ){
				alert("남.여 중에서 1개를 선택 하세요.")
				return false;
			}
			
//			var cnt=0;
//			if($("#h1").is(":checked")) cnt++;
//			if($("#h2").is(":checked")) cnt++;
//			if($("#h3").is(":checked")) cnt++;
//			if($("#h4").is(":checked")) cnt++;
//			if($("#h5").is(":checked")) cnt++;
			
//			if(cnt < 2){
//				alert("취미를 2개 이상 선택 하세요.")
//				return false;
//			}
			
			if($("input:checkbox[name='hobby']:checked").length < 2){
				alert("취미를 2개 이상 선택 하세요.")
				return false;
			}
			
			if($("#intro").val() == ""){
				alert("자기소개를 입력하세요.");
				$("#intro").focus();
				return false;
			}
			
			if($("#intro").val().length > 100){
				alert("자기소개를  100자 이내로 입력하세요.");
				$("#intro").focus();
				return false;
			}
			
		});		
		
	}); */
	
</script>
</head>
<body>

<form method="post" action="member.jsp">
<table border=1 width=600 align=center>
	<caption>회원가입 폼</caption>
	<tr><th>ID</th>
		<td><input type=text autofocus="autofocus" id="id" name="id">
			<input type="button" value="ID중복검사" id="idcheck">
		</td>
	</tr>
	<tr><th>비밀번호</th>
		<td><input type=password id="passwd" name="passwd"></td>
	</tr>
	<tr><th>성명</th>
		<td><input type=text id="name" name="name"></td>
	</tr>
	<tr><th>주민번호</th>
		<td><input type=text size=6 maxlength="6" id="jumin1" name="jumin1">-
		    <input type=text size=7 maxlength="7" id="jumin2" name="jumin2">
		</td>
	</tr>
	<tr><th>EMail</th>
		<td><input type=text size=10 id="mailid" name="mailid">@
			<input type=text size=10 id="domain" name="domain">
			<select id="email">
				<option value="">직접입력</option>
				<option value="naver.com">네이버</option>
				<option value="daum.net">다음</option>
				<option value="nate.com">네이트</option>
				<option value="gmail.com">gmail</option>
			</select>
		</td>
	</tr>
	<tr><th>전화번호</th>
		<td><input type=text size=4 maxlength="4" id="tel1" name="tel1">-
			<input type=text size=4 maxlength="4" id="tel2" name="tel2">-
			<input type=text size=4 maxlength="4" id="tel3" name="tel3">
		</td>
	</tr>
	<tr><th>핸드폰</th>
		<td><select id="phone1" name="phone1">
				<option value="">번호선택</option>
				<option value="010">010</option>
				<option value="011">011</option>
				<option value="016">016</option>
				<option value="018">018</option>
				<option value="019">019</option>
			</select>-
			<input type=text size=4 maxlength="4" id="phone2" name="phone2">-
			<input type=text size=4 maxlength="4" id="phone3" name="phone3">
		</td>
	</tr>
	<tr><th>우편번호</th>
		<td><input type=text size=5 maxlength="5" id="post" name="post">
			<input type="button" value="우편검색" onClick="openDaumPostcode()">
		</td>
	</tr>
	<tr><th>주소</th>
		<td><input type=text size=70 id="address" name="address"></td>
	</tr>
	<tr><th>성별</th>
		<td><input type=radio id="male" name="gender" value="남자">남자
			<input type=radio id="female" name="gender" value="여자">여자
		</td>
	</tr>
	<tr><th>취미</th>
		<td><input type=checkbox id="h1" name="hobby" value="공부">공부
			<input type=checkbox id="h2" name="hobby" value="게임">게임
			<input type=checkbox id="h3" name="hobby" value="등산">등산
			<input type=checkbox id="h4" name="hobby" value="낚시">낚시
			<input type=checkbox id="h5" name="hobby" value="쇼핑">쇼핑
		</td>
	</tr>
	<tr><th>자기소개</th>
		<td><textarea rows="5" cols="50" id="intro" name="intro"
			  placeholder="자기소개를 100자 이내로 입력하세요."></textarea></td>
	</tr>
	<tr><td colspan=2 align=center>
			<input type=submit value="회원가입">
			<input type=reset value="취소">
		</td>
	</tr>
</table>
</form>



</body>
</html>

- member.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
	request.setCharacterEncoding("UTF-8");
	
	String id = request.getParameter("id");
	String passwd = request.getParameter("passwd");
	String name = request.getParameter("name");
	String jumin1 = request.getParameter("jumin1");
	String jumin2 = request.getParameter("jumin2");
	String mailid = request.getParameter("mailid");
	String domain = request.getParameter("domain");
	String tel1 = request.getParameter("tel1");
	String tel2 = request.getParameter("tel2");
	String tel3 = request.getParameter("tel3");
	String phone1 = request.getParameter("phone1");
	String phone2 = request.getParameter("phone2");
	String phone3 = request.getParameter("phone3");
	String post = request.getParameter("post");
	String address = request.getParameter("address");
	String gender = request.getParameter("gender");
	
	String[] hobby = request.getParameterValues("hobby");
	String h = "";
	for(String hy : hobby)
		h += hy + "-";
		
	String intro = request.getParameter("intro");	
	String introduce = 
			request.getParameter("intro").replace("\n","<br>");

%>

ID : <%=id %> <br>
비밀번호 : <%=passwd %> <br>
성명 : <%=name %> <br>
주민번호 : <%=jumin1 %>-<%=jumin2 %> <br>
E-Mail : <%=mailid %>@<%=domain %> <br>
전화번호 : <%=tel1 %>-<%=tel2 %>-<%=tel3 %> <br>
핸드폰 : <%=phone1 %>-<%=phone2 %>-<%=phone3 %> <br>
우편번호 : <%=post %> <br>
주소 : <%=address %> <br>
성별 : <%=gender %> <br>
취미 : <%=h %> <br>
자기소개1 : <pre><%=intro %></pre> <br>
자기소개2 : <br>
<%=introduce %> <br>

- String 배열에 hobby 에 저장된 값을 이어서 출력하자, ex) 공부-게임-등산-

- 이어서 출력하기 위해 반복문을 통해 하나의 변수 h 에 누적하고 있다

- Enter 키를 누른 경우 줄을 띄워서 출력하기 위해 replace() 함수로 "\n" 을 "<br>" 로 치환

+ action 태그로 몇줄만에 해결가능, 현재는 action 태그를 사용하지 않고 개별적으로 값을 받고 저장하고 있다

+ 나중엔 Java의 DTO 클래스를 사용하고 action 태그와 결합해서 3줄만에 이 작업을 함

 

+ 취미는 - 를 포함한 형태로 DB에 저장시킨다 ex) 공부-게임-쇼핑-

- 이후 회원 정보 수정등 취미를 조작해야하는 경우에 구분기호를 기준으로 split 해서 사용

 

- 나머지 member.js, idcheck.jsp는 코드 안붙임


response 객체

- 서버에서 클라이언트에 응답할때 사용하는 객체

 

response 객체 사용

1. 응답을 하면서 페이지를 이동하는 경우 많이 사용

2. cookie 발행시 reponse 객체로 응답하며 발행함

- 쿠키 발행시 클라이언트 임시폴더에 파일형태로 쿠키파일이 생성됨

- 나머지 JS 파일은 클라이언트에 쿠키가 저장된 것을 보고 우리 사이트에 접속한 적 있는지 등을 확인 가능

 

언어별 페이지 이동시키는 방법

- HTML : link 걸어서 이동 or meta 태그로 이동시키기, 시간적인 제어 가능 (몇 초 후 실행)

- Javascript : 내장객체 location 의 href 사용해서 이동, 메세지박스를 띄우고 확인버튼 눌렀을때 이동시킬수 있다

- JSP : response 객체로 페이지 이동, 별다른 특징없이 조용히 이동됨

+ 모든 언어에서 페이지 이동시 값을 가지고 갈 수 있다, 이때 폼이 아니므로 get 방식으로만 값 전달 가능하다

 

 

response 객체 메소드

String getCharacterEncoding() 인코딩 타입을 구해오는 역할
void addCookie(Cookie cookie) 쿠키를 발행하는 메소드
발행된 쿠키는 클라이언트의 임시폴더에 파일형태로 저장됨
void sendRidirect(String location) 페이지 이동시 사용하는 메소드
매개변수에는 이동할 페이지명이 들어감, 지정한 URL 로 이동

 

response 객체 정리

- 응답 하면서 쿠키를 발행함

- 응답하면서 페이지도 이동시켜줌

 

response 객체 예제

실습 준비

- 웹상에서 한글 이름을 사용하면 문제 발생, 'response객체' 에서 한글인 '객체' 를 지우기

- 먼저 HTML meta 태그, Javascript location 객체 예제부터 보며 response 객체와 비교할 것

 

JSP 내장 객체 예제 8

response 객체 예제 1

페이지 이동 1

- WebContent/response/response

- HTML meta 태그로 페이지 이동하며 값을 가져가는 예제

- meta.html & first.jsp

- meta.html

<html>
	<head>

	<!-- mata 태그로 페이지 이동 -->
	<meta http-equiv="refresh" content="0;
		url=first.jsp?name=test">

	</head>
	<body>
	</body>
</html>

- HTML meta 태그로 페이지 이동하며 값을 가져가고 있다

- 시간적인 제어 가능하다는 특징

- 쌍따옴표 주의

- 시간적인 제어가 가능하다, content=0 은 바로 이동을 의미

- content=3 으로 설정했다면 3초 뒤 페이지가 이동된다.

- 이동되는 페이지이며, 값이 넘어가는 파일은 first.jsp 이다

- get 방식으로 값이 넘어가므로 "?변수명=값" 으로 값이 넘어간다

- HTML 로 값을 전달할수 있다! 다만 HTML 은 값을 받을 수 없고 전송만 가능하다, JSP 파일에서 값을 받을 수 있다

 

- first.jsp

<%@ page contentType = "text/html; charset=utf-8" %>

<%

String str = request.getParameter("name");

%>

name : <%=str%>

- get 방식으로 요청이 들어가면 first.jsp 파일에서 name값으로 전달된 값을 받고 있다

- 바로 이동됨

 

+ 2개 이상의 값을 전달할떈 & 로 연결한다

ex)

	<!-- mata 태그로 페이지 이동 -->
	<meta http-equiv="refresh" content="0;
		url=first.jsp?name=test&passwd=1234">

 

+ HTML 에서 페이지를 이동하는 다른 방법이 있다

- 링크를 걸어서 이동하기

- 값이 넘어가는 것이 URL 주소에 노출된다

ex) 네이버에서 링크 클릭해서 페이지 이동시

 

JSP 내장 객체 예제 9

response 객체 예제 2

페이지 이동 2

- WebContent/response/response

- Javascript 에서 location 객체로 페이지 이동하며 값을 가져가는 예제

- location.html & first.jsp

- location.html

<html>
	<head>
	<meta charset="utf-8">
	</head>
	<body>

	<!-- 자바스크립트로 페이지 이동 -->
	<script language="javascript">
		alert("페이지 이동");
		location.href='first.jsp?name=test';
	</script>

	</body>
</html>

- 사용자가 alert 메세지 박스의 확인 버튼을 눌렀을때 location.href 를 사용해서 first.jsp 로 넘어가며 값을 전달

- first.jsp 에서는 name 이라는 변수를 통해 값을 getParameter() 로 받고 있다

- location 객체로 이동하는 방법이 페이지 이동 3가지 방법 중 가장 많이 사용하는 방법

 

JSP 내장 객체 예제 10

response 객체 예제 3

페이지 이동 3

- WebContent/response/response

- JSP 에서 response 객체가 응답을 하면서 페이지 이동

- responseEx.jsp & first.jsp

- responseEx.jsp

<%@ page contentType="text/html;charset=utf-8"%>

<h1>Response 예제</h1>
   현재 페이지는  responseEx.jsp 페이지입니다.


<%	// JSP에서 페이지 이동

     response.sendRedirect("first.jsp?name=test");
%>

- sendRedirect() 함수를 통해 first.jsp 로 페이지 이동을 하고 가져가는 값은 name=test

- 마찬가지로 first.jsp 에서는 변수 name 을 통해 값을 받음


out 객체

- 브라우저로 출력할 때, 출력 스트림을 만들어주는 객체

- Model 1에선 JSP 내장객체이므로 바로 사용가능

- Model 2 에선 내장객체가 없으므로 만들어 사용해야함

- 주로 out.println 이나 out.print 로 출력

- 스크립틀릿 태그 안에서 out 객체를 써서 브라우저에 출력

 

out 객체의 메소드

print() 출력 스트림을 브라우저에 출력
println() 출력 스트림을 브라우저에 출력

request 객체의 println() 메소드

- 줄을 바꿔주지 못함, 줄을 안바꿈

- print() 메소드와 거의 같다

+ 줄을 바꾸기 위해선 br 태그나 p 태그를 써야함

 

out 객체 예제

실습 준비

 

JSP 내장 객체 예제 11

out 객체 예제 1

- outEx.jsp

<%@ page contentType="text/html;charset=euc-kr" buffer="5kb"%>

<%
	int totalBuffer = out.getBufferSize();
	int remainBuffer = out.getRemaining();
	int useBuffer = totalBuffer - remainBuffer;
%>

<h1>Out 예제</h1>
<b>현재 페이지의 Buffer 상태</b><p>

출력 Buffer의 전체 크기 : <%=totalBuffer%>byte<p>
현재 Buffer의 사용량 : <%=useBuffer%>byte<p>
남은 Buffer의 크기 : <%=remainBuffer%>byte<p>

- 출력시엔 원래 버퍼라는 임시기억장소에 저장했다가 출력함

 

버퍼 크기 설정 (outEx.jsp 부분)

<%@ page contentType="text/html;charset=euc-kr" buffer="5kb"%>

- 버퍼크기의 기본값은 8kb 이다, 생략시 8kb 로 설정됨

- page 지시어 태그에서 buffer 속성으로 버퍼 크기를 5kb 로 설정

 

- 이때 out 객체를 사용해서 버퍼의 전체 크기, 남은 용량 을 구할 수 있다

 

getBufferSize() 메소드 / 버퍼의 전체 크기 구하기 (outEx.jsp 부분)

<%	int totalBuffer = out.getBufferSize();  %>

 

getRemaining() 메소드 / 버퍼의 남아있는 용량 구하기 (outEx.jsp 부분)

<%	int remainBuffer = out.getRemaining();  %>

 

+ 현재 버퍼의 사용량은 전체 크기 - 남은 용량 으로 구하고 있다

 

- 1kb = 1000byte

 

만약 buffer 크기를 설정하지 않았다면?

- 기본값 8kb

 

JSP 내장 객체 예제 12

out 객체 예제 2

- useOut.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<html>
<head><title>out 기본 객체 사용</title></head>
<body>

<%
    out.println("안녕하세요?");
    out.println("안녕하세요?");
%>
<br>

out 기본 객체를 사용하여 
<%
    out.println("출력한 결과입니다.");
%>

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

- 자바의 println() 과 다르게 println() 을 사용해도 줄이 바뀌지 않음

 

출력시 줄 바꾸기

- 줄을 바꾸려면 <br> 태그나 <p> 태그를 사용해야함

- 스크립틀릿 태그안에서 <br> 태그를 사용하지 못하므로 out.print() 나 out.println() 메소드 안에 <br> 태그를 써야함!

<%
    out.println("안녕하세요?<br>");
    out.println("안녕하세요?" + "<br>");
    out.println("안녕하세요?");    
%>

- 이렇게 부분 수정


JSP의 영역

JSP의 영역

- 1개의 웹 어플리케이션 개발시 4가지 영역이 만들어짐

- 영역에 관련된 내장객체가 있기떄문에 JSP 영역을 학습

 

1. PAGE 영역

- 가장 좁은 영역

- 1개의 개별적인 페이지가 '페이지 영역'이 됨

 

2. REQUEST 영역

- 공유를 설정하고 그 다음페이지까지가 REQUEST 영역

 

3. SESSION 영역

- session 내장객체는 보통 회원가입 하고 로그인을 성공했을 때 서버와 클라이언트가 session 으로 연결되는데 여기서부터가 SESSION 영역의 시작

- 이후 로그아웃 시 서버와 클라이언트의 연결이 끊어짐, 즉 session 이 끊어짐

- 즉 로그인에 성공한 후부터 로그아웃 할때까지가 SESSION 영역

- 페이지 영역보다는 넓고 애플리케이션 영역보다는 좁다

 

- 브라우저를 통해서 공유를 하게 되는데 로그인 성공 후 부턴 계속 다른 페이지를 이동함, 이동할때마다 자신의 id, 비밀번호 값을 가져가지 않더라도 계속 로그인 상태가 유지됨 이때 공유를 하는 객체가 SESSION 객체

- login ~ logout 까지가 공유되는 영역의 범위

- 페이지가 바뀌더라도 공유한 값들을 쓸 수 있다

 

4. APPLICATION 영역

- 가장 넓은 영역

- 웹 전체가 APPLICATION 영역

application 객체 (정리)

- 영역과 관련된 공유 내장 객체 4개 중 하나

- 가장 넓은 영역의 공유 범위를 가지고 있다

- 애플리케이션 전체가 하나의  APPLICATION 영역

- 같은 종류의 브라우저끼리 공유가 되는 객체

- 폴더가 달라져도 공유가 된다

 

 

- 이 4가지에 대해 공유를 설정할 수 있는 내장 객체들이 있다

 

공유 설정 내장 객체

- pageContext 객체 : PAGE 영역에서 공유 설정

- request 객체 : REQUEST 영역에서 공유 설정, 요청을 처리도 하지만 공유 설정도 가능

- sesssion 객체 : SESSION 영역에 대해 공유 설정

- application 객체 : APPLICATION 영역에 대해 공유 설정

- 객체마다 공유 설정되는 범위가 다르다

 

공유 설정 메소드

- 4개의 객체에 대해 공통적으로 setAttribute() 메소드로 공유 설정함

 

- pageContext.setAttribute() 시 그 페이지 내에서만 공유한 값을 쓰게됨, 페이지가 넘어가면 공유된 값 사용 불가

- 같은 페이지 내에서만 사용가능하고 영역이 너무 좁기에 자주 사용되지 않음

 

- request.setAttribute() 에서 request 로 공유를 설정하고있다, 그 다음 페이지까지가 request 의 영역임, Model 2 에서 많이 사용

 

- session.setAttribute() 에서 session 은 로그인 성공시부터 로그아웃까지의 session 영역이므로 페이지를 넘어가도 공유하는 값은 유지됨, 그래서 로그인 관련은 session 공유 객체 사용

 

- application.setAttribute() 시 너무 영역이 넓어서 자주 사용 않음

- 첫번째 매개변수가 name 값, 즉 키값이고 두번째 매개변수가 value 값이다

- 공유된 값을 구해올때는 getAttribute() 메소드로 구해옴, name 값 즉 키값을 알아야 구해올 수 있다

 

공유 설정과 공유 값 구하기

- 공유 설정하는 메소드는 공통적으로 setAttribute(키,밸류) 이다

- 이렇게 공유되는 값을 setAttribte(키) 를 통해 영역 내에서 불러온다

 


Cookie

Javascript Cookie vs JSP Cookie 용도 차이

Javascript 의 Cookie

- 오늘하루 팝업창 열지 않기 클릭시 쿠키 발행

- 클라이언트의 임시 폴더에 쿠키가 파일형태로 저장되고 하루간 팝업창이 열리지 않음


JSP의 Cookie

- 로그인 상태 유지 체크를 하고 로그인 성공시 쿠키 발행, 그 정보가 컴퓨터에 쿠키 파일로 저장됨, 이때 유효시간을 길게 설정함, 계속 그 쿠키가 존재하므로 다시 접속하더라도 그 쿠키파일을 참조하면서 로그인 상태 유지

 

JSP Cookie

- 일반적으로 사이트에 로그인 시에 쿠키를 발행한다 (로그인 상태 유지 체크하고)

- 서버와 클라이언트 사이의 연결 상태(로그인) 를 유지하기 위해 쿠키 발행

- 쿠키 정보를 불러와서 계속 로그인 상태를 유지하는 것

- 페이지가 이동되어도 쿠키정보를 계속해서 참조하면 되므로 페이지 이동을 하면서 회원 정보를 가지고 가지 않아도 된다

- 유효한 시간이 경과되면 쿠키 정보가 지워짐

 

+ 개인에 대한 정보를 서버측에서 쿠키정보로 구해올 수도 있다

+ 사이트에 따라서는 사이트에 접속만 하더라도 쿠키를 발행하는 경우들이 있다

 

- 보안상 위변조 가능성이 있으므로 위험, 지금은 쿠키를 대신해서 session 을 사용

- session 은 클라이언트의 임시폴더에 저장되지 않고, 브라우저 창을 닫으면 연결이 끊어짐

+ 공공장소에서 로그인 상태 유지 를 체크하고 연결시 쿠키정보가 저장되어 위험함

 

 

- 페이지가 이동되어도 쿠키정보를 계속해서 참조하면 되므로 페이지 이동을 하면서 회원 정보를 가지고 가지 않아도 된다

 

 

Cookie 생성/설정 방법

 

1. Cookie 객체를 먼저 생성

//Cookie cook = new Cookie ( String name, String value )
Cookie cook = new Cookie ( "id", "test" )

- 첫번째 매개변수는 Cookie 의 name 값으로서 변수이고, 두번째 매개변수는 Cookie 의 value 값으로서 변수의 값

- id 변수에 test 란 값을 저장하라는 의미

 

2. response 객체로 쿠키를 발행

response.addCookie( cook );

- response 객체의 addCookie() 메소드로 생성된 쿠키 객체를 통해 클라이언트에게 쿠키 발행

- 발행시 클라이언트의 임시폴더에 쿠키 정보를 파일형태로 저장

 

3. 쿠키 값 변경 (선택사항)

cook.setValue( newValue )

- 생성자 두번째 매개변수에 들어갔던 쿠키 value 를 변경할 수 있다

- setValue() 메소드로 쿠키 값을 수정 가능

 

4. 쿠키 수명(지속시간) 설정

//cook.setMaxAge ( int expiry ); // 단위 : 초
cook.setMaxAge ( 60*60) // 1시간

- 쿠키가 언제까지 유효할지 시간 설정 가능

- setMaxAge() 메소드로 설정하고 매개변수에 들어가는 숫자는 초단위 이다

- 주어진 시간동안 쿠키정보를 가지고 있고 시간이 지나면 발행된 쿠키정보가 지워짐

- 직접 지우는 것도 어렵지만 가능하다

- 시간 설정을 하지 않았을떄는 클라이언트가 브라우저 창을 닫는 순간 자동으로 쿠키 정보가 지워진다

+ 일반적으로는 긴 시간으로 잡고 고객에 대한 정보를 계속 참고해서 로그인 상태 유지

 

5. 쿠키 읽기

Cookie[] cook = request.getCookie();

//쿠키 이름 : cook.getName()
//쿠키 값 : cook.getValue()

- 페이지를 계속 이동시키더라도 발행된 쿠키정보를 읽어와서(참조해서) 로그인 유지

- request 객체의 getCookie() 메소드로 읽어온다

- 여러 쿠키가 있으므로 Cookie 형 1차원 배열로 리턴한다

- 0 번방에 첫번째 쿠키가 있고 1번방에 두번째 쿠키가 있다

- 이때 getName() 메소드로 쿠키 네임을 구해올 수 있고 getValue() 메소드로 쿠키 밸류를 구할 수 있다

 

JSP Cookie 예제

실습 준비

 

JSP Cookie 예제 1

- jspproject/WebContent/Cookie/cookie

- makeCookie.jsp & useCookie.js

- makeCookie.jsp

<%@ page contentType="text/html; charset=euc-kr" %>

<html>
	<head>
		<title>쿠키를 생성하는 예제</title>
	</head>

<%
   String cookieName = "id";
   Cookie cookie = new Cookie(cookieName, "totoro");
   cookie.setMaxAge(10); 		// 단위 : 초
   cookie.setValue("guardian");
   response.addCookie(cookie);	// 쿠키 발행
%>

	<body>
	<h2>쿠키를 생성하는 예제</h2>
	<P>

"<%=cookieName%>" 쿠키가생성 되었습니다.<br>

		<input type="button" value="쿠키의 내용확인" onclick="javascript:window.location='useCookie.jsp'">
	</P>
	</body>
</html>

 

- 가장 먼저 쿠키객체를 생성하고 있다

- id 로 쿠키네임을, totoro 라는 값으로 쿠키값을 설정

- 10초 동안 쿠키를 유지시키도록 하고 있다

- 쿠키 값을 guardian 으로 바꾸고 있다

- response 객체의 addCookie() 로 쿠키 발행하고 있다, 이 코드가 쿠키를 발행하는 쿠키이다

 

- Cookie 클래스는 java.lang 패키지라 import 불필요

 

- 클릭이벤트로 useCookie.js 파일을 연다

- useCookie.js

<%@ page contentType="text/html; charset=euc-kr" %>

<html>
	<head>
		<title>웹 브라우저에 저장된 쿠키를 가져오는 예제</title>
	</head>
	<body>
	<h2>웹 브라우저에 저장된 쿠키를 가져오는 예제</h2>

<%
	Cookie[] cook = request.getCookies();

	if( cook != null ){
		for(int i=0; i<cook.length;++i){
			if(cook[i].getName().equals("id")){
%>

		쿠키의 이름은 "<%=cook[i].getName()%>" 이고 
		쿠키의 값 "<%=cook[i].getValue()%>" 입니다.

<%
			}
		}
	}
%>

	</body>
</html>

- 발행된 쿠키를 getCookies() 로 구해오고 배열에 저장

- 발행된 쿠키의 name 값이 id 가 같다면 getName() 과 getValue()로 쿠키 네임과 밸류를 구해서 출력

 

- makeCookie.jsp 실행

- 10초간 쿠키가 유지되므로 10초 경과 후 쿠키정보 삭제되면 쿠키 참조 불가하므로 새로고침시 정보 사라짐

- 변경된 쿠키값인 guardian 이 나타난다

 

쿠키 정보 확인 방법

- 임시폴더까지 쉽게 들어가기 위해 I.E 사용해야한다

- 브라우저를 I.E 로 변경 후 makeCookie.jsp 실행

- 원래는 히든을 풀어서 이 경로까지 들어가야한다, I.E 에선 쉽게 들어갈 수 있음

- 해당 쿠키 파일 지우면 그런 로그인 유지 기능, 일주일간 열지 않기 기능 등이 해제됨

- 폴더의 파일 전부 지우기

 

+ 쿠키 시간을 300 초로 설정해서 쿠키 형성을 확인해보자

- 300 초간 유지됨

- 300초의 시간이 지나면 파일은 남아있지만 안의 쿠키 정보는 지워버림

- 쿠키 정보가 지워지면 더이상 쿠키정보를 참조할 수 없게 됨

 

+ 쿠키 시간 설정을 하지 않는다면?

- 사용자가 브라우저 창을 닫는 순간 쿠키 정보가 지워짐

 

Cookie 활용 정리

- 쿠키에 저장된 값은 페이지가 넘어갈때 가져갈 필요가 없음

- useCookie.jsp 에서 클라이언트의 쿠키 정보를 구해옴

 

쿠키와 보안

- 클라이언트 임시폴더에 쿠키가 저장되므로 위변조 위험이 있다

- 그래서 지금은 쿠키를 대신해서 세션을 사용한다

 

JSP Cookie 예제 2

- jspproject/WebContent/Cookie/cookie1

- makeCookie.jsp & viewCookies.jsp & modifyCookie.jsp & deleteCookie.jsp

- makeCookie.jsp

쿠키 만들기

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.net.URLEncoder" %>

<%  // 쿠키값을 URLEncoder 클래스를 이용해서 인코딩 한다.
    Cookie cookie = new Cookie("name", URLEncoder.encode("최범균"));
    response.addCookie(cookie);
%>

<html>
	<head><title>쿠키생성</title></head>
	<body>

<%= cookie.getName() %> 쿠키의 값 = "<%= cookie.getValue() %>"

	</body>
</html>

- 쿠키 객체 생성, 쿠키 네임값은 name , 쿠키 밸류값은 최범균

- 한글값이 깨지지 않도록 URLEncoder 클래스를 import 하고 encode() 함수로 인코딩 시켜줌

+ 쿠키 밸류값은 한글을 쓰는 것이 좋지 않다

- response 객체로 쿠키를 발행한다

 

- 쿠키 네임값을 getName() 으로, 쿠키 밸류값을 getValue() 로 가져옴

- 쿠키 밸류값이 한글이므로 깨져서 나온다

- 나중에 디코드를 시켜야한다

 

쿠키 보기

- 쿠키를 보는 파일 viewCookies.jsp 을 만들어서 쿠키 정보를 확인하자

- 주의 :

- 쿠키를 보려면 이 브라우저를 닫으면 안된다, 시간설정을 하지 않아서 닫으면 쿠키 정보 지워짐

- viewCookies.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.net.URLDecoder" %>

<html>
	<head><title>쿠키목록</title></head>
	<body>
	쿠키 목록<br>

<%
    Cookie[] cookies = request.getCookies();

    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {
%>

			<!-- 쿠키값을 URLEncoder 클래스를 이용해서 디코딩 한다. -->
			<%= cookies[i].getName() %> = 
			<%= URLDecoder.decode(cookies[i].getValue()) %><br>

<%
        }//for end

    } else {
%>

		쿠키가 존재하지 않습니다.
<%
    }
%>

	</body>
</html>

+ 쿠키 밸류가 한글값이므로 URIDecoder 클래스의 decode() 로 디코드 시키고 있다

 

+ 만약 아까의 그 브라우저를 닫는다면?

- 쿠키가 존재하지 않는다고 뜬다

 

쿠키값 변경하기 2가지 방법

1. 처음 쿠키를 발행하는 것처럼 똑같이 발행

2. setValue() 메소드 사용

 

쿠키값 변경하기

- modifyCookie.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.net.URLEncoder" %>

<%
    Cookie[] cookies = request.getCookies();

    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {

            if (cookies[i].getName().equals("name")) {
                Cookie cookie = new Cookie("name", URLEncoder.encode("JSP프로그래밍"));
                response.addCookie(cookie);
                //cookies[i].setValue(URLEncoder.encode("자바와 JSP"));
                //response.addCookie(cookies[i]);
            }// if end

        }//for end
    }
%>

<html>
	<head><title>값 변경</title></head>
	<body>
		name 쿠키의 값을 변경합니다.
	</body>
</html>

- cookies != null && cookies.length > 0 은 구해온 쿠키가 있다면 이라는 의미

 

1. 처음 쿠키를 발행하는 것처럼 똑같이 발행

- 반복문 안에서 처음 쿠키를 발행하는 것처럼 쿠키 객체를 만듬, 변수명이 똑같기때문에 값이 변하면 쿠키정보를 덮음

2. setValue() 메소드 사용

- setValue() 안에 바꾸고 싶은 값을 넣고 addCookie() 를 사용해서 발행

초기값
변경값

 

또는 두번째 방법을 썼을땐

 

쿠키 삭제

- 쿠키를 바로 삭제하는 함수는 없다

- 다른방법으로 쿠키를 삭제시킴

- deleteCookie.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.net.URLEncoder" %>

<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {

            if (cookies[i].getName().equals("name")) {
                Cookie cookie = new Cookie("name", "");	// 쿠키 삭제
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }//if end

        }//for end
    }
%>

<html>
	<head><title>쿠키 삭제</title></head>
	<body>
		name 쿠키를 삭제합니다.
	</body>
</html>

- cookies != null && cookies.length > 0 은 구해온 쿠키가 있다면 이라는 의미, 그런 경우만 안의 내용 실행

- 쿠키 네임값이 'name' 이라면 쿠키를 삭제

 

쿠키를 삭제하는 방법

                Cookie cookie = new Cookie("name", "");	// 쿠키 삭제
                cookie.setMaxAge(0);
                response.addCookie(cookie);

1. 쿠키 네임값을 동일하게 해서 쿠키 밸류값을 null ("") 로 설정

2. 쿠키 시간을 0 초로 설정해서 실행되자마자 바로 삭제되게 함

3. response 객체의 addCookie() 로 쿠키 발행

 

- deleteCookie.jsp 실행해서 쿠키네임값이 name 인 쿠키 삭제

- 이후 viewCookies.jsp 실행해서 쿠키 정보 확인

- 쿠키네임값이 name 이었던 쿠키가 없어졌다

 

JSP Cookie 예제 3

- jspproject/WebContent/Cookie/cookie4

- make1hourCookie.jsp & viewCookies.jsp

- make1hourCookie.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<%
    Cookie cookie = new Cookie("oneh", "1time");
    cookie.setMaxAge(60 * 60); // 60초(1분) * 60 = 1시간
    response.addCookie(cookie);
%>

<html>
	<head><title>쿠키유효시간설정</title></head>
	<body>

	유효시간이 1시간인 oneh 쿠키 생성.

	</body>
</html>

- 1시간짜리 쿠키

- viewCookies.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.net.URLDecoder" %>

<html>
	<head><title>쿠키목록</title></head>
	<body>
	쿠키 목록<br><br>

<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {
%>

			<%= cookies[i].getName() %> = 
			<%= URLDecoder.decode(cookies[i].getValue()) %><br>

<%
        }//for end
    } else {
%>
		쿠키가 존재하지 않습니다.
<%
    }
%>

	</body>
</html>


session 객체

- 영역과 관련, 공유의 개념과 관련

- 회원관리할때 주로 사용

- 서버와 클라이언트가 연결 상태(로그인) 을 유지하기 위해서 사용되는 개념

- 로그인에 성공시 서버 측에서 session 으로 클라이언트와 연결됨

- 이때, session 을 연결한 클라이언트의 웹 브라우저를 통해서 회원정보를 공유

- 쿠키의 역할을 대체, 클라이언트 임시폴더에 파일이 저장되지 않으므로 위변조 가능성이 없어서 쿠키보다 안전

- session 을 사용하면 공유가 되기때문에 페이지 이동을 하면서 회원정보를 가지고 가지 않아도 된다.

- 로그인했을때 session 이 연결되고 로그 아웃했을때 session 이 끊긴다

 

session 생성/설정 방법

- 공유되는 영역만 다를 뿐 다른 객체와 같은 메소드 사용

 

1. 세션 설정

//session.setAttribute ( java.lang.String name, java.lang.Object value )
session.setAttribute( "id", "guardian23" );

- name 값으로 지정한 이름에 value 값을 할당

- id 란 변수에 guardian23 을 저장하라는 의미

- 로그인에 성공시 주로 세션 설정함

- 같은 브라우저끼리만 공유되고 브라우저가 달라지면 공유가 안됨

2. 세션 사용

//session.getAttribute ( java.lang.String name )
String id = (String) session.getAttribute( "id" );

- 보통 페이지가 바뀌면 값을 가져감

- 하지만 쿠키를 참고하거나 세션을 구해오면 값을 가져갈 필요가 없이 세션의 네임값으로 필요할때마다 세션 밸류값을 가져올 수 있다

- getAttribute() 메소드는 리턴 자료형이 Object 이므로 String 으로 다운캐스팅해서 String 변수에 저장하고 있다

- 저장된 Value 값이 "gardian23" 으로 String 형이었으므로 String 형으로 다운캐스팅 하는 것이다

- 세션 밸류값이 어떤 자료형인지에 따라 다운캐스팅 하는 자료형을 결정

 

3. 세션의 유지시간 설정

session.setMaxInactiveInterval();

- 설정된 시간까지만 세션이 유지된다

- 주어진 시간이 지나면 연결이 끊어진다

ex) 은행 페이지에서 아무 작업하지 않은채 몇분이 지나면 자동으로 로그아웃 되는 기능, 계속 하려면 연장 버튼을 누름

- 시간설정을 하지 않으면 브라우저 창이 닫히면 연결이 끊어짐

 

4. 세션 삭제

- 쿠키는 삭제 메소드가 없었지만 세션은 삭제 메소드가 2개가 있다

//session.removeAttribute ( java.lang.String name );
session.removeAttribute( "id" )

- 세션이 여러개 있는경우 개별적으로 삭제해야할때 removeAttribute() 메소드 사용

- 이 매개변수의 네임값을 가진 세션을 삭제 시켜라는 의미

 

5. 세션 한꺼번에 모든 세션 삭제

session.invalidate();

- invalide() 메소드로 세션 삭제시 모든 세션이 삭제됨

- 로그아웃시, 회원탈퇴시 주로 세션을 삭제한다

 

Cookie vs Session 기능

- Cookie : 로그인 상태 유지 체크하면 브라우저 닫았다가 켰을때도 로그인 유지하는 기능만 쿠키임

- Session : 로그인을 성공했을때 로그인을 유지시켜주는 기능, 쿠키 제외 모든 기능

 

+ session 객체를 알면 나머지 영역 관련 객체들도 비슷하므로 쉽게 이해 가능

 

session 객체 예제

실습 준비

- 폴더명에서 한글인 '객체' 지우기

 

session 객체 예제 1

- WebContent/session/session

- setSession.jsp & viewSession.jsp

- setSession.jsp

<%@ page contentType="text/html; charset=euc-kr" %>

<html>
	<head><title>세션 사용 예제</title>
	</head>
	<body>

<%
	String id = "guardian23";
	String passwd = "1234";

	session.setAttribute("id", id);	// id="guardian23";
	session.setAttribute("passwd", passwd);	// passwd = "1234";
%>

	세션에 id 와 passwd 속성을 설정하였습니다.<br><br>

	<input type="button" value="세션의 설정된 속성확인" onclick="javascript:window.location='viewSession.jsp'">
	</body>
</html>

- 2개의 session 을 설정하고 있다

- session 객체는 내장객체 이므로 정의하지 않고 session 을 바로 사용하고 있다

- id 변수에 "guardian23" 을 passwd 변수에 "1234" 를 저장하고 있다

- 현재는 세션 시간 설정이 안되어있으므로 브라우저를 닫으면 세션 연결이 끊기므로 창을 닫지 않기

- 그 상태에서 버튼 클릭시 클릭이벤트로 viewSession.jsp 로 페이지 이동

- 이 값이 계속 공유되는 것임

- 같은 종류의 브라우저끼리만 공유되는 것임

 

주소값을 복사해서 다른 종류의 브라우저에 URL 를 복붙해보자

- 다른 브라우저에서는 세션이 공유되지 않음

 

- 일반적으로 session name 값을 아는경우 getAttribute() 로 쉽게 구해옴

- 하지만 세션 name 값을 모를때는 아래 방법으로 구하기

 

세션 name 값을 알지 못할때 세션을 보는 방법은?

- 세션 name 값을 먼저 구하고 value 를 구하고 있다

- viewSession.jsp

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.util.*" %>

<html>
	<head><title>세션 사용 예제</title></head>
	<body>

<%	// session 의 name값을 모르는 경우에 처리하는 방법
	// 열거형 : "id", "passwd"
	Enumeration attr = session.getAttributeNames();

	while(	attr.hasMoreElements()	){
		String attrName = (String)attr.nextElement();
		String attrValue = (String)session.getAttribute(attrName);
		out.println("세션의 속성명은 " + attrName + " 이고 ");
		out.println("세션의 속성값은 " + attrValue + "이다.<br><br>");
	}
%>

	</body>
</html>

- getAttributeNames() 메소드로 세션을 설정했던 세션 name 값들을 구하고 있다

- 그 값들을 열거형 attr 에 저장하고 hasMoreElemnets() 와 반복문을 통해 구해온 name 값이 없을때까지 루프를 반복하고 있다

- getElement() 메소드로 name 값을 구해오고 attrName 변수에 저장하고, 그 name 값으로 value 를 구해와서 attrValue 변수에 저장한다

- 그리고 그 값들을 출력하면 모든 세션의 네임과 밸류가 출력됨

 

세션 name 값을 알때 처리하는 방법은?

- 위의 코드를 주석으로 막고 세션 name 값을 알고있을때 세션 밸류를 구해보자

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.util.*" %>

<html>
	<head><title>세션 사용 예제</title></head>
	<body>

<%--	// session 의 name값을 모르는 경우에 처리하는 방법
	// 열거형 : "id", "passwd"
	Enumeration attr = session.getAttributeNames();

	while(	attr.hasMoreElements()	){
		String attrName = (String)attr.nextElement();
		String attrValue = (String)session.getAttribute(attrName);
		out.println("세션의 속성명은 " + attrName + " 이고 ");
		out.println("세션의 속성값은 " + attrValue + "이다.<br><br>");
	}
--%>
<%
	String id = (String)session.getAttribute("id");
	String passwd = (String)session.getAttribute("passwd");
%>

ID : <%=id %> <br>
비밀번호 : <%=passwd %> <br>

	</body>
</html>

- 세션 name 값으로 쉽게 값을 구해오고 있다

- getAttribute() 는 Object 형으로 리턴하므로 명시적으로 강제형변환을 해야한다

- 이 세션의 밸류값이 String 형이므로 String 형으로 다운캐스팅 하고 있다

- 이렇게 수정 후 setSession.jsp 파일을 실행

- 창이 닫히지 않는 한 이 값이 공유 됨 ( 시간 설정을 안해뒀으므로 ) 

- 같은 종류의 브라우저끼리만 공유됨

 

같은 종류 브라우저인 크롬 브라우저에 URL 복붙

- 공유가 된다

 

다른 종류 브라우저인 마이크로 엣지 브라우저에 URL 복붙

- 공유되지 않음

 

+ 세션을 설정할때도 업캐스팅을 했다

세션 설정

//session.setAttribute ( java.lang.String name, java.lang.Object value )
session.setAttribute( "id", "guardian23" );

- 밸류의 자료형이 Object 로 되어있다

- 우리는 String 형으로 매개변수를 입력했음, 즉 업캐스팅 (자동형변환) 된 것이다

- String 외에도 DTO 클래스 등 직접만든 클래스들이 이 자리에 들어갈 수 있다, Object 가 모든 클래스 조상이므로

 

+ session 은 보통 한개만 설정하는 게 일반적

- 회원의 ID 값이 밸류 자리에 들어감, 회원을 식별하는 고유 정보이기때문에

- id 값만 있으면 p.k 이므로 다른 모든 정보를 구해올 수 있다

 

session 객체 예제 2

- WebContent/session/session2

- closeSession.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<%
    session.invalidate();
%>

<html>
	<head><title>세션 종료</title></head>
	<body>

	<script>
		alert("로그아웃");
		location.href = "../session/viewSession.jsp"
	</script>

	</body>
</html>

- 세션을 삭제함

- 주로 로그아웃시에, 회원탈퇴시에 세션을 삭제한다

- invalidate() 메소드는 모든 세션을 한꺼번에 삭제시켜주는 메소드

- 브라우저 창이 닫히지 않았지만 모든 세션이 삭제됨

- 세선 삭제를 하고 alert 메세지를 띄우고 세션을 확인할 수 있는 viewSession.jsp 로 이동시켜줌

- viewSession.jsp 로의 상대경로인 한폴더 위로 가서 session 폴더의 viewSession.jsp 로 감

- 로그아웃 후, 즉 세션삭제 후 일반적인 흐름대로 <script> 안에 쓴 것

 

- 세션 삭제 확인 가능!

 

session 객체 예제 2

- WebContent/session/sessionLogin

- sessionLogin.jsp & sessionLoginCheck.jsp & sessionLoginForm.jsp & sessionLogout.jsp

- sessionLoginForm.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<html>
	<head><title>로그인폼</title></head>
	<body>

	<form action="<%= request.getContextPath() %>/sessionLogin.jsp" method="post">
		아이디 <input type="text" name="id" size="10">
		암호 <input type="password" name="password" size="10">
			<input type="submit" value="로그인">
	</form>

	</body>
</html>

- '로그인' 버튼 클릭시 sessionLogin.jsp 로 페이지 이동

 

- 찾고자 하는 sessionLogin.jsp 파일을 찾을 수 없다

- 이유 (부분 코드)

- getContextPath() 를 통해 현재 프로젝트명을 구함 -> jspproject

- 프로젝트를 구한 후 sessionLgoin.jsp 파일을 찾아가기 위해선 WebContent 폴더가 기준이 된다

- WebContent 폴더 기준으로부터 session/sessionLogin 을 경로에 추가해야 찾아간다

<form action="<%= request.getContextPath() %>/session/sessionLogin/sessionLogin.jsp" method="post">
</form>

- 로 경로를 수정시 sessionLogin.jsp 파일을 찾아간다

- 하지만 이렇게 절대경로를 쓰는 방식은 복잡하다

 

다른 방법 사용

<form action="sessionLogin.jsp" method="post">
</form>

- 같은 폴더 내에 있으므로 그냥 세션명만 적으면 sessionLogin.jsp 를 잘 찾아간다

- 내부의 id, 비번과 다른 경우 로그인 실패 메세지를 띄우며 이전페이지로 돌아온다 (history 객체 사용)

+ 현재는 DB 연동은 안되어있지만 id 값과 비밀번호 값이 같은 경우 로그인이 성공한다

 

- sessionLogin.jsp (값이 넘어가는 페이지)

<%@ page contentType = "text/html; charset=euc-kr" %>

<%
    String id = request.getParameter("id");
    String password = request.getParameter("password");
    
    if (id.equals(password)) {	// 로그인 성공
        session.setAttribute("MEMBERID", id);	// 세션 설정
%>

		<html>
			<head><title>로그인성공</title></head>
			<body>
			<script>
				alert("로그인 성공");
				location.href="sessionLoginCheck.jsp"
			</script>
			</body>
		</html>

<%
    } else { // 로그인 실패시
%>

		<script>
			alert("로그인에 실패하였습니다.");
//			history.go(-1);	// 이전 파일로 돌아가기
			history.back();	// 이전 파일로 돌아가기
		</script>
<%
    }
%>

- name 값을 통해 값을 구해온다

- 현재는 DB 연동은 안되어있지만 id 값과 비밀번호 값이 같은 경우 로그인이 성공으로 판별

<로그인 성공시>

- 세션을 설정하고 있다, 이때 MEMBERID 라는 변수에 회원이 입력한 id 값(아이디)을 저장

- 그 이후 로그인 성공 메세지 출력하고 확인 클릭시 location 객체로 sessionLoginCheck.jsp 로 넘어감

- location 객체로 페이지 이동시 아무런 값도 가져가지 않았다! -> 브라우저 끼리 창을 닫기 전까지 세션값을 공유하고 있는 것임

- sessionLoginCheck.jsp 파일에서 세션값인 아이디를 써야한다면 세션값을 구해오면 된다

<로그인 실패시>

- 로그인 실패 메세지 출력하고 이전파일로 가기 위해 history 객체의 go(-1) 을 사용하여 이전페이지인 로그인 페이지로 돌아가게함

- go(-1) 대신 back() 메소드를 사용해서 이전파일로 돌아갈 수도 있다

+ sessionLoginForm.jsp 에서 설정했던 name 값이 변수명이 됨

 

- 로그인 성공시 출력

- sessionLoginCheck.jsp 파일로 넘어감, 로그인되었는지 로그아웃되었는지 확인해주는 파일

 

-  로그인 실패시 출력

- 이전 페이지인 로그인 페이지로 돌아옴

 

- location 객체로 페이지 이동시 아무런 값도 가져가지 않았다! -> 브라우저 끼리 창을 닫기 전까지 세션값을 공유하고 있는 것임

- 값 전달 없이 sessionLoginCheck.jsp 파일에서도 세션값을 구해오면 된다

- sessionLoginCheck.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%
    String memberId = (String)session.getAttribute("MEMBERID");

	//조건연산자(3항 연산자)
	// (조건식) ? a : b
	// -> 조건식이 true이면 a가, false면 b가 실행됨

    boolean login = memberId == null ? false : true;
%>

<html>
	<head><title>로그인여부 검사</title></head>
	<body>

<%
    if (login) {	// 로그인 한 경우
%>
		<%= memberId %>님 환영합니다. <br>
		
		<a href="sessionLogout.jsp">로그아웃</a> <br>
		
		정보수정 <br>
<%
    } else {	// 로그인 하지 않은 경우
%>
		로그인하지 않은 상태	<br>
		
		<a href="sessionLoginForm.jsp">로그인</a> <br>
		
		<a href="../../request/member/memberform.html">회원가입</a> <br>
<%
    }
%>

	</body>
</html>

- 위에서 getAttribute() 메소드로 세션의 값을 구해오고 있다, memberId 변수에 저장한다

- 삼항 연산자 사용

- memberId == null 은 공유하는 값이 없다면 이라는 의미

- 그냥 이 파일 sessionLoginCheck.jsp 을 실행하게되면 memberId 값에는 null 값이 들어감

- null 이면 로그인 안한경우이고 false 를 반환 null 이 아니면 로그인을 한 경우 이므로 true 를 반환

- 이 boolean 값으로 if~else 문을 사용해서 로그인 한 경우와 안한 경우를 나눠서 보여줌

 

<로그인 한 경우 = 세션 있는 경우>

- 아이디 표시, 로그아웃 , 정보수정 메뉴가 나타남, 링크걸어주기

- 로그아웃 버튼 클릭시 sessionLogout.jsp 로 가서 거기서 다시 로그인페이지로 보냄

 

<로그인 안한 경우 = 세션 없는 경우>

- 다른 브라우저로 바로 sessionLoginCheck.jsp 실행시 세션이 없으므로 로그인 안한 경우가 됨

- 로그인, 회원가입 메뉴가 나타남, 링크 걸어주기

- 회원가입 을 클릭시 request 폴더의 memberform.html 회원가입 양식으로 가기위해 상대경로를 설정했음

-> "../../request/member/memberform.html"

 

 

- sessionLogout.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<%
    session.invalidate();	// 세션 삭제
%>

<html>
	<head><title>로그아웃</title></head>
	<body>
	<script>
		alert("로그아웃");
		location.href = "sessionLoginForm.jsp";
	</script>
	</body>
</html>

- invalidate() 로 로그아웃을 처리해줌

- 로그아웃 한 후, 로그아웃 메세지를 뿌리고 location 을 통해 로그인 페이지인 sessionLoginForm.jsp 로 이동

 

+ 세션 예시 (네이버)

- 로그인 여부에 따라 다른 화면을 보여줌

1. 로그인 하지 않았을때 = 세션값 없을때

- 로그인 클릭시 로그인 폼으로 넘어감

- 회원가입 클릭시 회원가입 폼으로 넘어감

 

2. 로그인 했을때 = 세션값 있을때

- 로그아웃 클릭시 로그아웃 jsp 파일로 이동되어 세션 연결 끊김

 

+ 페이지 이동해도 언제든 세션값을 가져올 수 있으므로 페이지 이동시에 값전달 할 필요없다

+ 로그인부터 로그아웃까지 세션 영역이므로 그 사이간은 어디서든 세션값을 가져올 수 있다

 

+ Recent posts