ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JSP] p543
    JSP 2021. 8. 4. 18:27

     

     

     

     

     

    product table 생성

     

     

     

     

     

     

    ProductVO.java

     

    상품 테이블의 정보를 자바에서 얻어오기 전에 상품 정보를 저장할 공간 만들기

     

    package com.woori.dto;
    
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    
    public class ProductVO {
    	private Integer code;
    	private String name;
    	private Integer price;
    	private String description;
    	private String pictureUrl;
    }

     

     

     

    context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    	<Resource name="jdbc/OracleDB"
    		auth = "Container"
    		type = "javax.sql.DataSource"
    		username="scott"
    		password="TIGER"
    		driverClassName="oracle.jdbc.driver.OracleDriver"
    		factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
    		url="jdbc:oracle:thin:@localhost:1521:XE"
    		maxActive="500"
    		maxIdle="100"
    	/>
    </Context>

     

     

    css\shopping.css

    css 작성

    @charset "EUC-KR";
    #wrap {
    	width: 971px; /* 1024*768로 해상도를 맞추어서 설계 */
    	/* 가운데 정렬을 위한 바깥쪽 여백 설정 */
    	margin: 0;
    	margin-left: auto;
    	margin-right: auto;
    }
    
    h1 {
    	color: green; /* 글 색상 */
    }
    
    table {
    	width: 100%;
    	border-collapse: collapse;
    	font-size: 12px; /* 글꼴 크기 */
    	line-height: 24px; /* 줄 간격 */
    }
    
    table td,th {
    	border: #d3d3d3 solid 1px; /* 경계선 색상 스타일 굵기 */
    	padding: 5px; /* 안쪽 여백 */
    }
    
    th {
    	background: yellowgreen; /* 배경색 */
    }
    
    img {
    	width: 220px; /* 이미지 너비(가로) */
    	height: 300px; /* 이미지 높이(세로) */
    }
    
    a {
    	text-decoration: none; /* 링크 밑줄 없애기 */
    	color: black; /* 글 색상 */
    }
    
    a:HOVER {
    	text-decoration: underline; /* 밑줄 */
    	color: green; /* 글 색상 */
    }

     

    util\DBManager.java

    DAO 클래스를 설계하지 너에 DB 에 접근하여 Connection 객체를 얻어와야한다.

    오라클에 접속을 요청해서 성공해야한다.

    공통된 내용이어서 코드를 재활용 할 수 있도록 클래스로 분리해놓자. 

    (객체 사용 후 해제하는 코드도 작성할건데, 동일한 코드가 중복되므로 static 메소드로 선언한 후 호출해서 사용한다.)

     

    package util;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    public class DBManager {
    
    		public static Connection getConnection() {
    			Connection conn = null;
    			Context initContext;
    			try {
    				initContext = new InitialContext();
    				DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/OracleDB");
    				conn = ds.getConnection();
    			}catch(Exception e) {
    				e.printStackTrace();
    			}
    			return conn;
    		}
    		
    		//select 을 수행한 후 리소스 해제를 위한 메소드 (rs 객체 사용할 때)
    		public static void close(Connection conn, Statement stmt, ResultSet rs) {
    			try {
    				rs.close();
    				stmt.close();
    				conn.close();
    			}catch(Exception e) {
    				e.printStackTrace();
    			}
    		}
    	
    		//insert , update , delete 작업을 수행한 후 리소스 해제를 위한 메소드 (rs 객체 사용 안할 때)
    		public static void close(Connection conn, Statement stmt) {
    			try {
    				stmt.close();
    				conn.close();
    			}catch(Exception e) {
    				e.printStackTrace();
    			}
    		}
    
    }

     

     

    ProductDAO.java

    상품 테이블인 product 에 연동하기 위한 DAO 클래스 작성

    DAO는 추가 조회 수정 삭제 4가지 작업을 하는데 이를 CRUD (create read update delete) 라고 한다.

     

    package com.woori.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.woori.dto.ProductVO;
    
    import util.DBManager;
    
    public class ProductDAO {
    
    	private ProductDAO() { //**private 
    	}
    
    	private static ProductDAO instance = new ProductDAO(); //자기 자신이 자기 자신을 만든다.
    	
    	public static ProductDAO getInstance() { //private 한 instance를 외부에서 사용하기 위해 필요하다.
    		return instance;
    	}
    	
    	//c Read u d
    	public List<ProductVO> selectAllProducts(){
    		//최근에 등록한 상품 먼저 출력하기
    		
    		String sql = "select * from product order by code desc";
    		List<ProductVO> list = new ArrayList<ProductVO>();
    		
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try {
    			//쿼리문 실행 전 Connection 객체를 얻기 위해 DBManager 클래스의 정적 메소드인 getConnection 호출
    			conn = DBManager.getConnection();
    			pstmt = conn.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			while(rs.next()) {
    				ProductVO pVo = new ProductVO();
    				//ResultSet 객체로 code 컬럼 값을 얻어와서, 컬럼 값을 ProductVO 객체의 code 필드에 저장하기 위해 setCode() 메소드 호출
    				pVo.setCode(rs.getInt("code"));
    				pVo.setName(rs.getString("name"));
    				pVo.setPrice(rs.getInt("price"));
    				pVo.setPictureUrl(rs.getString("pictureUrl"));
    				pVo.setDescription(rs.getString("description"));
    				
    				//ㅁrrayList 객체에 ProductVO 객체를 추가하기
    				list.add(pVo);
    			}//the end while
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			//사용이 끝난 객체를 해제하기 위해 DBManager 클래스의 정적 메소드인 close() 호출
    			DBManager.close(conn, pstmt,rs);
    		}
    		//selectAllProducts() 를 호출하면 product 테이블의 모든 정보를 ArrayList 객체를 통해 얻을 수 있다.
    		return list;
    	}
    }

     

     

    ProductListServlet.java 

    productList.do 라는 요청을 받으면 상품 리스트 화면을 표시하기 위한 서블릿 클래스 만들기

    get방식으로 요청이 들어올 것이다.

     

     

    productWrite.jsp

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <link rel="stylesheet" type="text/css" href="css/shopping.css">
    </head>
    <body>
    <div id="wrap" align="center">
    	<h1>상품리스트 - 관리자페이지</h1>
    		<table class="list">
    			<tr>
    				<td colspan="5" style="border:white; text-align:right">
    					<a href = "productWrite.do">상품등록</a>
    				</td>
    			</tr>
    				
    			<tr>
    				<th>번호</th><th>이름</th><th>가격</th><th>수정</th><th>삭제</th>
    			</tr>
    				
    			<c:forEach var="product" items="${productList}">
    				<tr class = "record">
    					<td>${product.code}</td>
    					<td>${product.name}</td>
    					<td>${product.price}</td>
    					<td>
    						<a href="productUpdate.do?code=${product.code}">상품수정</a>
    					</td>
    					<td>
    						<a href = "productDelete.do?code=${product.code}">상품삭제</a>
    					</td>
    				</tr>
    			</c:forEach>
    		</table>
    </div>
    </body>
    </html>

     

     

     

    ProductWriteServlet.java (/productWrite.do)

    화면에 출력하기 위한 정보 생성

    요청이 들어오면 요청을 필요로하는 jsp을 처리(화면요청) 보텅 doget

    요청되 ㄴ파일을 받아서 파일을 처리 보통 dopost

     

    package com.woori.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/productWrite.do")
    public class ProductWriteServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
         
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		RequestDispatcher dispatcher = request.getRequestDispatcher("product/productWrite.jsp");
    		dispatcher.forward(request, response);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    	}
    
    }

     

     

    productWrite.jsp

     

    상품 등록을 위한 페이지

    register 버튼을 누르면 post 방식으로 요청이 일어난다.

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <link rel="stylesheet" type="text/css" href="css/shopping.css">
    <script type="text/javascript" src="script/product.js"></script>
    <style>
    	table {
        	width: 100%;
       		border: 1px solid #444444;
       		border-collapse: collapse;
    	}
    	td {
        	border: 1px solid #444444;
        	padding:5px;
      	}
    </style>
    </head>
    <body>
    <div id="wrap" align="center">
    	<h1>register a product - manager page</h1>
    	<form method="post" enctype="multipart/form-data" name="frm">
    		<table>
    			<tr>
    				<td>name</td>
    				<td><input type="text" name="name" size="80"></td>
    			</tr>
    			<tr>
    				<td>price</td>
    				<td><input type="text" name="price">원</td>
    			</tr>
    			<tr>
    				<td>picture</td>
    				<td><input type="file" name="pictureUrl"><br>
    				(only use when changing picture)</td>
    			</tr>
    			<tr>
    				<td>describe</td>
    				<td><textarea cols="80" rows="10" name="description"></textarea></td>
    			</tr>
    		</table>
    		<br>
    		<input type="submit" value="register" onclick="return productCheck()">
    		<input type="reset" value="reset">
    		<input type="button" value="list" onclick="location href='productList.do'">
    	</form>
    
    </div>
    </body>
    </html>

     

     

     

    productDAO.java

     

    상품정보를 추가하는 insertProduct() 메소드를 추가하자.

     

    package com.woori.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.woori.dto.ProductVO;
    
    import util.DBManager;
    
    public class ProductDAO {
    	private ProductDAO() { 
    	}
    	private static ProductDAO instance = new ProductDAO(); 	
    	public static ProductDAO getInstance() { 
    		return instance;
    	}
        
    	public List<ProductVO> selectAllProducts(){
    		String sql = "select * from product order by code desc";
    		List<ProductVO> list = new ArrayList<ProductVO>();
    		
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try {
    			conn = DBManager.getConnection();
    			pstmt = conn.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			while(rs.next()) {
    				ProductVO pVo = new ProductVO();
    				pVo.setCode(rs.getInt("code"));
    				pVo.setName(rs.getString("name"));
    				pVo.setPrice(rs.getInt("price"));
    				pVo.setPrctureurl(rs.getString("prctureurl"));
    				pVo.setDescription(rs.getString("description"));
    				
    				list.add(pVo);
    			}//the end while
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			DBManager.close(conn, pstmt,rs);
    		}
    		return list;
    	}
    	
    	
    	//create r u d
    	public void insertProduct(ProductVO pVo) { 
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		
    		String sql = "insert into product values(product_seq.nextval,?,?,?,?";
    		
    		try {
    			conn = DBManager.getConnection(); //connection 객체 얻기
    			pstmt = conn.prepareStatement(sql); //쿼리문 실행을 위해 statement 객체 필요. connection 객체로부터 statement 객체 얻어오기.
    			
    			pstmt.setString(1,pVo.getName());
    			pstmt.setInt(2, pVo.getPrice());
    			pstmt.setString(3, pVo.getPrctureurl());
    			pstmt.setString(4, pVo.getDescription());
    			pstmt.executeUpdate();
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			DBManager.close(conn,pstmt);
    		}
    		
    	}
    }

     

     

    ProductWriteServlet.java

     

    상품 정보를 DB에 저장하는 작업을 doPost()메소드에 작성하자.

     

    package com.woori.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.oreilly.servlet.MultipartRequest;
    import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
    import com.woori.dao.ProductDAO;
    import com.woori.dto.ProductVO;
    
    @WebServlet("/productWrite.do")
    public class ProductWriteServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
         
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		RequestDispatcher dispatcher = request.getRequestDispatcher("product/productWrite.jsp");
    		dispatcher.forward(request, response);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		
    		//업로드 할 파일 경로를 서버상의 실제 경로로 찾아오기
    		ServletContext context = getServletContext();
    		String path = context.getRealPath("upload");
    		
    		String encType = "UTF-8";
    		int sizeLimit = 20*1024*1024;
    		
    		MultipartRequest multi = new MultipartRequest(request, path, sizeLimit, encType, new DefaultFileRenamePolicy());
    		
    		String name = multi.getParameter("name");
    		int price = Integer.parseInt(multi.getParameter("price"));
    		String description = multi.getParameter("description");
    		String prctureurl = multi.getFilesystemName("prctureurl");
    		
    		ProductVO pVo = new ProductVO();
    		pVo.setName(name);
    		pVo.setPrice(price);
    		pVo.setDescription(description);
    		pVo.setPrctureurl(prctureurl);
    		
    		ProductDAO pDao = ProductDAO.getInstance();
    		pDao.insertProduct(pVo);
    		
    		response.sendRedirect("productList.do");
    	}
    
    }

     

     

     

    script\product.js

    productCheck() 메소드 입력

     

     

    ProductDAO.java

    상품 수정하기

    productList.jsp 에서 <a href="productUpdate.do?code=${product.code}">상품수정</a> 를 넣어놨다.

    이전에 입력되었던 상품 정보가 출력되어야 하기 때문에 현재 선택된 상품의 정보를 DB에서 찾아오기 위해서 상품 코드 값을 매개 변수로 넘겨준다. 그리고 페이지를 넘겨준다.

    일단 DB 상품 정보를 얻어오는 작업을 해야하는데, 이를 위해 상품 정보를 얻어오는 메소드를 DAO 클래스에 추가한다.

     

    package com.woori.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.woori.dto.ProductVO;
    
    import util.DBManager;
    
    public class ProductDAO {
    
    	private ProductDAO() { //**private 
    	}
    
    	private static ProductDAO instance = new ProductDAO();
    	
    	public static ProductDAO getInstance() { 
    		return instance;
    	}
    	
    	//c Read u d
    	public List<ProductVO> selectAllProducts(){
    		
    		String sql = "select * from product order by code desc";
    		List<ProductVO> list = new ArrayList<ProductVO>();
    		
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try {
    			conn = DBManager.getConnection();
    			pstmt = conn.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			while(rs.next()) {
    				ProductVO pVo = new ProductVO();
    				pVo.setCode(rs.getInt("code"));
    				pVo.setName(rs.getString("name"));
    				pVo.setPrice(rs.getInt("price"));
    				pVo.setPrctureurl(rs.getString("prctureurl"));
    				pVo.setDescription(rs.getString("description"));
    				
    				list.add(pVo);
    			}//the end while
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			DBManager.close(conn, pstmt,rs);
    		}
    		return list;
    	}
    	
    	
    	//create r u d
    	public void insertProduct(ProductVO pVo) { 
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		
    		String sql = "insert into product values(product_seq.nextval,?,?,?,?)";
    		
    		try {
    			conn = DBManager.getConnection(); 
    			pstmt = conn.prepareStatement(sql);
    			
    			pstmt.setString(1,pVo.getName());
    			pstmt.setInt(2, pVo.getPrice());
    			pstmt.setString(3, pVo.getPrctureurl());
    			pstmt.setString(4, pVo.getDescription());
    			pstmt.executeUpdate();
    		}catch(Exception e) {
    			e.printStackTrace();
    		}finally {
    			DBManager.close(conn,pstmt);
    		}
    		
    	}
    	
    	
    	//c Read u d
    	public ProductVO selectProductByCode(String code) {
    		String sql = "select * from product where code=?";
    		
    		ProductVO pVo = null;
    		
    		try {
    			Connection conn = null;
    			PreparedStatement pstmt = null;
    			ResultSet rs = null;
    			
    			try {
    				conn = DBManager.getConnection();
    				pstmt = conn.prepareStatement(sql);
    				pstmt.setString(1, code);
    				rs = pstmt.executeQuery();
    				
    				if(rs.next()) {
    					pVo = new ProductVO();
    					pVo.setCode(rs.getInt("code"));
    					pVo.setName(rs.getString("name"));
    					pVo.setDescription(rs.getString("description"));
    					pVo.setPrctureurl(rs.getString("prctureurl"));
    					pVo.setPrice(rs.getInt("price"));
    				}
    			}catch(Exception e) {
    				e.printStackTrace();
    			}finally {
    				DBManager.close(conn, pstmt, rs);
    			}
    			
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    		return pVo;
    	}
    }

     

     

     

    productUpdateServlet.java

    상품정보를 얻어오기 위한 selectProductByCode() 메소드를 사용하여 얻어온 상품 정보를 화면에 출력하는 서블릿 클래스의 doGet 메소드에 작성하자.

     

    package com.woori.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.woori.dao.ProductDAO;
    import com.woori.dto.ProductVO;
    
    @WebServlet("/productUpdate.do")
    public class ProductUpdateServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
       
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String code = request.getParameter("code");
    		
    		ProductDAO pDao = ProductDAO.getInstance();
    		ProductVO pVo = pDao.selectProductByCode(code);
    		
            //DB에서 얻어온 상품 정보를 request 속성 값으로 저장한다.
    		request.setAttribute("product", pVo);
    		RequestDispatcher dispatcher = request.getRequestDispatcher("product/productUpdate.jsp");
    		dispatcher.forward(request, response);
    		
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    	}
    
    }

     

     

     

     

    productUpdate.jsp

    이미 등록된 상품의 정보를 변경하기 위한 폼을 작성하자.

    update.do 에 넘어가는데 

    db에 있는 어떤 정보들을 수정해야하나, 판단하기 위해

    수정폼을 눌렀을 때 현재 내용을 수정하기 위해서 테이블에 있는 정보 중 어떤 정보를 수정해야하나

    code를 통해 확인할 수 있도록 hidden 타입으로 code를 name으로 넘겨서

    서블릿으로 넘겨서 수정하는데에 사용한다.

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <link rel="stylesheet" type="text/css" href="css/shopping.css">
    <script type="text/javascript" src="script/product.js"></script>
    </head>
    <body>
    <div id="wrap" align="center">
    	<h1>modify the product</h1>
    	<form method="post" enctype="multipart/form-data" name="frm">
    		<input type="hidden" name="code" value="${product.code}">
    		<input type="hidden" name="nonmakeImg" value="${product.prctureurl}">
    		<table>
    			<tr>
    				<td>
    					<c:choose>
    						<c:when test="${empty product.prctureurl}">
    							<img src = "upload/noimage.gif">
    						</c:when>
    						<c:otherwise>
    							<img src="upload/${product.prctureurl}">
    						</c:otherwise>
    					</c:choose>
    				</td>
    				<td>
    					<table>
    						<tr>
    							<th style="width:80px"> product name </th>
    							<td>
    								<input type="text" name="name" value="${product.name}" size="80">
    							</td>
    						</tr>
    						<tr>
    							<th>price</th>
    							<td><input type="text" name="price" value="${product.price}">원</td>
    						</tr>
    						<tr>
    							<th>picture</th>
    							<td><input type="file" name="prctureurl"><br>
    							(if you want to change the picture, select this.)</td>
    						</tr>
    						<tr>
    							<th>description</th>
    							<td><textarea cols="90" rows="10" name="description">${product.description}</textarea></td>
    						</tr>
    					</table>
    					<br>
    					<input type="submit" value="modify" onclick="return productCheck()">
    					<input type="reset" value="reset">
    					<input type="button" value="list" onclick="locationi.href='productList.do'">
    				</td>
    			</tr>
    		</table>
    	</form>
    </div>
    </body>
    </html>

     

     

    728x90

    'JSP' 카테고리의 다른 글

    [JSP]p543 2  (0) 2021.08.05
    [JSP] 파일 업로드  (0) 2021.08.03
    [JSP] login 2-3  (0) 2021.08.03
    [JSP] login2-2  (0) 2021.08.02
    [JSP] login2-1  (0) 2021.07.29
Designed by Tistory.