오늘이라도

[MyBatis] 22. 쇼핑몰 화면 작성, 장바구니 구현, 로그인 세션 구현 본문

취업성공패키지 SW 개발자 교육/Web

[MyBatis] 22. 쇼핑몰 화면 작성, 장바구니 구현, 로그인 세션 구현

upcake_ 2020. 6. 8. 09:33
반응형

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. 

gif 파일은 클릭해서 보는 것이 정확합니다.


 - 쇼핑몰 화면 작성, 장바구니 구현, 로그인 세션 구현 -

 

▲쇼핑몰 작동 화면

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String[] img ={"apple1.jpg", "apple2.jpg", "apple3.jpg", "banana1.jpg", "banana2.jpg", "banana3.jpg", "pear1.jpg", "pear2.jpg", "pear3.jpg"};
String[] name = {"사과1", "사과2", "사과3", "바나나1", "바나나2", "바나나3", "배1", "배2", "배3"};
String[] price = {"1,500", "1,600", "1,700", "3,000", "3,500", "4,000", "5,000", "6,000", "7,000"};
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ShopMallMain JSP</title>
<script type="text/javascript">
function fnCart(name, price) {
	//alert("Name : " + name + "\nPrice : " + price);
	if(confirm("장바구니에 담으시겠습니까?")) {
		location.href = "CartProcess.jsp?name=" + name + "&price=" + price;
	}
}

function fnView() {
	if(confirm("장바구니를 보시겠습니까?")){
		location.href = "CartView.jsp";
	}
}
</script>
</head>
<body>
<div align="center">
	<h3>[맛있는 과일 가게]</h3>
	<table border="1">
		<tr align="right">
			<td colspan="3">
				<input type="button" value="장바구니 보기" onclick="fnView()" />
			</td>
		</tr>
		<%
		for(int i = 0; i < img.length; i++) {
			if(i % 3 == 0) { 
				out.println("<tr align='center'>");
			}
			out.println("<td>");
				out.println("<table>");
					out.println("<tr align='center'>");
						out.println("<td>");
							out.println("<img src = 'images/" + img[i] + "' width='150' height='150' />");
						out.println("</td>");
					out.println("</tr>");
					
					out.println("<tr align='center'>");
						out.println("<td>");
							out.println("<b>" + name[i] + "</b>");
						out.println("</td>");
					out.println("</tr>");
					
					out.println("<tr align='center'>");
						out.println("<td>");
							out.println("<b>₩" + price[i] + "원</b>");
						out.println("</td>");
					out.println("</tr>");
					
					out.println("<tr align='center'>");
						out.println("<td>");
							//한 줄로 쓰기
							//out.println("<input type='button' value='장바구니 담기' onclick='fnCart(\"" + name[i] + "\", \"" + price[i] + "\")' />");
							//두 줄로 쓰기, 닫는 큰 따옴표와 괄호 옆의 띄어쓰기 필수
							out.println("<input type='button' value='장바구니 담기' ");
							out.println("onclick='fnCart(\"" + name[i] + "\", \"" + price[i] + "\")' />");
						out.println("</td>");
					out.println("</tr>");
				out.println("</table>");
			out.println("</td>");
			if(i % 3 == 2) {
				out.println("</tr>");
			}
		}
		%>	
	</table>
</div>
</body>
</html>

▲ShopMallMain.jsp : 쇼핑몰 메인 화면

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login main</title>
</head>
<body>
<div align="center">
	<table border="1">
		<tr height="100">
			<td colspan="2">
				<!-- 페이지 상단 영역(LoginTop.jsp) -->
				<%@ include file="LoginTop.jsp" %>
			</td>
		</tr>
		
		<tr>
			<td width="400" align="center" valign="top">
				<!-- 페이지 왼쪽 영역(LoginLeft.jsp) -->
				<%@ include file="LoginLeft.jsp" %>
			</td>
			<td width="700" align="center" valign="middle" height="300">
				<!-- Content 영역 -->
				<h3>메인 페이지입니다.</h3>
				2020.06.08
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<!-- 페이지 하단 영역(LoginBottom.jsp) -->
				<%@ include file="LoginBottom.jsp" %>
			</td>
		</tr>
	</table>
</div>
</body>
</html>

▲LoginMain.jsp : 로그인 메인 화면

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Top</title>
</head>
<body>
<!-- 페이지 상단 영역 -->
<div align="center">
	<table>
		<tr>
			<td align="right">
				<a href="#">HOME</a>&nbsp;&nbsp;&nbsp;
				<a href="#">LOGIN</a>&nbsp;&nbsp;&nbsp;
				<a href="#">SITEMAP</a>&nbsp;&nbsp;&nbsp;
				<a href="#">OTHERS</a>
			</td>
		</tr>
	</table>
</div>
</body>
</html>

▲LoginTop.jsp : 로그인 메인 화면의 상단 부분

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true" %> <!-- 현재 페이지를 세션에 추가해줌 -->
<%--
세션 객체에 id 속성이 있으면 해당 값(id)을 가져와서 로그인 유지 상태를 보여주고,
세션 객체에 id 속성이 없으면 로그인을 할 수 있는 화면을 보여준다.
 --%>
 <%
String id = (String) session.getAttribute("id");
 %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Left</title>
</head>
<body>
<%
//세션 객체에 id 속성이 있으면 보여질 화면
if(id != null) { //세션에 id 값이 있다 ▶ 로그인 상태를 유지하는 화면 %>
	<%=id %>님 방문을 환영합니다!<br />
	<a href="Logout.jsp">로그아웃</a>
<%} else { //세션에 id 값이 없다 ▶ 로그인 값이 없다%>
<form action="LoginProcess.jsp" method="post">
	<table border="1">
		<tr>
			<th>아이디</th>
			<td><input type="text" name="id" required="required"/></td>
			<td rowspan="2"><input type="submit" value="로그인"/></td>		
		</tr>
		<tr>
			<th>비밀번호</th>
			<td><input type="password" name="pw" required="required"/></td>		
		</tr>
	</table>
</form>
<%} %>
</body>
</html>

▲LoginLeft.jsp : 로그인 메인 화면 좌측의 로그인 화면

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");

//id 존재 유무, pw 일치 여부 검사 ▶ DB 연동해서 이상이 없으면
session.setAttribute("id", id);	//세션 바인딩(연결) 객체를 생성

//Cookie(쿠키) 설정 : 사용자쪽(Client)에 쿠키를 넣어준다.
Cookie ck = new Cookie("id", id);
ck.setMaxAge(60 * 60 * 24 * 365);	//쿠키가 존재하는 시간(유효 시간) : 1년짜리 쿠키
response.addCookie(ck);

response.sendRedirect("LoginMain.jsp");
%>

▲LoginProcess.jsp : 로그인 기능과 쿠키 부여 기능 담당 jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
session.removeAttribute("id");	//세션 객체에서 id값을 제거
response.sendRedirect("LoginMain.jsp");
%>

▲Logout.jsp : 로그아웃 기능 담당 jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Bottom</title>
</head>
<body>
<div align="center">
	<table>
		<tr>
			<th>회사명</th>
			<td>티스토리</td>
		</tr>
		<tr>
			<th>주소</th>
			<td>제주특별자치도</td>
		</tr>
	</table>
</div>
</body>
</html>

▲LoginBottom.jsp

 

<%@page import="java.text.DecimalFormat"%>
<%@page import="com.hanul.cart.CartDTO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
ArrayList<CartDTO> cart = null;

Object obj = session.getAttribute("cart");	//세션 객체에서 cart 값을 가져온다.

if(obj == null) {	//세션 정보가 없으면 배열을 생성 : 주문한 제품이 없다
	cart = new ArrayList<CartDTO>();	
} else {			//세션 정보가 있으면 강제로 캐스팅 : 주문한 제품이 있다
	cart = (ArrayList<CartDTO>) obj;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cart View</title>
<script type="text/javascript">
function fnPay(){
	alert("결제 API를 발급 받으시기 바랍니다.");
}

function fnClear(){
	if(confirm("장바구니를 비우시겠습니까?")) {
		location.href = "CartClear.jsp";	
	}
}

function fnGo(){
	location.href = "ShopMallMain.jsp";
}
</script>
</head>
<body>
<div align="center">
	<h3>[장바구니 보기]</h3>
	<table border="1">
		<tr>
			<th>번호</th>
			<th>과일명</th>
			<th>단가</th>
			<th>주문 수량</th>
			<th>가격</th>
		</tr>
		<%
		if(cart.size() == 0) {
			out.println("<tr align='center'>");
				out.println("<td colspan= '5'>");
					out.println("장바구니에 담긴 상품이 없습니다.");
					out.println("<a href= 'ShopMallMain.jsp'>주문하기</a>");
				out.println("</td>");
			out.println("</tr>");
		} else {
			int totalSum = 0, total = 0;
			DecimalFormat df = new DecimalFormat("₩#,##0");
			for(int i = 0; i < cart.size(); i++) {
				CartDTO dto = cart.get(i);
				out.println("<tr align= 'center'>");
					out.println("<td>" + (i + 1) + "</td>");
					out.println("<td>" + dto.getName() + "</td>");
					out.println("<td>" + df.format(dto.getPrice()) + "</td>");
					out.println("<td>" + dto.getCnt() + "</td>");
					total = dto.getPrice() * dto.getCnt();
					out.println("<td>" + df.format(total) + "</td>");
				out.println("</tr>");
				totalSum += total;
			}
		out.println("<tr align = 'center'>");
			out.println("<td colspan= '4'>");
				out.println("<input type='button' value='결제하기' onclick='fnPay()' />");
				out.println("<input type='button' value='장바구니 비우기' onclick='fnClear()' />");
				out.println("<input type='button' value='쇼핑 계속하기' onclick='fnGo()' />");
			out.println("</td>");
			out.println("<td>");
			out.println(df.format(totalSum));
			out.println("</td>");
		out.println("</tr>");
		}//if else
		%>
	</table>
</div>
</body>
</html>

 

▲CartView.jsp : 장바구니 조회 화면

 

<%@page import="com.hanul.cart.CartDTO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String price = request.getParameter("price");

ArrayList<CartDTO> cart = null;

Object obj = session.getAttribute("cart");	//세션 객체에서 cart 값을 가져온다.

if(obj == null) {	//세션 정보가 없으면 배열을 생성 : 최초 주문한 경우
	cart = new ArrayList<CartDTO>();	
} else {			//세션 정보가 있으면 강제로 캐스팅 : 추가 주문
	cart = (ArrayList<CartDTO>) obj;
}

int pos = -1;	//등록된 제품이 없다
//장바구니 세션에 동일한 제품이 있을 경우 : 수량(cnt) 증가
for(int i = 0; i < cart.size(); i++) {
	CartDTO dto = cart.get(i);
	if(dto.getName().equals(name)) {
		pos = 1;
		dto.setCnt(dto.getCnt() + 1);
		break;
	}
}

//장바구니 세션에 등록된 제품이 없을 경우 : CartDTO 객체를 생성하여 배열에 등록(add())
if(pos == -1) {
	CartDTO dto = new CartDTO();
	dto.setName(name);
	dto.setPrice(Integer.parseInt(price.replace(",", "")));	//1,500 ▶ 1500 : 쉼표 제거 후 정수형으로 랩핑
	dto.setCnt(1);
	cart.add(dto);
}

//cart 세션 객체를 만들어 준다.
session.setAttribute("cart", cart);
%>

<script>alert("장바구니에 담았습니다."); location.href = "ShopMallMain.jsp"</script>

▲CartProcess.jsp : 장바구니에 상품 등록 기능 담당 jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
session.getAttribute("cart");
session.removeAttribute("cart");
response.sendRedirect("ShopMallMain.jsp");
%>

▲CartClear.jsp : 장바구니 비우는 기능 담당 jsp

 

package com.hanul.cart;

import java.io.Serializable;

public class CartDTO implements Serializable {
	private String name;	//과일명
	private int price;		//가격
	private int cnt;		//수량
	
	public CartDTO() {}

	public CartDTO(String name, int price, int cnt) {
		super();
		this.name = name;
		this.price = price;
		this.cnt = cnt;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getCnt() {
		return cnt;
	}

	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	
	
}

▲CartDTO.java

반응형