쇼핑몰 검색기능 구현 - syopingmol geomsaeggineung guhyeon

jsp 소스코드

<%@page import="com.bigdata.dto.BoardDto"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.bigdata.dao.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%
request.setCharacterEncoding("UTF-8");

//페이지 번호
int pageNum = 0;
if(request.getParameter("page") == null){
	pageNum = 1;
}else{
	pageNum = Integer.parseInt(request.getParameter("page"));
}
//한 페이지에 나타낼 리스트 변수 선언
int pageList = 4;

//검색어
String keyWord = request.getParameter("keyWord");
String searchWord = request.getParameter("searchWord");

//글 목록 전체 가져오기
BoardDao dao = BoardDao.getInstance(); // Dao 정보 가져오기
ArrayList<BoardDto> boards = dao.getBoardSearch(pageNum, pageList, keyWord, searchWord);

//검색 전체  list count
int count = dao.getCount(keyWord, searchWord);

//page count
int pageCount = (int)Math.ceil((double)count / pageList); //ceil은 올림함수

%>	
	
<div class="content">
	<table width="800px" align="center">
	<b>Title Search</b> : 
	<form action="/bigdata/board/search.jsp" method="get">
	<select name="keyword">
		<option value="Title">제목(Title)</option>
		<option value="Content">내용(Content)</option>
		<option value="Name">작성자(Name)</option>		
		</select>
	<input type="text" name="searchWord">
	<input type="submit" value="Search">
	</form>
		<tr>
			<th width="10%">번호</th>
			<th width="50%">제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회</th>
		</tr>
		<%
		if(boards.size() > 0){
			String viewPath = "";
			for(BoardDto board : boards){
				viewPath = request.getContextPath()+"/board/list.jsp?idx="+board.getIdx(); //getContextPath 가 bigdata
				String space = "";
				int spaceCount = board.getIndent() * 2;
				for(int i=0;i<=spaceCount;i++){
					space += "&nbsp;";
				}
		%>
		<tr>
			<td><%=board.getIdx() %></td>
			<td><a href="<%=viewPath %>"><%=board.getTitle() %></a></td>
			<td><%=board.getName() %></td>
			<td><%=board.getRegdate() %></td>
			<td><%=board.getHit() %></td>
		</tr>
		<%
			}
		}else {
			out.println("<tr><td colspan='6'>게시글이 없습니다.</td></tr>");
		}
		
		%>
				
		<tr>
			<td colspan="5">
				<%for(int i=1;i<=pageCount;i++) {
					String path = request.getContextPath()+"/index0.jsp";
					path += " ?page= "+i+" &keyWord= " +keyWord+" &searchWord "+searchWord;
					%>
					<%if(i == pageNum){ %>
						<strong>[<%=i %>]</strong>
					<%}else{ %>
						<a href="<%=path%>">[<%=i %>]</a>
					<%} %>
				<%} %>
			</td>
		</tr>
		
	</table>
	<br> <input type="button" id="newBtn" value="글쓰기" onclick="location.href='/bigdata/board/write.jsp'">
</div>

DAO 소스코드

**쿼리문 like~만 잘 활용하면 검색기능을  가진 메소드 만들 수 있다

쇼핑몰 검색기능 구현 - syopingmol geomsaeggineung guhyeon
쿼리문에서 공백 유의!
쇼핑몰 검색기능 구현 - syopingmol geomsaeggineung guhyeon

 

공유하기

게시글 관리

구독하기IT공부 일지

'JSP' 카테고리의 다른 글

[JSP] model1, model 2(MVC패턴) 개발  (0)2020.05.11JSP 정리!!  (0)2020.05.01

< 쇼핑몰 웹 사이트 개발 프로젝트 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 라는 자바 클래스를 생성하도록 하겠습니다.

​코드 생성하는 방법은 저번 시간에 알려드렸습니다.

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)를 생성하겠습니다.

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";

    ArrayListallproductRetrieve() throws SQLException {
        ArrayListproducts = 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);
                }
            }
        }
    }

    ArrayListproductRetrieve(String productname) throws SQLException {
        ArrayListproducts = 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문입니다.

allproductRetrieve() : 모든 데이터를 뽑아옵니다.

productRetrieve() : 검색된 단어를 포함하는 데이터를 뽑아옵니다.

productInsert() : 새로운 상품 데이터를 입력합니다.

productUpdate() : 상품 데이터를 수정합니다.

​이제 ProductService.java를 만들도록 하겠습니다.

import java.util.ArrayList;

public class ProductService {

    private ProductDAO productDataAccess;

    public ProductService() {
        productDataAccess = new ProductDAO();
    }

    public ArrayListgetAllProduct() {
        ArrayListproducts = null;
        try {
            products = productDataAccess.allproductRetrieve();
        } catch (Exception e) {
            products = null;
        }
        return products;
    }

    public ArrayListgetProduct(String productname) {
        ArrayListproducts = 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파일을 다음과 같이 바꿔줍니다.

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;
        ArrayListproducts = null;

            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 파일의 코드를 수정하도록 하겠습니다.

​<%@page import="java.util.ArrayList"%>
<%@page import="domain.Product"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>


   
       


       Product List
        <% ArrayListproducts = (ArrayList) request.getAttribute("products");%>
   
   
       
           
               
               
               
               
               
               
           
            <%
                for (int i = 0; i < products.size(); i++) {
                    Product product = products.get(i);
            %>
           
               
               
               
               
               
               
           
            <% } %>
       Product IDProduct TypeProduct NameExplanationPriceInventory<%=product.getProductid()%><%=product.getProducttype()%><%=product.getProductname()%><%=product.getExplanation()%>$<%=product.getPrice()%><%=product.getInventory()%>
   

이제 상품 나열이 잘 되는지 확인하기 위해서 프로젝트를 실행해보도록 하겠습니다.

보는 것과 같이 잘 데이터베이스와 연동되서 상품의 목록을 나열했습니다.

​이제 login.jsp에 다음의 Form을 추가해줍니다.

       


            Search the product you want :
           
           
       

이제 컨트롤러(Controller)에 SearchProductServlet.java를 만들겠습니다.

< SearchProductServlet.java >

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");

        ArrayListproducts = 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