예제 - 세션에 저장된 세션 속성 삭제하기 2
session05.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</title>
</head>
<body>
<h4>-----세션을 삭제하기 전 ------</h4>
<%
String name;
String value;
//세션에 저장된 모든 세션 속성 이름을 가져오도록 session 내장 객체의 getAttributeNames()메소드를 작성
Enumeration en = session.getAttributeNames();
int i = 0;
//Enumeration 객체의 hasMoreElements()메소드를 통해 저장된 세션 속성 이름이 있을 떄 까지 반복하도록 while 문을 작성
while(en.hasMoreElements()){
i++;
name = en.nextElement().toString();//세션 속성 이름을 가져오도록 Enumeration 객체의 nextElement()메소드를 작성
value = session.getAttribute(name).toString();//세션 속성 이름의 속성 값을 가져오도록 session 내장 객체의 getAttribute()메소드를 작성.
//세션 속성 이름과 속성 값을 출력하도록 작성.
out.println("설정된 세션의 이름 [" + i + " ] :" + name + "<br>");
out.println("설정된 세션의 값 [" + i + "] : " + value + "<br>");
}
session.removeAttribute("userID");
%>
<h4>----세션을 삭제 한 후 -----</h4>
<%
en = session.getAttributeNames();
i = 0;
while(en.hasMoreElements()){
i++;
name = en.nextElement().toString();
value = session.getAttribute(name).toString();
out.println("설정된 세션의 이름 [" + i + " ] :" + name + "<br>");
out.println("설정된 세션의 값 [" + i + "] : " + value + "<br>");
}
%>
</body>
</html>
4.2 다중 세션 삭제하기
세션에 저장된 모든 세션 속성 이름을 삭제하려면 invalidate()메소드를 사용하며 형식은 다음과 같다.
void invalidate()
다음은 세션을 종료하고 세션에 저장된 모든 세션 속성을 삭제하는 예이다.
[invalidate() 메소드 사용 예]
session.invalidate()
예제 - 세션에 저장된 모든 세션 속성 삭제하기
session06.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</title>
</head>
<body>
<h4>-----세션을 삭제하기 전 ------</h4>
<%
String user_id = (String) session.getAttribute("userID");
String user_pw = (String) session.getAttribute("userPW");
out.println("설정된 세션 이름 userID : " + user_id +"<br>");
out.println("설정된 세션 값 userPW : "+ user_pw + "<br>");
if(request.isRequestedSessionIdValid() == true){
out.print("세션이 유효합니다. ");
}else{
out.print("세션이 유효하지 않습니다. ");
}
//세션에 저장된 모든 세션 속성을 삭제하도록 session 내장 객체의 invalidate()메소드를 작성
session.invalidate();
%>
<h4>----세션을 삭제 한 후 -----</h4>
<%
if(request.isRequestedSessionIdValid() == true){
out.print("세션이 유효합니다. ");
}else{
out.print("세션이 유효하지 않습니다. ");
}
%>
</body>
</html>
05 세션 유효 시간 설정
세션 유효 시간은 세션을 유지하기 위한 세션의 일정 시간을 말한다. 웹 브라우저에 마지막 접근한 시간부터 일정 시간 이내에 다시 웹 브라우저에 접근하지 않으면 자동으로 세션이 종료된다. 이러한 세션 유효 시간을 설정하기 위해 session 내장 객체의 setMaxInactiveInterval() 메소드를 사용하며 형식은 다음과 같다.
void setMaxInactiveInterval(int interval)
여기서 매개변수 interval 은 세션 유효 시간이다. 세션 유효시간은 기본값이 1,800 초이고 초 단위로 설정한다. 만약 세션 유효시간을 0 이나 음수로 설정하면 세션 유효 시간이 없는 상태가 된다. 이 경우 세션을 삭제했을 대 session.invalidate()메소드를 호출 하지 않으면 생성된 세션 속성이 웹 서버에서 제거되지 않고 유지된다. 즉 세션 유효시간이 없는 상태에서 session.invalidate() 메소드를 명시적으로 실행하지 않으면 한번 생성된 세션이 계속 메모리에 남아 있고. 시간이 흐르면 이 세션 때문에 메모리 부족 현상이 발생한다.
다음은 세션 유효시간을 360초로 설정하는 예이다.
session.setMaxInactiveInterval(60*60);
예제 - 세션 유효 시간을 가져와 출력하기
session07.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</title>
</head>
<body>
<h4>-----세션을 유효시간 변경 전 ------</h4>
<%
//세션에 설정된 유효시간을 가져오도록 session 내장객체의 getMaxInactiveInterval()메소드를 작성
int time = session.getMaxInactiveInterval() / 60;
out.println("세션 유효 시간 : " + time + "분 <br>");
%>
<h4>----세션을 유효시간 변경 후 -----</h4>
<%
//세션 유효 시간을 60*60 초로 설정하도록 session 내장 객체의 setMaxInactiveInterval()메소드를 작성한다.
session.setMaxInactiveInterval(60*60);
time = session.getMaxInactiveInterval() / 60 ;
out.println("세션 유효 시간 : " + time + "분<br>");
%>
</body>
</html>
예제 - 세션 아이디와 웹 사이트에서 유지한 시간 출력하기
session08.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</title>
</head>
<body>
<%
//고유한 세션 내장 객체의 아이디를 가져오도록 session 내장 객체의 getId()메소드를 작성
String sessin_id = session.getId();
//세션에 마지막으로 접근한 시간을 가져오도록 session 내장 객체의 getLastAccessedTime()메소드를 작성
long last_time = session.getLastAccessedTime();
//세션이 생성된 시간을 가져오도록 session 내장 객체의 getCreationTime()메소드를 작성
long start_time = session.getCreationTime();
//웹 사이트에 머문 시간을 계산하도록 작성.
long used_time = (last_time - start_time) / 60000;
out.println("세션 아이디 : " + sessin_id + "<br>");
out.println("요청 시작 시간 : " +start_time +"<br>");
out.println("요청 마지막 시간 : " +last_time +"<br>");
out.println("웹 사이트의 경과 시간 : " +used_time +"<br>");
%>
</body>
</html>
06 웹 쇼핑몰 장바구니 페이지 만들기
1.상품 클래스에 멤버 변수 추가하기 :
장바구니에 담은 상품의 개수를 관리하도록 Product 클래스에 다음과 같이 필드를 선언한다.
2. 추가된 멤버 변수의 Setter/Getter() 메소드 작성하기 :
추가된 멤버 변수 quantity 의 Setter/Getter() 메소드를 각각 추가한다.
WebMarket/src/dto/Product.java
private int quantity; //장바구니에 담은 개수
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
3. 상품 상세 정보 페이지 수정하기 :
product.jsp 파일에 다음과 같이 추가 작성한다.
<script type="text/javascript">
//자바스크립트로 장바구니에 등록하기 위한 핸들러 함수 addToCart()작성
function addToCart(){
if(confirm("상품을 장바구니에 추가하시겠습니까?")){ //메시지 창에서 <확인>을 클릭하면 폼 문의 action 속성 값이 실행되고,
document.addForm.submit();
}else{ // <취소>를 클릭하면 폼 문의 실행을 취소하도록 작성.
document.addForm.reset();
}
}
</script>
<form name="addForm" action="./addCart.jsp?id=<%=product.getProductId()%>" method="post">
<!-- <상품주문>,<상품 목록> 버튼을 작성한다 -->
<p> <a href="#" class="btn btn-info" onclick="addToCart()">상품 주문 »</a> <!-- 상품 주문을 클릭하면 핸들러 함수 addToCart()가 실행되도록 onclick 속성을 작성. -->
<a href="./cart.jsp" class="btn btn-warning">장바구니 »</a>
<a href="./products.jsp" class="btn btn-secondary"> 상품 목록 »</a>
</form>
4. 장바구니에 등록하는 페이지 작성하기 :
addCart.jsp 파일을 생성하고 다음과 같이 작성한다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="dto.Product" %>
<%@ page import="dao.ProductRepository" %>
<%
//요청 파라미터 아이디를 전송받도록 request 내장 객체의 getParameter()메소드를 작성하고, 전송된 아이디가 없을 때
//웹 페이지 products.jsp 로 이동하도록 response 내장 객체의 sendRedirect() 메소드를 작성한다.
String id = request.getParameter("id");
if(id == null || id.trim().equals("")){
response.sendRedirect("products.jsp");
return;
}
//상품 데이터 접근 클래스 ProductRepository 의 기본 생성자에 대한 객체 변수 instance 를 얻어오도록 작성
ProductRepository dao = ProductRepository.getInstance();
//상품 아이디에 대한 상품 정보를 얻어오도록 ProductRepository 객체의 getProductById()메소드를 호출하고 이를
//Product 객체에 저장하도록 작성. 만약 상품 아이디에 대한 정보가 없으면 예외 처리 웹 페이지 exceptionNoProductId.jsp
//로 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성.
Product product = dao.getProductById(id);
if(product == null ){
response.sendRedirect("exceptionNoProductId.jsp");
}
//상품 목록을 얻어오도록 ProductRepository 객체의 getAllProducts()메소도를 호출하고 이를 ArrayList 객체에 저장하도록 작성.
//ArrayList 객체에 저장된 상품 목록에 요청 파라미터 아이디의 상품이 존재하는지 검사하도록 작성.
ArrayList<Product> goodsList = dao.getAllProducts();
Product goods = new Product();
for(int i = 0; i<goodsList.size(); i ++){
goods = goodsList.get(i);
if(goods.getProductId().equals(id)){
break;
}
}
//요청 파라미터 아이디의 상품을 담은 장바구니를 초기화하도록 작성. 41행에서는 세션 속성 이름 cartlist(장바구니) 의 세션정보(장바구니에 등록된 데이터)
//를 얻어와 ArrayList 객체에 저장한다. 만약 ArrayList 객체에 저장된 세션 정보가 없으면 ArrayList 객체를 생성하고 이를 세션 속성 이름 cartlist의 속성 값으로 저장.
ArrayList<Product>list = (ArrayList<Product>) session.getAttribute("cartlist");
if(list == null){
list = new ArrayList<Product>();
session.setAttribute("cartlist", list);
}
//요청 파라미터 아이디의 상품이 장바구니에 담긴 목록이면 해당 상품의 수량을 증가시키도록 작성.
int cnt = 0;
Product goodsQnt = new Product();
for(int i = 0; i< list.size(); i++){
goodsQnt = list.get(i);
if(goodsQnt.getProductId().equals(id)){
cnt++;
int orderQuantity = goodsQnt.getQuantity() + 1 ;
goodsQnt.setQuantity(orderQuantity);
}
}
//요청 파라미터 아이디의 상품이 장바구니에 담긴 목록이 아니면 해당 상품의 수량을 1로 하고 장바구니 목록에 추가하도록 작성.
if(cnt == 0){
goods.setQuantity(1);
list.add(goods);
}
//요청 파라미터 아이디를 설정하여 웹 페이지 product.jsp로 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성.
response.sendRedirect("product.jsp?id=" + id);
%>
5. 장바구니 페이지 작성하기 :
cart.jsp 파일을 생성하고 다음과 같이 작성한다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="dto.Product" %>
<%@ page import="dao.ProductRepository" %>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<%
String cartId = session.getId();
%>
<title>장바구니</title>
</head>
<body>
<jsp:include page = "menu.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">장바구니</h1>
</div>
</div>
<div class="container">
<div class="row">
<table width="100%">
<tr><!-- <삭제하기>, <주문하기> 버튼을 작성 -->
<td align="left"><a href="./deleteCart.jsp?cartId=<%=cartId%>" class="btn btn-danger">삭제하기</a></td>
<td align="right"><a href="#" class="btn btn-success">주문하기</a></td>
</tr>
</table>
</div>
<div style="padding-top : 50px">
<table class="table table-hover">
<tr>
<th>상품</th>
<th>가격</th>
<th>수량</th>
<th>소계</th>
<th>비고</th>
</tr>
<%
int sum = 0;
//장바구니인 cartlist 에 등록된 모든 상품을 가져오도록 session 내장 객체의 getAttribute()메소드를 작성.
ArrayList<Product> cartList = (ArrayList<Product>)session.getAttribute("cartlist");
if (cartList == null) //cartlist 에 저장된 상품 목록이 없으면 장바구니 cartlist를 생성하도록 작성.
cartList = new ArrayList<Product>();
for (int i = 0 ; i < cartList.size(); i++) { //cartlist 에 등록된 모든 상품을 하자씩 가져와 출력(상품 리스트 하나씩 출력하기)
Product product = cartList.get(i);
int total = product.getUnitPrice() * product.getQuantity();
sum += total;
%>
<tr><!-- 상품 아이디, 상품명, 가격, 수량, 소계 및 <삭제> 버튼을 출력하도록 작성 -->
<td><%=product.getProductId() %> - <%=product.getPname() %> </td>
<td><%=product.getUnitPrice() %></td>
<td><%=product.getQuantity() %></td>
<td><%=total %></td><!-- 바로 위 for문 에서 계산된 상품의 가격과 수량을 곱한 금액을 출력 -->
<td><a href="./removeCart.jsp?id=<%=product.getProductId()%>" class="badge badge-danger">삭제</a></td>
</tr>
<%
}
%>
<tr>
<th></th>
<th></th>
<th>총액</th>
<th><%=sum %></th><!-- 장바구니에 등록된 모든 상품의 총액을 출력하도록 작성. (위에 for문) -->
<th></th>
</tr>
</table>
<a href="./products.jsp" class="btn btn-secondary"> « 쇼핑 계속하기</a>
</div>
<hr>
</div>
<jsp:include page="footer.jsp"/>
</body>
</html>
6. 장바구니에 등록된 개별 상품 삭제 페이지 작성하기 :
removeCart.jsp 파일을 생성하고 다음과 같이 작성한다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="dto.Product" %>
<%@ page import="dao.ProductRepository" %>
<%
//요청 파라미터 아이디를 전송받도록 request 내장 객체의 getParameter() 메소드를 작성하고, 전송된 아이디가 없을 때 웹 페이지
//products.jsp 로 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성한다.
String id = request.getParameter("id");
if (id == null || id.trim().equals("")){
response.sendRedirect("products.jsp");
return;
}
//상품 데이터 접근 클래스 ProductRepository 의 기본 생성자에 대한 객체 변수 instance를 얻어오도록 작성.
ProductRepository dao = ProductRepository.getInstance();
//상품 아이디에 대한 상품 정보를 얻어오도록 ProductRepository 객체의 getProductById()메소드를 호출하고 이를
//Product 객체에 저장하도록 작성한다. 만약 상품 아이디에 대한 상품 정보가 없으면 예외 처리 웹 페이지 exceptionNoProductId.jsp 로 이동하도록
//response 내장 객체의 sendRedirect()메소드를 작성. !
Product product = dao.getProductById(id);
if (product == null) {
response.sendRedirect("exceptionNoProductId.jsp");
}
//장바구니인 cartlist 에 등록된 모든 상품을 가져오도록 session 내장 객체의 getAttribute()메소드를 작성.
ArrayList<Product>cartList = (ArrayList<Product>)session.getAttribute("cartlist");
//Product 객체를 생성하도록 작성.
Product goodsQnt = new Product();
//cartlist에 등록된 모든 상품을 하나씩 가져와 요청 파라미터 아이디와 같으면 cartlist에서 삭제하도록 작성.
for (int i = 0; i < cartList.size(); i++){
goodsQnt = cartList.get(i);
if (goodsQnt.getProductId().equals(id)){
cartList.remove(goodsQnt);
}
}
//웹 페이지 cart.jsp 로 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성.
response.sendRedirect("cart.jsp");
%>
7. 장바구니에 등록된 전체 상품 삭제 페이지 작성하기 :
deleteCart.jsp 파일을 생성하고 다음과 같이 작성한다.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="dto.Product" %>
<%@ page import="dao.ProductRepository" %>
<%
//요청 파라미터 cartId를 전송받도록 request 내장 객체의 getParameter() 메소드를 작성하고, 전송된 cartId 가 없을 때 웹 페이지
//cart.jsp로 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성.
String id = request.getParameter("cartId");
if (id == null || id.trim().equals("")){
response.sendRedirect("cart.jsp");
return;
}
//장바구니에 등록된 모든 상품을 삭제하도록 session 내장 객체의 invalidate() 메소도를 작성한다.
session.invalidate();
response.sendRedirect("cart.jsp");
%>
8. 프로젝트 실행하기
웹 브라우저에 http://localhost:8080/WebMarket/products.jsp 를 실행
'JSP, Servlet, MySQL > JSP - webmarket' 카테고리의 다른 글
JSP Servlet 쿠키 : 주문 처리 페이지 만들기 2 (0) | 2024.02.22 |
---|---|
JSP Servlet 쿠키 : 주문 처리 페이지 만들기 (0) | 2024.02.21 |
JSP Servlet 세션 : 장바구니 페이지 만들기 (0) | 2024.02.21 |
JSP Servlet 필터 : 로그 기록하기 3 (1) | 2024.02.05 |
JSP Servlet 필터 : 로그 기록하기 2 (1) | 2024.01.15 |