세션 예제
sessionInit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--
1. 세션(Session)
- 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
2. 세션의 특징
- 정보가 서버의 메모리에 저장
- 쿠키보다 보안에 유리
- 브라우저(사용자)당 한개의 세션(sessionId)이 생성됨.
- 세션은 유효 시간을 가짐(30분)
- 로그인 상태 유지 기능이나 소핑몰은 장바구니 담기 기능들에 주로 사용됨.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션만들기</title>
</head>
<body>
<%
//세션의 속성을 지정하는 코드
session.setAttribute("gumi", 202102);
session.setAttribute("zoom", "jsp");
session.setAttribute("daegu", "mysql");
/* 스크립트릿으로 내부객체인 session객체를 이용하여 값을 설정함
현재 이 jsp파일이 서버에 요청을 하게되면 컨테이너가 jsp파일 서블릿으로 변환함.
=>session객체가 자동으로 생성되면서 컴파일이 이루어진다.*/
%>
<a href="sessionGet.jsp">세션값 확인</a>
</body>
</html>
sessionGet.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 값 확인</title>
</head>
<body>
<%
/*
세션에 저장한 각 속성의 Name에 대한 value를 출력함.
=> session의 getAttribute()의 변환타입이 Object타입이라서
강제로 다운케스팅 했다.
*/
Object obj1 = session.getAttribute("gumi"); //속성값 얻기
Integer intValue = (Integer)obj1; //downcasting
out.print("gumi : " +intValue+ "<br/>"); //출력
Object obj2 = session.getAttribute("zoom"); //속성값 얻기
String str = (String)obj2; //downcasting
out.print("zoom : " +str+ "<br/>"); //출력
%>
<br/>
<%
out.println("==============================================<br/>");
String sName;
String sValue;
Enumeration<String> enumeration = session.getAttributeNames();
//가져올 데이터가 있느냐?
while(enumeration.hasMoreElements()){
sName = enumeration.nextElement(); //있으면 가져와라
sValue = session.getAttribute(sName).toString();
out.println("sName : " +sName+ "<br/>");
out.println("sValue : " +sValue+ "<br/>");
}
out.println("==============================================<br/>");
/*
sessionId는 웹브라우저당 하나가 생기는 유니크한 값임.
당연히 서버에서 생성해준다.
*/
String sessionId = session.getId();
out.println("sessionId : " +sessionId+ "<br/>");
out.println("==============================================<br/>");
int sessionInterval = session.getMaxInactiveInterval();
out.println("세션 유효시간(초) : " +sessionInterval+ "<br/>");
out.println("==============================================<br/>");
//gumi세션의 특정한 값을 삭제하는 코드
//session.removeAttribute("gumi");
//세션의 모든값 삭제 (로그아웃에 활용)
session.invalidate();
//유효한 세션id가 있는지 알아보는 코드
if(request.isRequestedSessionIdValid()){
out.println("session valid");
}
else {
out.println("session Invalid");
}
%>
</body>
</html>
세션을 이용한 로그인 예제
session_login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지입니다.</h1>
<form action="session_loginOk.jsp" method="post">
아이디 : <input type="text" name="id" size="12" required="required" /><br/>
비밀번호 : <input type="password" name="pw" size="12" required="required" /><br/>
<input type="submit" value="로그인" />
<input type="reset" value="초기화" />
</form>
</body>
</html>
session_loginOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 확인</title>
</head>
<body>
<%!
String id, pw;
%>
<%
request.setCharacterEncoding("UTF-8");
id = request.getParameter("id");
pw = request.getParameter("pw");
/*
지금은 DB를 설정하지 않아서 아래와 같이 코드 작성함.
추후 DB연동하고 난뒤 코드 볁경.
*/
if(id.equals("gumi") && pw.equals("202101")) {
//세션으로 로그인정보 저장됨.
session.setAttribute("id", id);
System.out.println("session_loginOk.jsp 파일 지나감");
//로그인 성공하면 sendRedirect() 이용하여 login_success.jsp파일로 이동.
response.sendRedirect("session_login_success.jsp");
}
else {
//로그인 실패하면 sendRedirect() 이용하여 login_fail.jsp파일로 이동.
response.sendRedirect("session_login_fail.jsp");
}
%>
</body>
</html>
session_login_success.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 성공</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
Enumeration<String> enumeration = session.getAttributeNames();
while(enumeration.hasMoreElements()){
String sName = enumeration.nextElement();
String sValue = (String)session.getAttribute(sName); //downcasting
//DB연동이되면 직접 사용자와 비교하는 코드로 바꾸어야 한다.
if(sValue.equals("gumi")){
out.println(sValue +"님 안녕하세요!"+"<br/>");
}
}
%>
<h1>환영합니다.</h1>
<a href="session_logout.jsp">로그아웃</a>
<script type="text/javascript">
alert("로그인 성공");
</script>
</body>
</html>
session_login_fail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 실패</title>
</head>
<body>
<!-- 자바스크립트 alert함수 이용해서 메시지 창 띄우고
다시 login.html 파일로 이동시킴 -->
<script type="text/javascript">
alert("로그인 실패");
location.href="session_login.html";
</script>
</body>
</html>
session_logout.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그아웃</title>
</head>
<body>
<%
Enumeration<String> enumeration = session.getAttributeNames(); //현재 있는 세션 다 불러옴
while(enumeration.hasMoreElements()){
String sName = enumeration.nextElement();
String sValue = (String)session.getAttribute(sName);
if(sValue.equals("gumi")){
out.print(sValue + "님이 로그아웃 하셨습니다." + "<br/>");
session.removeAttribute(sName);
}
}
%>
<br/><br/>
<a href="sessionCheck.jsp">세션 확인</a>
</body>
</html>
sessionCheck.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--
소결론 -- 쿠키와 세션의 차이점(중요)
쿠기 : 보안에 취약(로컬 PC에 저장되기 때문에)
---------------------------------------------
세션 : 1)서버에 객체로 존재함.
2)보안에 강함, JSP를 통해서만 접근 가능함.
3)여러 클라이언트가 접속하므로
한 클라이언트에 하나의 세션 생성하고 세션아이디를 부여함
4)세션아이디로 어느 클라이언트에서 요청이 들어오는지
서버는 구별할수 있게됨.
5)현업에서 세션 많이 사용함.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 확인</title>
</head>
<body>
<h1>세션 속성이 삭제된 것을 확인하는 sessionCheck.jsp페이지 입니다.</h1>
<%
Enumeration<String> enumeration = session.getAttributeNames(); //현재 있는 세션 다 불러옴
int i = 0;
while(enumeration.hasMoreElements()){
i++;
String sName = enumeration.nextElement();
String sValue = (String)session.getAttribute(sName);
out.println("sName : " +sName+ "<br/>" );
out.println("sValue : " +sValue+ "<br/>" );
}
//세션의 값이 많을경우 invalidate() 사용
//session.invalidate();
if(i==0){
out.println("해당 세션이 삭제되었습니다.");
}
%>
</body>
</html>
예외 페이지
page지시자를 이용한 예외 처리
exceptionTest.jsp
<!-- 현재 이 페이지에서 예외가 발생하면 페이지 지시자에 있는 속성중 errorPage로 설정한 페이지로
이동하라는 지시자의 내용이다.-->
<%@ page errorPage="exceptionPage.jsp" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외 테스트</title>
</head>
<body>
<%
//모든 수는 0으로 나눌수 없기에 Arithmetic 예외발생됨.
int i = 100 / 0;
%>
</body>
</html>
exceptionPage.jsp
<!-- 페이지 지시자 이용해서 isErrorPage속성을 true로 설정했다.
설정을 해줘야 exception객체를 참조하여 예외 메시지를 활용할수 있음.-->
<%@ page isErrorPage="true" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외 페이지</title>
</head>
<body>
<%
/* 200이라는 값은 정상적인 페이지를 의미한다. 이와 같이 지정하지 않으면
컨테이너가 500으로 설정하는 경우가 있다.*/
response.setStatus(200);
response.setCharacterEncoding("UTF-8");
%>
<h1>죄송합니다. 서비스 실행 중 오류가 발생했습니다.</h1>
<h1>장시 후 다시 시도해 주세요.</h1>
<img alt="" src="image/error_image.png">
<%-- <%=exception.getMessage() %> --%>
</body>
</html>
액션 태그?
액션태그는 JSP페이지 내에서 어떤 동작을 하도록 지시하는 테그이다.(흐름 제어기능)
예를 들면 이동, 페이지 include(포함) 등 이다.
forward(이동), include(포함), param(데이터 넘김) 태그가 주로 사용된다.
url은 그대로 유지 코드만 불러온다.
액션 태그 예제
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
</head>
<body>
<!-- h1태그 부분은 잠깐 출력은 될 것이다. 육안으로 확인 안된다.
forword 액션 태그를 이용하여 sub.jsp페이지로 이동하라고 코딩했다. -->
<h1>main.jsp 페이지 입니다.</h1>
<%
System.out.println("sub.jsp페이지 이동하기 전 main.jsp페이지 입니다.");
//sendRedirect()는 URL 주소가 바뀐다.
//response.sendRedirect("sub.jsp");
%>
<!-- forword 액션태그 : URL 주소는 main.jsp로 변하지 않고, 페이지 이동만 일어나서
사용자에게 보여주는 페이지는 sub.jsp페이지가 된다. forword액션태그의 특징이다. -->
<jsp:forward page="sub.jsp"/>
</body>
</html>
sub.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서브 페이지</title>
</head>
<body>
<h1>sub.jsp페이지 입니다.</h1>
</body>
</html>
include 액션태그
현재 페이지에 다른 페이지를 삽입할 때 사용 합니다, (포함)
page속성 값은 현제 JSP페이지 내에 포함할 내용을 가진 외부 파일명이다.
param 액션태그
forward 액션 태그의 바디에 사용하는 액션 태그 프로그램 제어가 이동할 JSP 페이지에 값을 전달할 때 사용
forward, param 액션 태그 예제
forward_param.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward 태그, param 태그 테스트</title>
</head>
<body>
<h1>forward_param.jsp페이지 입니다.</h1>
<%
System.out.println("sub.jsp페이지 이동하기 전 forward_param.jsp페이지 입니다.");
%>
<!-- forward액션태그를 이용하고 그안에 다시 jsp:param액션태그를 이용하여 파라미터들을 전달하고 있음.
페이지 이동에 있어서 내부객체인 request객체는 서로 공유하기 때문에 forward_param_result.jsp
페이지에서 request를 이용하여 파라미터값을 참조하면 된다.-->
<jsp:forward page="forward_param_result.jsp">
<jsp:param value="gumi" name="id"/>
<jsp:param value="202101" name="pw"/>
</jsp:forward>
</body>
</html>
forward_param_result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 확인</title>
</head>
<body>
<h1>forward_param_result.jsp페이지 입니다.</h1>
<%!
String id, pw;
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
%>
id값 : <%=id %><br/>
pw값 : <%=pw %><br/>
</body>
</html>
폼태그와 포워드 예제
forward_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>폼태그와 포워드</title>
</head>
<body>
<h1>포워드와 폼을 이용한 테스트입니다.</h1>
<form action="forward_form_result01.jsp" method="post">
<!-- hidden 타입 : 사용자로부터 입력을 받지 않음. 특정값을 지정해 숨겨서 페이지로 값을 전달하는 타입이다. -->
<input type="hidden" name="forwardPage" value="forward_form_result02.jsp">
<table border="1" bgcolor="yellow">
<tr>
<td>이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>나이</td>
<td><input type="number" name="age"></td>
</tr>
<tr>
<td>주소</td>
<td><input type="text" name="address"></td>
</tr>
<tr>
<td><input type="submit" value="전송하기"></td>
</tr>
</table>
</form>
</body>
</html>
forward_form_result01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>폼테그와 포워드 결과1</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
System.out.println("forward_form_result01.jsp 지나감.");
%>
<jsp:forward page='<%=request.getParameter("forwardPage") %>'>
<jsp:param value="000-0000-0000" name="tel"/>
</jsp:forward>
<!-- forward액션태그 이용해서 앞 forward_form.jsp에서 form태그로 요청한 hidden속성을 저장한 값으로
페이지 이동 시킴, 추가로 param액션태그를 이용한 tel값을 같이 넘기고 있다.
여기서 넘어온 값을 가져가기 위한 것은 스크립트릿 양옆에 ''으로 감싸야 넘어온다.-->
</body>
</html>
forward_form_result02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>폼테그와 포워드 결과2</title>
</head>
<body>
<h1>포워드 된 페이지(forward_form_result02.jsp)</h1>
<% request.setCharacterEncoding("UTF-8"); %>
<!-- forward_form.jsp파일에서 입력받은 부분을 출력하고 있다. -->
<!-- 폼테그를 이용해서 데이터전송하면 URL이 바뀌고, forward액션태그는 URL이 바뀌지 않는다.
forward 액션태그는 제어권을 포워딩되는 페이지로 완전히 넘기고 그 페이지가 끝이 나면 모든
응답을 종료함. -->
<table border="1" bgcolor="yellow">
<tr>
<td>이름</td>
<td><%= request.getParameter("name") %></td>
</tr>
<tr>
<td>나이</td>
<td><%= request.getParameter("age") %></td>
</tr>
<tr>
<td>주소</td>
<td><%= request.getParameter("address") %></td>
</tr>
<tr>
<!-- 전화번호의 경우는 forward_form_result01.jsp파일에서 param액션태그로 넘어온 값이다. -->
<td>전화번호</td>
<td><%= request.getParameter("tel") %></td>
</tr>
</table>
</body>
</html>