본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 세션 : 장바구니 만들기 2

728x90
반응형

예제 - 세션에 저장된 세션 속성 삭제하기 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()">상품 주문 &raquo;</a> <!-- 상품 주문을 클릭하면 핸들러 함수 addToCart()가 실행되도록 onclick 속성을 작성.  -->
							<a href="./cart.jsp" class="btn btn-warning">장바구니 &raquo;</a>
							<a href="./products.jsp" class="btn btn-secondary"> 상품 목록 &raquo;</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"> &laquo; 쇼핑 계속하기</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 를 실행

 

장바구니 버튼이 생성된것을 확인할 수 있다.

 

상품 주문을 클릭하면 장바구니에 추가를 묻는 팝업이 나타난다.

 

 

장바구니에 상품을 담고 장바구니 버튼을 눌러 장바구니에 들어가보면 아까 주문하기로 담은 상품을 볼 수 있다.

 

 

삭제하기를 누르면 장바구니에 담겨있던 상품이 삭제된것을 확인할 수 있다.

 

728x90
반응형