*분석할 때 순서!
무조건
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 + "]";
}
}
'JAVA, JSP' 카테고리의 다른 글
| java - 7장 상속(메소드 오버라이딩, 타입 변환, 다형성, 추상클래스) (0) | 2024.08.16 |
|---|---|
| java, jsp - 로그인, 로그아웃 구현 (0) | 2024.08.09 |
| java - 7장 상속 (0) | 2024.08.08 |
| java - 클래스(리턴데이터타입, 오버로딩, 정적, final, gatter, setter), import문 자동 추가 단축키 (0) | 2024.08.08 |
| java 6장- 객체지향프로그래밍 (0) | 2024.08.01 |