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 += " "; } %> <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="글쓰기" title="location.href='/bigdata/board/write.jsp'"> </div>DAO 소스코드
**쿼리문 like~만 잘 활용하면 검색기능을 가진 메소드 만들 수 있다
공유하기
게시글 관리
구독하기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 강좌 : //blog.naver.com/ndb796/220470405738
JAVA 기초 강좌 : //blog.naver.com/ndb796/220504477115
JAVA 심화 강좌 : //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