본문 바로가기
Java Web Programming/4. JSP

[JSP/Model2] DB연동 _ Model2 FrontController + MVC + Singleton Pattern

by 파프리카_ 2020. 8. 31.
728x90
반응형

https://creamilk88.tistory.com/99?category=872953에서 이어지는 포스팅으로,

실제 DB에 연동되어 web에서 작업이 이루어지는 것을 보여주는 포스팅이다. 

(MockDAO 가 아닌 ProductDAO로 실제 DB와 연동되는 차이가 있다.)

 

 

[ 프로그램 설계 순서 ]

 

1. error.jsp - 에러 페이지 생성

 

2. DispatcherServlet.java : 모든 클라이언트가 FrontContorller인 DispatcherServlet으로 요청한다

* FrontController Pattern : 모든 클라이언트의 요청을 하나의 진입점으로 집중시켜 일괄적으로 처리하기 위한 디자인 패턴

 

 2_1. handleRequest() method만 생성해둠

 2_2. doGet()과 doPost() method 각각에서 handleRequest() method가 호출되도록 기입

 

-- handleRequest()의 공통 방침--

  1. 에러 정책
    - 에러 방생 시, 클라이언트에게 error.jsp를 제공하고,
    - 에러메세지는 서버상의 콘솔에서만 보여준다.
  2. client가 보낸 command를 받아온다.
  3. 실제 controller logic 구현은 개별 controller 객체를 
    객체 생성을 전담하는 HandlerMapping에게 의뢰해서 컨트롤러 객체를 반환받는다.
  4. 개별 컨트롤러 객체의 구체적인 수행 내용을 알 필요없이
    Controller 인터페이스의 추성 메서드인 execute(request, response) 메서드를 호출하여
    개별 컨트롤러 로직을 실행시킨다.
  5. 실행 후 반환되는 url 정보를 기반으로,
    클라이언트에게 응답하기 위한 view로 이동할 방식을 선택해서 이동시킨다.

2_3. handleRequest() method에서 1단계 (에러정책) 구현

 

3. Controller.java : Controller interface 생성

Controller interface를 구현받을 하위 구현체들이 사용할 execute 메서드를 생성한다.

 

4. HandlerMapping.java : 컨트롤러 객체의 생성을 전담하는 Factory 클래스 - singleton pattern을 적용시킨다.

* 시스템 상에서 하나면 존재하면 되므로, Singleton Pattern을 적용해,

 단 한번 생성되고, 이를 여러 곳에서 공유해서 사용할 수 있도록 ( getInstance() method를 통해) 한다.

 

5. DispatcherServlet.java 로 넘어와서,  handleRequest() method 2~5단계 구현하여 완성

 

6. ProductVO.java / ProductDAO.java : MVC의 Model부분 (DAO class와 VO class 설계) 생성

 

* 1 ~ 6 단계까지는 한 번만 구현 및 생성해두면 두고두고 사용 가능하다!

기능을 추가/수정할때는 이 이후 단계에서 작업하면 된다.

 

-- 1번째 기능 추가

7. index.jsp : 1번째 service기능인 '전체 상품 수 조회' 링크 추가

<a href="front?command=totalCount">

* front : DispatcherServlet의 urlpattern

- DispatcherServlet에서 요청 처리 (TotalCountController) 후,  (count-view.jsp)에서 응답

 

8. count-view.jsp : '전체 상품 수 조회' 결과 페이지 생성

 

9. HandlerMapping.java에서 create() method에 command 경우의 수 추가

: command에 들어오는 경우가 1번째 서비스(전체 상품 수 조회)인 경우 TotalProductCountContoller 생성하도록 구현

 

10. TotalProductCountContoller.java 생성 :

step1) model과 연동 - DAO

step2) 연동 결과를 view와 공유하기 위해 request.setAttribute(name, value)

step3) 응답 방식 및 응답 url을 반환 

 

-- 2번째 기능 추가

11. index.jsp : 2번 service 기능인 '상품 검색' 링크 추가 (상품 아이디로 상품 정보 검색하기)

<a href = "find-product-form.jsp">

 

12. find-product-form.jsp :  '상품 검색' form 페이지 생성

form.jsp -- request -- front(DispatcherSevlet) <-> HandlerMapping <-> Controller <-> ProductDAO 

                                                       ㅣ forward

                                                       ㅣ

                                                       ㅣ find-fail.jsp or find-ok.jsp

<hidden> command = findproductbyid

 

13.  find-fail.jsp : 일치하는 아이디가 없는 경우 이동하는 jsp 페이지 생성

--> java script 이용

1) alert 으로 경고 띄우고,

2) find-product-form.jsp로 이동

 

14. find-ok.jsp:  일치하는 아이디가 있는 경우 이동하는 jsp 페이지 생성

 

13. HandlerMapping.java에서 create() method에 command 경우의 수 추가

: command가 findproductbyid로 들어올 경우 ->2번째 서비스(상품 아이디로 상품 정보 검색하기)인 경우

FindProductByIdController 를  생성하도록 구현

 

14. FindProductByIdController.java 생성 :

step1) 클라이언트가 전달한 상품 아이디를 반환받는다.

step2) 모델과 연동 (productDAO의 findProductById(id) 이용)

step3) 연동 결과에 의해 상품 정보가 존재하지 않으면 

-> find-fail.jsp로 이동 시킨다.(forward 방식)

step4) 연동 결과에 의해 상품 정보가 존재하면

-> request에 연동 결과를 공유하고 find-ok로 이동시킨다. (forward 방식)

 

15. find-ok.jsp에 반환값 수정 : FindProductByIdController에 따라 반환값을 받아올 수 있게끔 수정해준다.

 

-- 3번째 기능 : 전체 상품 리스트 table로 조회 (id와 name만)

위 방식과 동일하게 구현하면 된다 !

 

-- 4번째 기능 : 제조사 리스트 조회 + 제조사 리스트를 radio 버튼으로 만들어서 제조사 상품 정보 조회

(1번째 기능과 3번째 기능이 합쳐진 기능이다)

index.jsp에 새로운 기능 추가

maker-form.jsp 생성

HandlerMapping에 index.jsp에서 보낸 command(getmakerlist) 추가

기능을 수행할 Cotroller 생성 -> maker-form.jsp 로 보여주기

 

maker-form.jsp에 + submit 버튼 추가 + form에 action으로 다시 front(DispatcherServlet.java)로 넘어가게끔 설정+ input=hidden으로 command값으로 findproductlistbymaker주게끔 설정

HandlerMapping에 index.jsp에서 보낸 command (findproductlistbymaker)추가

기능을 수행할 Cotroller 생성

-> ProductDAO에 이 기능을 수행할 함수가 없다면 새로 생성해주기 (메이커로 상품정보 찾기)
productbymaker-list.jsp 에서 결과값 보여주기


[ 전체 구현 코드 ] 

DB Table

 

Model

/ProductVO.java

package org.kosta.model;

public class ProductVO {
	private String id;
	private String name;
	private String maker;
	private int price;

	public ProductVO() {
		super();
	}

	public ProductVO(String id, String name, String maker, int price) {
		super();
		this.id = id;
		this.name = name;
		this.maker = maker;
		this.price = price;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getMaker() {
		return maker;
	}

	public void setMaker(String maker) {
		this.maker = maker;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "ProductVO [id=" + id + ", name=" + name + ", maker=" + maker + ", price=" + price + "]";
	}

}

 

/ProductDAO.java

package org.kosta.model;
/* DB와 연동하여 기능하는 DAO class*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/*
 * 	Singleton Design Pattern 적용 
 *  1. private 생성자 
 *  2. private static 변수에 자신의 객체를 생성 
 *  3. public static method(getInstance())로 공유 
 */
public class ProductDAO {
	private static ProductDAO instance = new ProductDAO();
	private String driver = "oracle.jdbc.OracleDriver";
	private String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	private String username = "scott";
	private String userpass = "tiger";

	private ProductDAO() {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static ProductDAO getInstance() {
		return instance;
	}

	public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection con) throws SQLException {
		if (rs != null)
			rs.close();
		if (pstmt != null)
			pstmt.close();
		if (con != null)
			con.close();
	}

	/*
	 * getTotalProductCount method() 
	 * 1번 기능 -- 전체 상품 수 조회 기능
	 */
	public int getTotalProductCount() throws SQLException {
		int count = 0;
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(url, username, userpass);
			String sql = "select count(*) from web_product";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if (rs.next())
				count = rs.getInt(1);
		} finally {
			closeAll(rs, pstmt, con);
		}
		return count;
	}

	/*
	 * findProductById method() 
	 * 2번 기능 -- id를 통해 상품 정보 조회 기능
	 */
	public ProductVO findProductById(String id) throws SQLException {
		ProductVO vo = null;
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(url, username, userpass);
			String sql = "select name,maker,price from web_product where id=?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				vo = new ProductVO(id, rs.getString(1), rs.getString(2), rs.getInt(3));
			}
		} finally {
			closeAll(rs, pstmt, con);
		}
		return vo;
	}

	/*
	 * getAllProductList method() 
	 * 3번 기능 -- DB에 있는 모든 Product의 정보 조회하는 기능
	 */
	public ArrayList<ProductVO> getAllProductList() throws SQLException {
		ArrayList<ProductVO> list = new ArrayList<ProductVO>();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(url, username, userpass);
			String sql = "select id,name from web_product order by id desc";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				ProductVO vo = new ProductVO();
				vo.setId(rs.getString(1));
				vo.setName(rs.getString(2));
				list.add(vo);
			}
		} finally {
			closeAll(rs, pstmt, con);
		}
		return list;
	}
	
	/*
	 * getMakerList method() 
	 * 4번 기능 -- Maker 종류를 종회해서 리스트로 반환
	 */
	public ArrayList<String> getMakerList() throws SQLException {
		ArrayList<String> list = new ArrayList<String>();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = DriverManager.getConnection(url, username, userpass);
			String sql = "SELECT DISTINCT(MAKER) FROM web_product";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				list.add(rs.getString(1));
			}
		
		} finally {
			closeAll(rs, pstmt, con);
		}
		
		return list;
	}
	
	public static void main(String[] args) {
		try {
			ProductDAO.getInstance().getMakerList();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/*
	 * findProductByMaker method() 
	 * 4_1번 기능 -- maker를 통해 상품 정보 조회 기능
	 */
	public ArrayList<ProductVO> findProductByMaker(String maker) throws SQLException {
		ArrayList<ProductVO> list = new  ArrayList<ProductVO>();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(url, username, userpass);
			String sql = "select id,name,maker,price from web_product where maker=?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, maker);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				ProductVO vo = new ProductVO(rs.getString(1), rs.getString(2), 
						rs.getString(3), rs.getInt(4));
				list.add(vo);
			}
		} finally {
			closeAll(rs, pstmt, con);
		}
		return list;
	}
}

View

/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품관리</title>
</head>
<body>
	<h4>Model2 (MVC + FrontController) 상품관리</h4>
	<ul>
		<%--- DispatcherServlet에서 요청 처리 
			(TotalCountController) 후,  
			(count-view.jsp)에서 응답 --%>
		<li><a href="front?command=totalCount">전체 상품수 조회</a></li>
		<li><a href="find-product-form.jsp">상품 검색</a></li>
		<li><a href="front?command=totalProduct">전체 상품 정보 조회</a></li>
		<%-- 
			command = getmakerlist --> MakerKindController <--> DAO
											ㅣ 
												forward
											ㅣ
											maker-form.jsp
											(제조사를 라디오 버튼으로 보여준다.)
		 --%>
		<li><a href="front?command=getmakerlist">제조사 리스트 조회</a></li>
	</ul>
</body>
</html>

 

/error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>예외 페이지</title>
</head>
<body>
	<marquee>
		시스템 에러가 발생했습니다. 콘솔을 확인하세요!<br>
		<br> <img src="error.jpg">
	</marquee>
</body>
</html>

 

 

-- 1번 기능 : 전체 상품 수 조회 결과 페이지

/count-view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>전체 상품 수</title>
</head>
<body>
	전체 상품 수: <%=request.getAttribute("totalCount") %>
</body>
</html>

 

-- 2번 기능 :  아이디로 상품 검색 페이지

/find-product-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 검색</title>
</head>
<%--
	form.jsp -- request -- front(DispatcherSevlet) <-> HandlerMapping <-> Controller <-> ProductDAO 
	
	                                                       ㅣ forward
	
	                                                       ㅣ
	
	                                                       ㅣ find-fail.jsp or find-ok.jsp
	
	<hidden> command = findproductbyid 
--%>
<body>
<form action="front">
	<input type="hidden" name="command" value="findproductbyid">
	상품 아이디 <input type="text" name="productId">
	<input type="submit" value="검색">
</form>
</body>
</html>

 

/find-ok.jsp

<%@page import="org.kosta.model.ProductVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 상세 정보 페이지</title>
</head>
<body>
	<% ProductVO vo = (ProductVO) request.getAttribute("vo"); %>
	검색 결과 <br>
	아이디 : <%=vo.getId() %><br>
	제품명 : <%=vo.getName() %><br>
	제조사 : <%=vo.getMaker() %><br>
	가격 : <%=vo.getPrice() %><br>
	
</body>
</html>

 

/find-fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>검색 실패 페이지</title>
</head>
<body>
	<script type="text/javascript">
		alert("아이디에 대한 상품 정보가 존재하지 않습니다")
		location.href = "find-product-form.jsp";
	</script>
</body>
</html>

 

 

-- 3번 기능 : 전체 상품 리스트 조회 페이지

/product-view.jsp

<%@page import="org.kosta.model.ProductVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" href="css/mystyle.css">
<meta charset="UTF-8">
<title>전체 상품 정보 조회</title>
</head>
<body>
<%
	@SuppressWarnings("unchecked")
	ArrayList<ProductVO> list 
		= (ArrayList<ProductVO>) request.getAttribute("list");
%>
	<table>
		<thead>
			<tr>
				<th>ID</th>
				<th>NAME</th>
			</tr>
		</thead>
			<% for (ProductVO vo:list) { %>
				<tr>
					<td><%=vo.getId() %></td>
					<td><%=vo.getName() %></td>
				</tr>
			<% } %>
			
		<tbody>
		</tbody>
	</table>
</body>
</html>

 

-- 4번 기능 :  상품의 전체 메이커 종류 조회(라디오 버튼) + 메이커 별 상품 정보 조회

/maker-form.jsp

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제조사 목록 조회</title>
</head>
<body>

	<%
		@SuppressWarnings("unchecked")
	ArrayList<String> list = (ArrayList<String>) request.getAttribute("list");
	%>
	<form action="front">
		<input type="hidden" name="command" value="findproductlistbymaker">
		<%-- DB web_product table에 저장된 maker 종류를
		아래의 radio button으로 제공 --%>
		전체 상품 제조사 목록<br>
		<%
			for (int i = 0; i < list.size(); i++) {
		%>
			<input type="radio" name="maker" value="<%=list.get(i)%>"
				required="required">
			<%=list.get(i)%><br>
		<%
			}
		%>
		<input type="submit" value="maker별 검색">
	</form>


</body>
</html>

 

/productbymaker-list.jsp

<%@page import="org.kosta.model.ProductVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>제조사 별 상품 상세 정보</title>
</head>
<body>
<%
	@SuppressWarnings("unchecked")
	ArrayList<ProductVO> list 
		= (ArrayList<ProductVO>) request.getAttribute("list");
%>	
	<table>
		<thead>
			<tr>
				<th>ID</th>
				<th>NAME</th>
				<th>MAKER</th>
				<th>PRICE</th>
			</tr>
		</thead>
			<% for (ProductVO vo:list) { %>
				<tr>
					<td><%=vo.getId() %></td>
					<td><%=vo.getName() %></td>
					<td><%=vo.getMaker() %></td>
					<td><%=vo.getPrice() %></td>
				</tr>
			<% } %>
			
		<tbody>
		</tbody>
	</table>
</body>
</html>

Controller

/DispatcherServlet.java

package org.kosta.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * FrontController의 역할
 * 
 */
@WebServlet("/front")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// doGet method
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.handleRequest(request, response);
	}

	// doPost method
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// Post방식에서 필요한 utf-8 인코딩 처리
		request.setCharacterEncoding("utf-8");
		
		this.handleRequest(request, response);
	}

	/*
	 * 1. 에러 정책
	 * - 에러 방생 시, 클라이언트에게 error.jsp를 제공하고, 
	 * - 에러메세지는 서버상의 콘솔에서만 보여준다.
	 * 2. client가 보낸 command를 받아온다.
	 * 3. 실제 controller logic 구현은 개별 controller 객체를 
	 * 객체 생성을 전담하는 HandlerMapping에게 의뢰해서 컨트롤러 객체를 반환받는다.
	 * 4. 개별 컨트롤러 객체의 구체적인 수행 내용을 알 필요없이
	 * Controller 인터페이스의 추성 메서드인 execute(request, response) 메서드를 호출하여 
	 * 개별 컨트롤러 로직을 실행시킨다.
	 * 5. 실행 후 반환되는 url 정보를 기반으로,
	 * 클라이언트에게 응답하기 위한 view로 이동할 방식을 선택해서 이동시킨다.
	 */
	// handleRequest method
	protected void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			// 2. client가 보낸 command 받아오기
			String command = request.getParameter("command");
			
			//3. HandlerMapping를 통해 2에서 받은 command에 맞는 controller 생성
			Controller controller = HandlerMapping.getInstance().create(command);
			
			//4. 3에서 만든 controller에서 execute로 실행 
			//(trim으로 여백제거하여 url정의)
			String url = controller.execute(request, response).trim();
			
			//5. 4에서 반환된 url정보를 기반으로, view로 이동
			//url이 redirect로 시작되면, redirect방식으로 보내기
			if (url.startsWith("redirect:")) {
				response.sendRedirect(url.substring(9));
			} else { //아니면 forward 방식으로 보내기
				request.getRequestDispatcher(url).forward(request, response);
			}
			
		} catch(Exception e) {
			//1. 에러 정책
			e.printStackTrace();
			response.sendRedirect("error.jsp");
		}
	}
}

 

/ HandlerMapping.java

package org.kosta.controller;
/*
 * 컨트롤러 객체의 생성을 전담하는 Factory 클래스 - singleton pattern을 적용시킨다.
 * 시스템 상에서 하나면 존재하면 되므로, Singleton Pattern을 적용해,
 *  단 한번 생성되고, 이를 여러 곳에서 공유해서 사용할 수 있도록 한다.
 */
public class HandlerMapping {
	// Singleton 적용
	private static HandlerMapping instance = new HandlerMapping();
	private HandlerMapping() {	}
	public static HandlerMapping getInstance() {
		return instance;
	}
	
	//create method 생성
	public Controller create(String command) {
		Controller controller = null;
		
		if (command.contentEquals("totalCount"))
			controller = new TotalProductCountContoller();
		else if (command.contentEquals("findproductbyid"))
			controller = new FindProductByIdController();
		else if (command.contentEquals("totalProduct"))
			controller = new TotalProductListController();
		else if (command.contentEquals("getmakerlist"))
			controller = new MakerKindController();
		else if (command.contentEquals("findproductlistbymaker"))
			controller = new FindProductListByMakerController();
		return controller;	
		
	}
}

 

/controller.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller {
	//execute 메서드 생성
	public String execute(HttpServletRequest request, 
			HttpServletResponse response) throws Exception;
}

 

 

-- 1번 기능 : 전체 상품 수 조회 기능 controller

/TotalProductCountContoller.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.ProductDAO;

public class TotalProductCountContoller implements Controller {
	
	//Controller의 execute method Overriding하여 구현
	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) 
			throws Exception {
		/*
		 * step1) model과 연동 - DAO
		 * step2) 연동 결과를 view와 공유하기 위해 request.setAttribute(name, value)
		 * step3) 응답 방식 및 응답 url을 반환
		 */
		
		int totalCount = ProductDAO.getInstance().getTotalProductCount();
		request.setAttribute("totalCount", totalCount);
		//forward 방식으로 url 반환
		return "count-view.jsp";
	}

}

 

-- 2번 기능 : 아이디로 상품 정보 조회 기능 controller

/FindProductByIdController.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.ProductDAO;
import org.kosta.model.ProductVO;

public class FindProductByIdController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) 
			throws Exception {
		/* step1) 클라이언트가 전달한 상품 아이디를 반환받는다.
		 * step2) 모델과 연동 (productDAO의 findProductById(id) 이용)
		 * step3) 연동 결과에 의해 상품 정보가 존재하지 않으면 
		 * -> find-fail.jsp로 이동 시킨다.(forward 방식)
		 * step4) 연동 결과에 의해 상품 정보가 존재하면
		 * -> request에 연동 결과를 공유하고 find-ok로 이동시킨다. (forward 방식)
		 */
		String id = request.getParameter("productId");
		
		ProductVO vo = ProductDAO.getInstance().findProductById(id);
		
		String url = null;
		if (vo == null) { //상품 정보가 없으면
			url = "find-fail.jsp";
		} else { //상품 정보가 있으면
			request.setAttribute("vo", vo);
			url = "find-ok.jsp";
		}
		
		return url;
	}

}

 

-- 3번 기능 : 전체 상품 리스트로 조회 기능 controller

/TotalProductListController.java

package org.kosta.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.ProductDAO;
import org.kosta.model.ProductVO;

public class TotalProductListController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		/* step1) model과 연동 - DAO
		 * step2) 연동 결과를 view와 공유하기 위해 request.setAttribute(name, value)
		 * step3) 응답 방식 및 응답 url을 반환 
		 */
		
		ArrayList<ProductVO> list = ProductDAO.getInstance().getAllProductList();
		
		request.setAttribute("list", list);
		
		return "product-view.jsp";
	}

}

 

-- 4번 기능 : 전체 메이커 라디오 버튼으로 조회 기능 controller

+ 각 메이커 라디오 버튼 클릭 했을 때, 메이커 별 상풍 정보 조회 controller

/MakerKindController.java

package org.kosta.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.ProductDAO;

public class MakerKindController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) 
			throws Exception {
		ArrayList<String> list = ProductDAO.getInstance().getMakerList();
		request.setAttribute("list", list);
		
		return "maker-form.jsp";
	}

}

 

/FindProductListByMakerController.java

package org.kosta.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.model.ProductDAO;
import org.kosta.model.ProductVO;

public class FindProductListByMakerController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) 
			throws Exception {
		String maker = request.getParameter("maker");
		ArrayList<ProductVO> list = ProductDAO.getInstance().findProductByMaker(maker);
		request.setAttribute("list", list);
		
		return "productbymaker-list.jsp";
	}

}

 

브라우저 결과 화면

 

 

728x90
반응형