JAVA, JSP

java, jsp - 상품목록, 상품상세페이지 구현

suji0730 2024. 8. 9. 15:52
*분석할 때 순서!
무조건
controller -> serviceImpl -> db연결관련클래스(DAO) -> serviceImpl -> controller -> jsp


기존에 JSP파일 하나로 관리 되었던 DB연결 및 쿼리 실행 부분을 분할 하는 작업
1. DB 커넥션 메소드
2. 쿼리 실행 메소드
Controller > impl(기능 클래스)
> getList()메소드 호출함과 동시에
1. DB 연결 connDB() = CustomCon.java
2. 쿼리조합
3. 조합된 쿼리문을 runQuery() = CustomCon.java메소드를 통해 실행 및 결과를 받아온다.
getList() 일일히 db커넥션에관련된 문법을 다 넣는게 아닌 공통 영역으로 쿼리실행 및 연결부분에 대한 코드 작성을 해서
insertList()
getList()
updateList()
등

1. /product?pageType=list 요청시 상품 목록 페이지로 이동하게 코드작성
2. product 패키지 생성
2. product.service 패키지 생성
3. product > ProductController(핸들러 역할) 생성
3. product > ProductDTO 생성
4. product.service > ProductServiceImpl(기능 역할) 생성
5. ProductController에서 ProductServiceImpl에 getList()메소드 호출

getList() 내용 및 순서
1. ArrayList<ProductDTO> 배열 생성
참고 : <ProductDTO> = ProductDTO클래스 타입으로 된 ArrayList(배열) 생성
일반 배열하고의 차이점은 동적으로 길이를 늘리거나 줄일 수 있다.
2. 쿼리 실행 결과를 담을 ResultSet 클래스 변수 생성
3. 실행할 쿼리 문장을 조합 후 변수에 할당
4. CustomCon 클래스에 runQuery() 메소드 호출시 입력한 쿼리문을 넣고 호출
5. ResultSet 변수에 실행결과를 할당
6. 반복문을 통해 ProductDTO 객체에 데이터 할당
7. ProductDTO(데이터 셋팅된) 객체를 ArrayList<ProductDTO>에 추가
참고 : 총 10번의 반복문이 돈다면 10개의 리스트가 추가됨
[ProductDTO, ProductDTO, ProductDTO, ProductDTO, ProductDTO, ProductDTO ...]
8. getList() 리턴타입에 맞게 Controller로 데이터 리턴
9. Controller에서 jsp로 데이터 리턴

 

 

1. 상품목록

 

index.jsp

<li><a href="/product?pageType=list">상품</a></li>

 

ProductController.java

package product;

import java.io.IOException;
import java.util.ArrayList;
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 product.service.ProductServiceImpl;

@WebServlet("/product")
public class ProductController extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	String pageType = request.getParameter("pageType");
    	
        if(pageType.equals("list")) {
        	productMove(request, response);
        } 
    }

	private void productMove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//기능구현 클래스
		ProductServiceImpl productServiceImpl = new ProductServiceImpl();
		
		//getList메서드 호출, 제품리스트 가져옴
		ArrayList<ProductDTO> productList = productServiceImpl.getList();	//Product는 실제 제품 객체의 클래스
		
		//요청 속성에 제품 리스트 설정
		request.setAttribute("productList", productList);
		
		//요청하는 쪽에 데이터를 보낼 땐 forward를 사용해야 함
		if(productList != null) {
			request.getRequestDispatcher("/views/product_list.jsp").forward(request, response);
		}else {
			response.sendRedirect("/index.jsp");
		}
	}
}

 

ProductServiceImpl.java

package product.service;

import java.net.http.HttpRequest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import common.CustomCon;
import login.StatusDTO;
import login.UserDTO;
import product.ProductDTO;

public class ProductServiceImpl {
	
	public ArrayList<ProductDTO> getList(){
		
		//db관련 클래스
		CustomCon cusCon = new CustomCon();
		
		//쿼리실행 결과를 배열로 보낼 컬렉션프레임워크
		ArrayList<ProductDTO> productList = new ArrayList<ProductDTO>();
		
		//쿼리를 실행 후 결과를 저장하는 객체 ResultSet
		ResultSet resultSet = null;
	
		try {
			//쿼리문장 조합
            String query = "select * from tb_product";
            
            //db관련 클래스에서 runQuery()메서드 호출
            resultSet = cusCon.runQuery(query);
            
            //resultSet객체에 10개의 데이터 결과가 있으니 10번 반복문 수행 종료
            while(resultSet.next()) {
            	//결과 세트에서 한 행씩 처리
            	ProductDTO productDTO = new ProductDTO();
            	productDTO.setProductName(resultSet.getString("p_name"));
            	productDTO.setProductPrice(resultSet.getString("p_price"));
            	productDTO.setProductDate(resultSet.getString("p_date"));
            	productDTO.setProductDescription(resultSet.getString("p_desc"));
            	productList.add(productDTO);
            }
            System.out.println(productList);
            
        } catch(Exception e) {
            System.out.println("연결 오류 발생!");
            e.printStackTrace();
        }finally {
        	try {
        		resultSet.close();
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }
        return productList;
    }
}

 

CustomCon.java

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class CustomCon {
	
	// DB 연결 담당 메소드
	public Connection connDB() {
		Connection con = null;
	    try {
	        Class.forName("com.mysql.jdbc.Driver");
	        String url = "jdbc:mysql://localhost:3306/jgh_ksmart52db?useUnicode=true&characterEncoding=euckr";
	        String user = "root";
	        String pwd = "admin1234";
	        con = DriverManager.getConnection(url, user, pwd);
	        if(con != null) {
	            System.out.println("연결 성공");
	        }
	    } catch(Exception e) {
	        System.out.println("연결 오류 발생!");
	        e.printStackTrace();
	    }
	    return con;
	    
		}
	
	//입력받은 쿼리 실행 메소드
	public ResultSet runQuery(String query) {
		//sql 쿼리를 미리 컴파일하고, 파라미터를 설정할 수 있는 객체
    	PreparedStatement preparedStatement = null;
    	
    	//쿼리를 실행 후 결과를 저장하는 객체 ResultSet
		ResultSet resultSet = null;
		
		//db연결 성공 시 db객체를 받기 위해 Connection 클래스변수 생성
		Connection con = null;
		try {
			//connDB() 메서드를 호출하여 DB연동
			con = connDB();
			//준비된 SQL쿼리를 실행하는데 사용
			preparedStatement = con.prepareStatement(query);
			
			//쿼리실행결과를 반환, 우선적으로는 resultSet타입의 객체에 담아야함
			resultSet = preparedStatement.executeQuery(query);
			return resultSet;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			
		}
		return resultSet;
	}
}

 

ProductDTO.java

package product;

public class ProductDTO {
	/*
	pageType = 페이지 종류
	productName = 상품명
	productPrice = 상품가격
	productDate = 상품등록일
	productCnt = 상품재고
	productDescription = 상품설명
 */
	private String pageType;
	private String productName;
	private String productPrice;
	private String productDate;
	private String productCnt;
	private String productDescription;
	
	public String getPageType() {
		return pageType;
	}
	public void setPageType(String pageType) {
		this.pageType = pageType;
	}
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public String getProductPrice() {
		return productPrice;
	}
	public void setProductPrice(String productPrice) {
		this.productPrice = productPrice;
	}
	public String getProductDate() {
		return productDate;
	}
	public void setProductDate(String productDate) {
		this.productDate = productDate;
	}
	public String getProductCnt() {
		return productCnt;
	}
	public void setProductCnt(String productCnt) {
		this.productCnt = productCnt;
	}
	public String getProductDescription() {
		return productDescription;
	}
	public void setProductDescription(String productDescription) {
		this.productDescription = productDescription;
	}
	@Override
	public String toString() {
		return "ProductDTO [pageType=" + pageType + ", productName=" + productName + ", productPrice=" + productPrice
				+ ", productDate=" + productDate + ", productCnt=" + productCnt + ", productDescription="
				+ productDescription + "]";
	}
}

 

 

product_list.jsp

<h3>상품목록</h3>
    <table border="1" cellspacing="0" width="50%">
        <tr>
            <td>상품명</td>
            <td>상품가격</td>
            <td>상품설명</td>
            <td>상품등록일</td>
        </tr>
<%
ArrayList<ProductDTO> productList = (ArrayList<ProductDTO>) request.getAttribute("productList");

if(productList != null){
    for(ProductDTO product : productList){
%>
<tr>
    <td><%= product.getProductName() %></td>
    <td><%= product.getProductPrice() %></td>
    <td><%= product.getProductDescription() %></td>
    <td><%= product.getProductDate() %></td>
</tr>
<%
    }
} else{
%>
<tr>
    <td colspan="5">등록된 데이터가 없습니다.</td>
</tr>
<%		
}
%>
</table>

 

 

2. 상품목록페이지에서 상품상세페이지

 

ProductController.java

package product;

import java.io.IOException;
import java.util.ArrayList;

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 product.service.ProductServiceImpl;


@WebServlet("/product")
public class ProductController extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	String pageType = request.getParameter("pageType");
    	
        if(pageType.equals("list")) {
        	productMove(request, response);
        } else if(pageType.equals("detail")) {
        	String idx = request.getParameter("idx");
        	productDetailMove(request, response, idx);
        } 
    }

	private void productMove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//기능구현 클래스
		ProductServiceImpl productServiceImpl = new ProductServiceImpl();
		
		//getList메서드 호출, 제품리스트 가져옴
		ArrayList<ProductDTO> productList = productServiceImpl.getList();	//Product는 실제 제품 객체의 클래스
		
		//요청 속성에 제품 리스트 설정
		request.setAttribute("productList", productList);
		
		//요청하는 쪽에 데이터를 보낼 땐 forward를 사용해야 함
		if(productList != null) {
			request.getRequestDispatcher("/views/product_list.jsp").forward(request, response);
		}else {
			response.sendRedirect("/index.jsp");
		}
	}
	
	private void productDetailMove(HttpServletRequest request, HttpServletResponse response, String idx) throws ServletException, IOException {
		
		//기능구현 클래스
		ProductServiceImpl productServiceImpl = new ProductServiceImpl();
		
		//getList메서드 호출, 제품리스트 가져옴
		ArrayList<ProductDTO> productList = productServiceImpl.getDetail(idx);	//Product는 실제 제품 객체의 클래스
		
		//요청 속성에 제품 리스트 설정
		request.setAttribute("productList", productList);
		
		//요청하는 쪽에 데이터를 보낼 땐 forward를 사용해야 함
		if(productList != null) {
			request.getRequestDispatcher("/views/product_list.jsp").forward(request, response);
		}else {
			response.sendRedirect("/index.jsp");
		}
	}
}

 

ProductServiceImpl.java

package product.service;

import java.net.http.HttpRequest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import common.CustomCon;
import login.StatusDTO;
import login.UserDTO;
import product.ProductDTO;

public class ProductServiceImpl {
	
	public ArrayList<ProductDTO> getList(){
		
		//db관련 클래스
		CustomCon cusCon = new CustomCon();
		
		//쿼리실행 결과를 배열로 보낼 컬렉션프레임워크
		ArrayList<ProductDTO> productList = new ArrayList<ProductDTO>();
		
		//쿼리를 실행 후 결과를 저장하는 객체 ResultSet
		ResultSet resultSet = null;
	
		try {
			//쿼리문장 조합
            String query = "select * from tb_product";
            
            //db관련 클래스에서 runQuery()메서드 호출
            resultSet = cusCon.runQuery(query);
            
            //resultSet객체에 10개의 데이터 결과가 있으니 10번 반복문 수행 종료
            while(resultSet.next()) {
            	//결과 세트에서 한 행씩 처리
            	ProductDTO productDTO = new ProductDTO();
            	productDTO.setIdx(resultSet.getString("idx")); //detail
            	productDTO.setProductName(resultSet.getString("p_name"));
            	productDTO.setProductPrice(resultSet.getString("p_price"));
            	productDTO.setProductDate(resultSet.getString("p_date"));
            	productDTO.setProductDescription(resultSet.getString("p_desc"));
            	productList.add(productDTO);
            }
            System.out.println(productList);
            
        } catch(Exception e) {
            System.out.println("연결 오류 발생!");
            e.printStackTrace();
        }finally {
        	try {
        		resultSet.close();
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }
        return productList;
    }

	public ArrayList<ProductDTO> getDetail(String idx){
		//db관련 클래스
		CustomCon cusCon = new CustomCon();
		
		//쿼리실행 결과를 배열로 보낼 컬렉션프레임워크
		ArrayList<ProductDTO> productList = new ArrayList<ProductDTO>();
		
		//쿼리를 실행 후 결과를 저장하는 객체 ResultSet
		ResultSet resultSet = null;
	
		try {
			//쿼리문장 조합
            String query = "select * from tb_product where idx = " + idx;
            
            //db관련 클래스에서 runQuery()메서드 호출
            resultSet = cusCon.runQuery(query);
            
            //resultSet객체에 10개의 데이터 결과가 있으니 10번 반복문 수행 종료
            while(resultSet.next()) {
            	//결과 세트에서 한 행씩 처리
            	ProductDTO productDTO = new ProductDTO();
            	productDTO.setIdx(resultSet.getString("idx")); //detail
            	productDTO.setProductName(resultSet.getString("p_name"));
            	productDTO.setProductPrice(resultSet.getString("p_price"));
            	productDTO.setProductDate(resultSet.getString("p_date"));
            	productDTO.setProductDescription(resultSet.getString("p_desc"));
            	productList.add(productDTO);
            }
            System.out.println(productList);
            
        } catch(Exception e) {
            e.printStackTrace();
        }finally {
        	try {
        		resultSet.close();
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }
        return productList;
	}
}

 

ProductDTO.java

package product;

public class ProductDTO {
	/*
	pageType = 페이지 종류
	productName = 상품명
	productPrice = 상품가격
	productDate = 상품등록일
	productCnt = 상품재고
	productDescription = 상품설명
 */
	private String pageType;
	private String productName;
	private String productPrice;
	private String productDate;
	private String productCnt;
	private String productDescription;
	
	private String idx;
	
	public String getIdx() {
		return idx;
	}
	public void setIdx(String idx) {
		this.idx = idx;
	}
	public String getPageType() {
		return pageType;
	}
	public void setPageType(String pageType) {
		this.pageType = pageType;
	}
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public String getProductPrice() {
		return productPrice;
	}
	public void setProductPrice(String productPrice) {
		this.productPrice = productPrice;
	}
	public String getProductDate() {
		return productDate;
	}
	public void setProductDate(String productDate) {
		this.productDate = productDate;
	}
	public String getProductCnt() {
		return productCnt;
	}
	public void setProductCnt(String productCnt) {
		this.productCnt = productCnt;
	}
	public String getProductDescription() {
		return productDescription;
	}
	public void setProductDescription(String productDescription) {
		this.productDescription = productDescription;
	}
	@Override
	public String toString() {
		return "ProductDTO [pageType=" + pageType + ", productName=" + productName + ", productPrice=" + productPrice
				+ ", productDate=" + productDate + ", productCnt=" + productCnt + ", productDescription="
				+ productDescription + "]";
	}
}