코딩항해기

[실습/JSP] 장바구니 프로그램 만들기 (+풀이 0807) 본문

problem solving/과제&실습 코딩

[실습/JSP] 장바구니 프로그램 만들기 (+풀이 0807)

miniBcake 2024. 8. 7. 17:25

 

 

[실습2]

d.jsp페이지에서 이름을 입력하여 e.jsp페이지로 이동합니다.
e.jsp 페이지에는 상품들(5개 아무거나)이 select 박스에 제공되어있습니다.
[장바구니에 추가] 버튼을 눌러서 해당 상품을 추가합니다.
[계산하기] 버튼을 누르면 지금까지 장바구니에 담았던 상품들을 모두 출력합니다.
f.jsp 페이지에서 장바구니에 select에서 선택한 상품을 추가해주세요.
g.jsp 페이지에서 장바구니에 저장했던 상품들을 출력해주세요.

 

 

d.jsp

가장 처음이 되는 페이지로 사용자명을 입력받는다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>d</title>
</head>
<body>
<h1>🥭🍎과일가게🍐🍑</h1>
	<form action="e.jsp" method="POST">
		<input type="text" name="name" placeholder="사용자 명을 입력하세요." required>
		<input type="submit" value="입장">
	</form>
<h1>🍑🍊🥥🧉🥭🍌🍋</h1>
</body>
</html>

 

e.jsp

물건(과일)을 담고 계산요청을 넣는 곳이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>e</title>
</head>
<body>
<%
	String user;//세션 유저명
	String name = request.getParameter("name"); //넘어온 이름 입력값
	ArrayList<String> cart = (ArrayList<String>)session.getAttribute("cart"); //장바구니
	
	if(name != null){//넘어오는 값이 있다면
		session.setAttribute("user", name);//세션 user명 갱신
		session.setAttribute("cart", null);//장바구니 비우기
	}
	
	user = ""+session.getAttribute("user"); //세션 값 받아오기
	
	ArrayList<String> products = new ArrayList<>();
	products.add("🍌바나나🍌");
	products.add("🍎사과🍎");
	products.add("🥭망고🥭");
	products.add("🥑아보카도🥑");
	products.add("🥥코코넛🥥");
%>
<h3><%= user %>님 환영합니다.</h3>
<hr>
<form action="f.jsp">
	<%--상품 리스트 --%>
	<%
		for(String product : products){
			out.println("<input type='checkbox' name='product' value='"+product+"'> "+product+" <br>");
		}
	%>
	<hr>
	<input type="submit" value="장바구니에 담기">
	<%
		if(!(cart == null || cart.isEmpty())){
			out.println("<div style='color:blue;'>장바구니에 물건이 "+cart.size()+"개 담겨있습니다.</div>");
		}
	%>
</form>
<hr>
<form action="g.jsp">
	<input type="submit" value="계산하기">
</form>
</body>
</html>

 

 

f.jsp

장바구니가 없다면 장바구니를 만들어서 상품을 담고, 다시 e.jsp페이지로 보낸다.

보여주는 페이지가 없으므로 html태그가 없다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<%
String[] datas = request.getParameterValues("product");
ArrayList<String> cart = (ArrayList<String>)session.getAttribute("cart");

if(cart == null){//장바구니가 아직 만들어진 적이 없다면, 지워진 상태라면
	cart = new ArrayList<String>();
	session.setAttribute("cart", cart);
}

if(datas != null){//받아온 입력값이 있다면
	for(String data : datas){
		cart.add(data);
	}
}

response.sendRedirect("e.jsp");//이동
%>

 

 

g.jsp

여태 담은 물품을 보여준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>g</title>
</head>
<body>
	<%
		String user = ""+session.getAttribute("user"); //세션 유저값
		ArrayList<String> cart = (ArrayList<String>)session.getAttribute("cart"); //장바구니
	%>
	<h1><%=user %>님의 영수증</h1>
	<ul>
		<%
			if(!(cart == null || cart.isEmpty())){//장바구니가 없거나, 비었거나하면 실행되지 않음
				for(String item : cart){
					out.println("<li>"+item+"</li>");
				}
			}
			else {
				out.println("장바구니가 비어있습니다.");
			}
		%>
	</ul>
	<hr>
	<a href="d.jsp">돌아가기</a>
</body>
</html>

 

 

[결과]

 

 

[풀이 후 보완할 점]

장바구니를 새 로그인할 때(유저명을 입력받을때)하고 있었는데,

계산하기를 할 때 세션 값을 받아온 뒤 세션을 비워야 했다. (계산하면서 비워져야하는게 맞다.)

 

세션을 비우는 명령어는 두 가지로, session.invalidate()와 session.removeAttribute(str)이 있는데, invalidate()는 모든 세션이 비워지고, removeAttribute(str)은 str에 들어가는 세션명을 가진 세션만 비워지는 차이점이 있다.

 

페이지 이동은 sendRedirect(str) 외에도 history.go(-1)로도 갈 수 있다.

history를 활용해서 페이지를 옮기니 alert창을 띄울 수 있어 물건이 담긴다는 것을 더욱 확실하게 인지 시켜줄 수 있는 효과가 있어 풀이처럼 했으면 더 좋았을 것 같다.