반응형

 

사전 준비

 

 

 

  • 테이블 생성
--상품 정보
CREATE TABLE PRODUCT(
    PRODUCT_ID VARCHAR2(10),
    PNAME VARCHAR2(90),
    UNIT_PRICE NUMBER,
    DESCRIPTION VARCHAR2(3000),
    MANUFACTURER VARCHAR2(90),
    CATEGORY VARCHAR2(60),
    UNITS_IN_STOCK NUMBER,
    CONDITION VARCHAR2(60),
    FILENAME VARCHAR2(1000),
    QUANTITY NUMBER,
    CONSTRAINT PK_PRODUCT_ID PRIMARY KEY(PRODUCT_ID)
);

 

설명 기입

 

 

 

  • 편의성을 위해 진행
create or replace FUNCTION FN_GETCAMEL(COLUMN_NAME IN VARCHAR2)
RETURN VARCHAR2
IS
RSLT VARCHAR2(30);
BEGIN
--카멜표기로 변환(SITE_NUM -> siteNum)
SELECT LOWER(SUBSTR(REPLACE(INITCAP(COLUMN_NAME),'_'),1,1))
|| SUBSTR(REPLACE(INITCAP(COLUMN_NAME),'_'),2) INTO RSLT
FROM DUAL;
--리턴
RETURN RSLT;
END;

 

 

하단의 코드의 PC이름 부분 수정 필요. 속성에서 확인 후 이름 변경

 

--구글 카멜변환(https://heavenly-appear.tistory.com/270)
SELECT COLUMN_NAME
, DATA_TYPE
, CASE WHEN DATA_TYPE='NUMBER' THEN 'private int ' || FN_GETCAMEL(COLUMN_NAME) || ';'
WHEN DATA_TYPE IN('VARCHAR2','CHAR') THEN 'private String ' || FN_GETCAMEL(COLUMN_NAME) || ';'
WHEN DATA_TYPE='DATE' THEN 'private Date ' || FN_GETCAMEL(COLUMN_NAME) || ';'
ELSE 'private String ' || FN_GETCAMEL(COLUMN_NAME) || ';'
END AS CAMEL_CASE
, '<result property="'||FN_GETCAMEL(COLUMN_NAME)||'" column="'||COLUMN_NAME||'"/>' RESULTMAP
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'PRODUCT'
AND       USER = 'PC이름';

 

결과 화면1

 

 

아래 코드를 입력 시 생성된 후 이름, null 여부, 유형을 쉽게 볼 수 있음

 

desc product;

 

 

 

쇼핑몰 시스템

 

  • 자바빈 클래스가 되기 위한 조건

1. 프로퍼티(멤버변수, 필드)가 있어야 함

2. 기본 생성자(getter/setter 메소드)가 있어야 함

 

 

+기본 생성자 생성 단축키

더보기
1

 

1. Shift + Alt + S > Generate Constructors from Superclass 클릭 > 선택 후 진행

 

위의 방식대로

Getters and Setters 로 getter/setter를 생성할 수 있음

또한 Generate toString() 를 생성할 수 있음

 

 

 

  • VO 생성

ProductVO.java

package kr.or.ddit.vo;

// 자바빈 클래스 : 프로퍼티(멤버변수, 필드), 기본생성자, getter/setter메소드
public class ProductVO {
	// 프로퍼티
	private String productId;		// 상품 아이디
	private String pname;			// 상품 명
	private double unitPrice;		// 상품 가격
	private String description;		// 상품 설명
	private String manufacturer;	// 제조사
	private String category;		// 분류
	private double unitsInStock;	// 재고 수
	private String condition;		// 신상품 or 중고품 or 재생품
	private String filename;		// 이미지 파일명
	private int quantity;			// 상품을 장바구니에 담은 개수
	
	// 기본 생성자
	public ProductVO() {
	}

	// 생성자(상품 아이디, 상품 명, 상품 가격 초기화)
	public ProductVO(String productId, String pname, int unitPrice) {
		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 double getUnitsInStock() {
		return unitsInStock;
	}

	public void setUnitsInStock(double 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 + "]";
	}
}

 

 

DTO와 VO 차이

 

 

 

  • Dao 생성

ProdutRepository.java

package kr.or.ddit.dao;

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

import kr.or.ddit.vo.ProductVO;

public class ProdutRepository {
	// 싱글톤 패턴(공유, 객체가 1회 생성)
	private static ProdutRepository instance = new ProdutRepository();
	public static ProdutRepository getInstance() {return instance;}
	
	//상품 목록을 저장할 리스트 작성(전역변수)
	//인터페이스 : 팀장
	//구현클래스 : 팀원들
	private List<ProductVO> listOfProducts = new ArrayList<ProductVO>();
	
	// 기본 생성자, 3개의 상품 정보를 설정
	private ProdutRepository() {
		// 스마트폰
		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");
		//-------------------------------스마트폰 등록 끝--------------------------------
		
		//-------------------------------노트북 등록 시작--------------------------------
		ProductVO notebook = new ProductVO("P1235", "LG PC 그램", 1500000);
		
		//상품 설명
	    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");
		//-------------------------------노트북 등록 끝--------------------------------
	    
	    //-------------------------------태블릿 등록 시작--------------------------------
	    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");
	    //-------------------------------태블릿 등록 끝--------------------------------
	    
	    // VO들이 모여서 VO List가 됨
	    listOfProducts.add(phone);
	    listOfProducts.add(notebook);
	    listOfProducts.add(tablet);
	}
	
	// SELECT * FROM PRODUCT
	// 상품 목록
	public List<ProductVO> getAllProducts(){
		return listOfProducts;
	}
}

 

 

vo 객체 접근 방법

 

 

+ Colletion 종류

 

 

 

  • jsp 생성
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="kr.or.ddit.dao.ProductRepository"%>
<%	//스크립틀릿
	//ProductRepository() 생성자
	//기본 생성자. 3개의 상품 정보를 설정. 
	//그런 후  Product 객체 타입의 List인 listOfProducts 변수에 저장 
	//ProductRepository productDAO = new ProductRepository();
	ProductRepository productDAO = ProductRepository.getInstance();
	
	// ProductVO 제네릭 List 타입의 객체로 모든 상품 목록을 할당함
	List<ProductVO> productVOList = productDAO.getAllProducts();
	out.print("<p>productVOList : " + productVOList + "</p>");
%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>

</body>
</html>

 

결과 화면2

 

 

+ 사용한 파일과 코드

더보기
down.zip
0.77MB

 

js와 css 파일을 따로 WebContent 안에 넣음

 

 

head와 title 사이에 아래 코드 추가

<!-- <link rel="stylesheet" -->
<!--    href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> -->
<link rel="stylesheet" href="/css/bootstrap.min.css" />

 

 

menu.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<nav class="navbar navbar-expand navbar-dart bg-dark">
	<div class="container">
		<div class="navbar-header">
			<!-- 요청 URL : /welcome.jsp -->
			<a class="navbar-brand" href="welcome.jsp">Home</a>
		</div>
	</div>
</nav>

 

 

footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<footer class="container">
	<p>&copy;WebMarket</p>
</footer>

 

 

products.jsp

<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="kr.or.ddit.dao.ProductRepository"%>
<%	//스크립틀릿
	//ProductRepository() 생성자
	//기본 생성자. 3개의 상품 정보를 설정. 
	//그런 후  Product 객체 타입의 List인 listOfProducts 변수에 저장 
	//ProductRepository productDAO = new ProductRepository();
	ProductRepository productDAO = ProductRepository.getInstance();
	
	// ProductVO 제네릭 List 타입의 객체로 모든 상품 목록을 할당함
	List<ProductVO> productVOList = productDAO.getAllProducts();
	//out.print("<p>productVOList : " + productVOList + "</p>");
%>
<!DOCTYPE html>
<html>
<head>
<!-- <link rel="stylesheet" -->
<!--    href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> -->
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<title></title>
</head>
<body>
	<!-- include 액션 태그 -->
	<jsp:include page="menu.jsp" />
	
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">상품 목록</h1>
		</div>
	</div>
	
	<!-- 상품목록 출력 -->
	<div class="container">
		<div class="row" align="center">
			<%
				//productVOList : ProductVO타입 리스트 변수
				for(ProductVO productVO : productVOList) {
			%>
			<div class="col-md-4"> <!-- 33% 정도의 영역 -->
				<!-- /images/P1234.jpg -->
				<img src="/images/<%=productVO.getFilename()%>" 
					style="width:100%;" alt="<%=productVO.getPname()%>" title="<%=productVO.getPname()%>"/>
				<h3><%=productVO.getPname()%></h3>
				<p><%=productVO.getDescription()%></p>
				<p><%=productVO.getUnitPrice()%></p>
			</div>
			<%
				}
			%>
		</div>
	</div>
	
	<jsp:include page="footer.jsp" />
</body>
</html>

 

결과 화면3

 

 

 

  • => JSTL 로 변경
<%@page import="kr.or.ddit.vo.ProductVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="kr.or.ddit.dao.ProductRepository"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 페이지 디렉티브 -->  
<%	//스크립틀릿
	ProductRepository productDAO = ProductRepository.getInstance();
	
	List<ProductVO> productVOList = productDAO.getAllProducts();
%>
<!-- java 객체 -> JSTL 변수 -->
<c:set var="productVOList" value="<%=productVOList%>" />
<!DOCTYPE html>
<html>
<head>
<!-- <link rel="stylesheet" -->
<!--    href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> -->
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<title></title>
</head>
<body>
	<!-- include 액션 태그 -->
	<jsp:include page="menu.jsp" />
	
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">상품 목록</h1>
		</div>
	</div>
	
	<!-- 상품목록 출력 -->
	<div class="container">
		<div class="row" align="center">
			<c:forEach var="productVO" items="${productVOList}" varStatus="stat">
			<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>
			</div>
			</c:forEach>
		</div>
	</div>
	
	<jsp:include page="footer.jsp" />
</body>
</html>

 

 

반응형

'스프링' 카테고리의 다른 글

[스프링] 7장 내장 객체, request 객체  (0) 2024.04.01
[스프링] 6.5장 과제  (0) 2024.04.01
[스프링] 5장 디렉티브  (0) 2024.03.28
[스프링] 4.5장 과제  (0) 2024.03.28
[스프링] 4장 선언문, 표현문  (0) 2024.03.27