< 쇼핑몰 웹 사이트 개발 프로젝트 9단계 : 구현 - 상품 나열 및 상품 검색 기능 >
이번 프로젝트는 간단한 쇼핑몰 웹 사이트를 개발하는 것입니다. 프로젝트를 시작하기 전에 필요한 사전 지식으로
Tomcat 서버 운용, HTML, Java, 데이터베이스, JSP과 통합 개발 환경(IDE) 등 프로그래밍 기초 지식에 대한 전반
적인 이해가 필요합니다. 사실 이 프로젝트에 필요한 HTML과 Oracle 데이터베이스 부분은 기초 지식이면 충분하기
때문에 이러한 프로젝트 솔루션을 최대한 빠르게 완주하고 싶으신 분은 Java부터 집중적으로 공부하시길 추천합니다.
Oracle 11g 강좌 : http://blog.naver.com/ndb796/220470405738
JAVA 기초 강좌 : http://blog.naver.com/ndb796/220504477115
JAVA 심화 강좌 : http://blog.naver.com/ndb796/220595701047
프로그래밍 능력은 ‘ 내가 원하는 것을 직접 만들 수 있는 능력 ‘입니다.
자신의 필요에 근거해서 프로젝트의 방향을 바꿀 수 있는 융통성을 가집시다.
—————————————————————- —————————-
지난 시간까지 잘 따라오셨다면 프로젝트 폴더는 아래와 같을 것입니다.
고객 & 관리자 권한으로 로그인 할 수 있는 기능을 제공했고 그와 동시에
회원가입 한 뒤에 만들어진 계정으로 다시 로그인할 수 있게 되었습니다.
이제 모델(Model) 부분을 수정하도록 하겠습니다.
Product.java 라는 자바 클래스를 생성하도록 하겠습니다.
코드 생성하는 방법은 저번 시간에 알려드렸습니다.
< Product.java >
package domain;
public class Product {
int productid;
String producttype;
String productname;
String explanation;
int price;
public int getProductid() {
return productid;
}
public Product(int productid, String producttype, String productname, String explanation, int price, int inventory) {
this.productid = productid;
this.producttype = producttype;
this.productname = productname;
this.explanation = explanation;
this.price = price;
this.inventory = inventory;
}
public void setProductid(int productid) {
this.productid = productid;
}
public String getProducttype() {
return producttype;
}
public void setProducttype(String producttype) {
this.producttype = producttype;
}
public String getProductname() {
return productname;
}
public void setProductname(String productname) {
this.productname = productname;
}
public String getExplanation() {
return explanation;
}
public void setExplanation(String explanation) {
this.explanation = explanation;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getInventory() {
return inventory;
}
public void setInventory(int inventory) {
this.inventory = inventory;
}
int inventory;
}
이쯤에서 데이터베이스의 shoppingproduct 테이블에 예시 데이터를 몇 개 삽입하도록 하겠습니다.
insert into shoppingproduct values(1, ‘Laptop’, ‘Gigabyte P55K V5’,
‘Display Screen 15 inch, Chip set made by Intel, i7’, 1500, 150);
insert into shoppingproduct values(2, ‘Mouse’, ‘Gigabyte GM-M6900’,
‘Interface USB, Maximum sensitivity 32’, 20, 300);
insert into shoppingproduct values(3, ‘Mainboard’, ‘Gigabyte GA-B85M-D3H’,
‘Socket Intel-Socket1150, mATX of Standard’, 100, 50);
참고로 모든 데이터 입력이 끝난 후에 Commit;는 잊지 말아주세요.
이제 데이터에 접근할 수 있는 클래스 인 DAO(Data Access Object)를 생성하겠습니다.
< ProductDAO.java >
package domain;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import util.DBConnectionPool;
public class ProductDAO {
private DBConnectionPool connPool;
private static final String ALLRETRIEVE_STMT
= “SELECT * FROM shoppingproduct”;
private static final String INSERT_STMT = “INSERT INTO shoppingproduct VALUES(?,?,?,?,?,?)”;
private static final String UPDATE_STMT = “UPDATE shoppingproduct SET ProductType = ? ProductName = ? Explanation = ? Price = ? Inventory = ? WHERE ProductID = ?”;
private static final String GETID_STMT = “SELECT COUNT(ProductID) FROM shoppingproduct”;
ArrayList allproductRetrieve() throws SQLException {
ArrayList products = new ArrayList();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
try {
conn = connPool.getPoolConnection();
stmt = conn.prepareStatement(ALLRETRIEVE_STMT);
rset = stmt.executeQuery();
while (rset.next()) {
int ProductID = rset.getInt(1);
String ProductType = rset.getString(2);
String ProductName = rset.getString(3);
String Explanation = rset.getString(4);
int Price = rset.getInt(5);
int Inventory = rset.getInt(6);
products.add(new Product(ProductID, ProductType, ProductName, Explanation, Price, Inventory));
}
return products;
} catch (SQLException se) {
throw new RuntimeException(
“A database error occurred. ” + se.getMessage());
} catch (Exception e) {
throw new RuntimeException(“Exception: ” + e.getMessage());
} finally {
if (rset != null) {
try {
rset.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
}
ArrayList productRetrieve(String productname) throws SQLException {
ArrayList products = new ArrayList();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
try {
conn = connPool.getPoolConnection();
stmt = conn.prepareStatement(“SELECT * FROM shoppingproduct WHERE ProductName like ‘%” + productname + “%'”);
rset = stmt.executeQuery();
while (rset.next()) {
int ProductID = rset.getInt(1);
String ProductType = rset.getString(2);
String ProductName = rset.getString(3);
String Explanation = rset.getString(4);
int Price = rset.getInt(5);
int Inventory = rset.getInt(6);
products.add(new Product(ProductID, ProductType, ProductName, Explanation, Price, Inventory));
}
return products;
} catch (SQLException se) {
throw new RuntimeException(
“A database error occurred. ” + se.getMessage());
} catch (Exception e) {
throw new RuntimeException(“Exception: ” + e.getMessage());
} finally {
if (rset != null) {
try {
rset.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
}
void productInsert(String producttype, String productname, String explanation, int price, int inventory) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
try {
conn = connPool.getPoolConnection();
stmt = conn.prepareStatement(GETID_STMT);
rset = stmt.executeQuery();
int ID = -1;
rset.next();
ID = rset.getInt(“COUNT(ProductID)”);
ID++;
stmt = conn.prepareStatement(INSERT_STMT);
stmt.setInt(1, ID);
stmt.setString(2, producttype);
stmt.setString(3, productname);
stmt.setString(4, explanation);
stmt.setInt(5, price);
stmt.setInt(6, inventory);
stmt.executeQuery();
} catch (SQLException se) {
throw new RuntimeException(
“A database error occurred. ” + se.getMessage());
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
}
void productUpdate(int productid, String producttype, String productname, String explanation, int price, int inventory) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rset = null;
try {
conn = connPool.getPoolConnection();
stmt = conn.prepareStatement(UPDATE_STMT);
stmt.setString(1, producttype);
stmt.setString(2, productname);
stmt.setString(3, explanation);
stmt.setInt(4, price);
stmt.setInt(5, inventory);
stmt.setInt(6, productid);
stmt.executeQuery();
} catch (SQLException se) {
throw new RuntimeException(
“A database error occurred. ” + se.getMessage());
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
}
}
위 코드를 잘 보면 총 4개의 SQL 문장이 준비되어있습니다.
하나는 shoppingproduct에서 모든 데이터를 뽑아오는 SQL문이고,
다른 3개는 shoppingproduct에 데이터를 입력하고 수정하는데 쓰이는 SQL문입니다.
함수는 총 4개가 존재합니다.
allproductRetrieve() : 모든 데이터를 뽑아옵니다.
productRetrieve() : 검색된 단어를 포함하는 데이터를 뽑아옵니다.
productInsert() : 새로운 상품 데이터를 입력합니다.
productUpdate() : 상품 데이터를 수정합니다.
이제 ProductService.java를 만들도록 하겠습니다.
< ProductService.java >
package domain;
import java.util.ArrayList;
public class ProductService {
private ProductDAO productDataAccess;
public ProductService() {
productDataAccess = new ProductDAO();
}
public ArrayList getAllProduct() {
ArrayList products = null;
try {
products = productDataAccess.allproductRetrieve();
} catch (Exception e) {
products = null;
}
return products;
}
public ArrayList getProduct(String productname) {
ArrayList products = null;
try {
products = productDataAccess.productRetrieve(productname);
} catch (Exception e) {
products = null;
}
return products;
}
public void insertProduct(String producttype, String productname, String explanation, int price, int inventory) {
productDataAccess.productInsert(producttype, productname, explanation, price, inventory);
}
public void updateProduct(int productid, String producttype, String productname, String explanation, int price, int inventory) {
productDataAccess.productUpdate(productid, producttype, productname, explanation, price, inventory);
}
}
이제 먼저 상품 나열 기능부터 제공하도록 하겠습니다.
지난 시간에 작성했던 LoginServlet.java파일을 다음과 같이 바꿔줍니다.
< LoginServlet.java >
package web;
import domain.Product;
import domain.ProductService;
import domain.UserService;
import domain.User;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import oracle.jdbc.pool.OracleDataSource;
import util.Status;
public final class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
processRequest(request, response);
}
public void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
RequestDispatcher view = null;
UserService UserService = null;
ProductService ProductService = null;
Status status = new Status();
request.setAttribute(“status”, status);
String usertype = request.getParameter(“usertype”);
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
if (usertype.equals(“unknown”)) {
status.addException(new Exception(
“Please select a login type”));
}
if ((username == null) || (username.length() == 0)) {
status.addException(new Exception(
“Please enter your username”));
}
if ((password == null) || (password.length() == 0)) {
status.addException(new Exception(
“Please enter your password”));
}
User user = null;
ArrayList products = null;
try {
UserService = new UserService();
user = UserService.getUser(usertype, username, password);
ProductService = new ProductService();
products = ProductService.getAllProduct();
if (user == null) {
status.addException(new Exception(
“Please enter your user information in the right way”));
}
if (products == null) {
status.addException(new Exception(
“The product database error”));
}
if (!status.isSuccessful()) {
view = request.getRequestDispatcher(“main.jsp”);
view.forward(request, response);
return;
}
request.setAttribute(“user”, user);
request.setAttribute(“products”, products);
} catch (Exception e) {
status.addException(e);
view = request.getRequestDispatcher(“main.jsp”);
view.forward(request, response);
}
if (usertype.equals(“A”)) {
view = request.getRequestDispatcher(“admin/login.jsp”);
view.forward(request, response);
}
if (usertype.equals(“C”)) {
view = request.getRequestDispatcher(“login.jsp”);
view.forward(request, response);
}
}
}
보시면 아시겠지만 모든 상품의 데이터를 뽑아와서 세션 객체로서 저장했습니다.
이제 기존의 login.jsp 파일의 코드를 수정하도록 하겠습니다.
Product List
<% ArrayList products = (ArrayList) request.getAttribute(“products”);%>
Product ID |
Product Type |
Product Name |
Explanation |
Price |
Inventory |
<%
for (int i = 0; i < products.size(); i++) {
Product product = products.get(i);
%>
<%=product.getProductid()%> |
<%=product.getProducttype()%> |
<%=product.getProductname()%> |
<%=product.getExplanation()%> |
$<%=product.getPrice()%> |
<%=product.getInventory()%> |
<% } %>
이제 상품 나열이 잘 되는지 확인하기 위해서 프로젝트를 실행해보도록 하겠습니다.
보는 것과 같이 잘 데이터베이스와 연동되서 상품의 목록을 나열했습니다.
이제 login.jsp에 다음의 Form을 추가해줍니다.
이제 컨트롤러(Controller)에 SearchProductServlet.java를 만들겠습니다.
< SearchProductServlet.java >
package web;
import domain.Product;
import domain.ProductService;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public final class SearchProductServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
processRequest(request, response);
}
public void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
RequestDispatcher view = null;
ProductService ProductService = null;
String ProductName = request.getParameter(“productname”);
ArrayList products = null;
ProductService = new ProductService();
products = ProductService.getProduct(ProductName);
request.setAttribute(“products”, products);
view = request.getRequestDispatcher(“login.jsp”);
view.forward(request, response);
}
}
또한 web.xml 에서 다음의 내용을 추가해줍니다.
SearchController
web.SearchProductServlet
SearchController
/search
이제 실행해보도록 하겠습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!