WEB/JSP

JSP 06 - 쇼핑몰 사이트 만들기(2), ERWin

inderrom 2022. 12. 26. 19:59

기존에 만들어둔 <welcome.jsp>

<welcom.jsp>

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
<link rel="stylesheet" href="/css/bootstrap.min.css"> 
</head>

<body>
	
	<%@ include file="menu.jsp" %>
	
	<%	// 선언문
		// 전역변수
		String greeting = "Welcome to rom's Web Shopping Mall";
		String tagline = "Welcome to Web Market.";
	%>
	<!-- 표현문 -->
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3"><%= greeting %></h1>
	 	</div>
	</div>
	<main role="main">
	<div class="container">
		<div class="text-center">
			<h3><%=tagline %></h3>
			<% // 스크립틀릿
				// 1초마다 페이지를 갱신(새로고침)
				response.setIntHeader("Refresh", 1);
				Date day = new Date();
				String am_pm;
				int hour = day.getHours();     // 시(12)
				int minute = day.getMinutes(); // 분(24)
				int second = day.getSeconds(); // 초(31)
				
				// 0 ~ 11 => 0  정수/정수 => 정수
				if(hour / 12 == 0){
					am_pm = "AM";
				}else{ // 12~24 => 1 또는 2가 됨
					am_pm = "PM";
					// 13~23시를 1~11시로 표현
					hour = hour - 12;
				}
				String CT = hour + ":" + minute + ":" + second + " " + am_pm;
				// out : JSP 내장 객체 중 하나
				out.print("현재 접속 시각 :" + CT + "<br>");
				
			%>
			
		</div>
	</div>
	</main>
		<%@ include file="footer.jsp" %>
</body>
</html>

include태그를 사용하여 header와 footer를 구분한다.

Date를 이용하여 화면에 시간을 나타낸다.

 

 

vo(value object)

자바빈클래스(객체) -> 데이터를 담아서 전달

 


상품 목록 구현

 

<ProductVO.java>

package kr.or.ddit.vo;

// 자바빈 클래스
// ProductVO <- PRODUCT 테이블
public class ProductVO {
	// 멤버변수 <- PRODUCT 테이블의 필드(컬럼=열=애트리뷰트=속성)
	// String => VARCHAR2(4000) : 순수한글 1333
	// productId => PRODUCT_ID ( 카멜 표기법 (낙타)표기법)
	private String productId; //상품아이디(기본키=> Not null, No Duplicate) 
	private String pname;// 상품명
	// unitPrice => NUMBER UNIT_PRICE
	private double unitPrice;// 상품 가격
	private String description; // 상품설명
	private String manufacturer; // 제조사
	private String category; // 분류( 휴대폰 / 태블릿/ 노트북)
	private long unitsInStock; //재고 수
	private String condition; // 신상품 or 중고품 or 재생품
	private String filename; // 이미지 파일명
	private int quantity; // 상품을 장바구나에 담은 개수
	
	// 기본생성자
	public ProductVO() {}
	
	// 생성자 => 클래스를 인스턴스화 하여 객체를 생성 시 멤버변수의 값을 초기화
	// 상품 아이디, 상품명, 가격을 매개변수(파라미터를 받는 변수)로 하는 생성자를 추가 작성함
	public ProductVO(String productId, String pname, double unitPrice) {
		// 필수인 객체 (not null)만 초기화 해준다.
		this.productId = productId;
		this.pname = pname;
		this.unitPrice = unitPrice;
	}
	
	

	// getter/setter 메소드
	public String getProductId() {
		return productId;
	}

	public void setProductId(String productId) {
		this.productId = productId;
	}

	public String getPname() {
		return pname;
	}

	public void setPname(String pname) {
		this.pname = pname;
	}

	public double getUnitPrice() {
		return unitPrice;
	}

	public void setUnitPrice(double unitPrice) {
		this.unitPrice = unitPrice;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getManufacturer() {
		return manufacturer;
	}

	public void setManufacturer(String manufacturer) {
		this.manufacturer = manufacturer;
	}

	public String getCategory() {
		return category;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	public long getUnitsInStock() {
		return unitsInStock;
	}

	public void setUnitsInStock(long unitsInStock) {
		this.unitsInStock = unitsInStock;
	}

	public String getCondition() {
		return condition;
	}

	public void setCondition(String condition) {
		this.condition = condition;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	@Override
	public String toString() {
		return "ProductVO [productId=" + productId + ", pname=" + pname + ", unitPrice=" + unitPrice + ", description="
				+ description + ", manufacturer=" + manufacturer + ", category=" + category + ", unitsInStock="
				+ unitsInStock + ", condition=" + condition + ", filename=" + filename + ", quantity=" + quantity + "]";
	}
	
	
}

 

dao 패키지

<ProductRepository.java>

 

package kr.or.ddit.dao;

import java.util.ArrayList;
import java.util.List;

import kr.or.ddit.vo.ProductVO;

public class ProductRepository {
	// 상품 목록 저장할 리스트 작성(전역변수)
	private List<ProductVO> listOfProducts = new ArrayList<ProductVO>();
	
	// 싱클톤 객체 : 메모리에 딱 한 번 생성(공유해서 사용하기 좋은)
	private static ProductRepository instance = new ProductRepository();
	public static  ProductRepository getInstance() {return instance;}
	
	// 기본 생성자. 3개의 상품 정보를 설정
	// 그런 후 ProductVO 객체 타입의 list인 listOfPfoducts 변수에 저장
	public ProductRepository() {
		//------------ 휴대폰 등록 시작-----------------
		//P1234 iphone 6s 800000
		ProductVO phone = new ProductVO("P1234","iPhone 6s", 800000);
		// 상품 설명
		phone.setDescription("4.7-inch, 1334x750 Renina HD display 8-megapixel iSight Camera");
		
		// 분류
		phone.setCategory("Smart Phone");
		// 제조사
		phone.setManufacturer("Apple");
		//재고 수
		phone.setUnitsInStock(1000);
		// 신상품 or 중고품 or 재생품
		phone.setCondition("New");
		//이미지 파일명
		phone.setFilename("P1234.jpg");
		//------------ 휴대폰 등록 끝-----------------
	
		//------------ 노트북 등록 시작-----------------
		// P1235 LG PC 그램 150000
		// 생성자(상품 아이디. 상품 명, 상품 가격 초기화)
		ProductVO notebook = new ProductVO("P1235","LG PC 그램",150000);
		
		  //상품 설명
	      notebook.setDescription("13.3-inch, IPS LED display, 5rd Generation"
	            + "Intel Core processors");
	      //분류
	      notebook.setCategory("Notebook");
	      //제조사
	      notebook.setManufacturer("LG");
	      //재고 수
	      notebook.setUnitsInStock(1000);
	      //신상품 or 중고품 or 재생품
	      notebook.setCondition("Refurbished");
	      //이미지 파일명
	      notebook.setFilename("P1235.jpg");
		//------------ 노트북 등록 끝-----------------
		//------------ 태블릿 등록 시작-----------------
		// P1236 Galaxy Tab s 900000
		ProductVO tablet = new ProductVO("P1236","Galaxy Tab S", 900000);
		  //상품 설명
	      tablet.setDescription("212.8*125.6*6.6m, Super AMOLED display, "
	            + "Octa-Core processor");
	      //분류
	      tablet.setCategory("Tablet");
	      //제조사
	      phone.setManufacturer("Samsung");
	      //재고 수
	      tablet.setUnitsInStock(1000);
	      //신상품 or 중고품 or 재생품
	      tablet.setCondition("Old");
	      //이미지 파일명
	      tablet.setFilename("P1236.jpg");
		//------------ 태블릿 등록 끝-----------------
	    // ProductVO 객체 타입의 List인 listOfProducts 변수에 저장 (List<ProductVO> listOfProducts)
	      listOfProducts.add(phone);
	      listOfProducts.add(notebook);
	      listOfProducts.add(tablet);
	};
	
	// ProductVO 객체 타입의 변수 listOfProducts 에 저장된 모든 상품 목록을 가져오자
	// 상품 목록
	public List<ProductVO> getAllProducts(){
		return listOfProducts;
	}
	
}

 


 

ERDin

- ER 다이어그램 모델링 프로그램

 

new 클릭

 

Logical/Physical (논리/물리)
스키마 구조 나타내기 (컬럼형,자료형,크기)
이렇게 나타난다
더블클릭하고 ORACLE 탭에서 자료형 수정

맥시멈

VARCHAR2(4000) 

NUMBER= 38자리

VO객체에 설정됨

PRODUCT_ID

PNAME

UNIT_PRICE

NOT NULL 이어야함. 

 

테이블 설정하기 (Database Connection) 클릭
Database Authentication으로 바꿔준다 ( 인증-로그인)
oracle 계정 아이디 비밀번호 입력
value = 로컬호스트

 

127.0.0.1:1521/xe

 

 

tool -Foward Engineer - Schema Generation
트리거 - 체크 전체 해제 후 스키마 구조 프리뷰를 볼 수 있다.


 

오라클 디벨로퍼를 킨 후 

 

테이블을 생성한다.

 

CREATE TABLE PRODUCT
(
   PRODUCT_ID            VARCHAR2(10)  NOT NULL ,
   PNAME                 VARCHAR2(90)  NOT NULL ,
   UNIT_PRICE            NUMBER  NOT NULL ,
   DESCRIPTION           VARCHAR2(1000)  NULL ,
   MANUFACTURER          VARCHAR2(90)  NULL ,
   CATEGORY              VARCHAR2(60)  NULL ,
   UNITS_IN_STOCK        NUMBER  NULL ,
   CONDITION             VARCHAR2(60)  NULL ,
   FILENAME              VARCHAR2(1000)  NULL ,
   QUANTITY              NUMBER  NULL,
    CONSTRAINT  PK_PRODUCT PRIMARY KEY (PRODUCT_ID)
);

 

데이터를 넣는다.

다시 돌아와서

 

<products.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page import="kr.or.ddit.dao.ProductRepository"%>
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%  // 스크립틀릿
	// ProductRespository() 생성자
	// 기본 생성자. 3개의 상품 정보를 가져옴
	// 그런 후 ProductVO 객체 타입의 listOfProducts 변수에 저장
	ProductRepository productDAO = ProductRepository.getInstance();
%>

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css"/>
<title>상품 목록</title>
</head>
<body>
	<!-- include 액션 태그 -->
	<jsp:include page="menu.jsp" />
	
	<!--  ------------ 상품 목록 시작 -------------  -->
	<div class="jumbotron">
		<!--  container : 이 안에 내용 있다. -->
		<div class="container">
			<h1 class="display-3"> 상품 목록</h1>
		</div>
	</div>
	
	<!--  ------------ 상품 목록 끝 -------------  -->
	<%  // 스크립틀릿
		List<ProductVO> listOfProducts = productDAO.getAllProducts();
	%>
	<!--  표현문 -->
	<c:set var="listOfProducts" value="<%=listOfProducts %>" />
	<!-- container : 이 안에 내용있다 -->
	<div class="container">
		<!-- 행 별 처리 -->
		<div class="row" align="center">
			<!-- 1칸씩 반복 -->
			<c:forEach var="productVO" items="${listOfProducts}">
			<div class="col-md-4">
				<img src="/images/${productVO.filename}" style="width : 100%;" alt="${productVO.pname}" title="${productVO.pname}" />
				<h3>${productVO.pname}</h3>
				<p>${productVO.description}</p>
				<p>${productVO.unitPrice}</p>
				<p><a href="product.jsp?id=${productVO.productId}" class="btn btn-secondary" role="button">상세정보&raquo;</a></p>
			</div>
			</c:forEach>
		</div>
		
	</div>
	
	<!-- footer -->
	<jsp:include page="footer.jsp" />
</body>
</html>

이렇게 작성해주면 상품목록을 구현할 수 있다.