[예제] 상품번호 중복 체크 | 상품 검색 | 도서 관리 프로젝트
예제 1 : 상품 등록 시 상품번호 중복 체크
newProductForm.jsp : 상품등록 화면에 상품번호 입력란 옆에 [중복확인] 버튼 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 등록 폼</title>
<script src="<c:url value='/js/jquery-3.6.0.min.js'/>"></script>
<script src="<c:url value='/js/prdNocheck.js'/>"></script>
</head>
<body>
<h3>상품 등록</h3>
<!-- <form method="post" action="/mybatis/product/insertProduct"> -->
<form method="post" action="/mybatis/product/insertProduct">
<table>
<tr><td>상품 번호</td><td><input type="text" name="prdNo" id="prdNo"><button id="prdNoCheckBtn">중복확인</button></td></tr>
<tr><td>상품명</td><td><input type="text" name="prdName"></td></tr>
<tr><td>가격 </td><td> <input type="text" name="prdPrice"></td></tr>
<tr><td>제조회사</td><td><input type="text" name="prdCompany"></td></tr>
<tr><td>재고 </td> <td><input type="text" name="prdStock"></td></tr>
<tr><td colspan="2"><input type="submit" value="등록"><input type="reset" value="취소"></td></tr>
</table>
</form>
</body>
</html>
prdNocheck.js : result 결과(no_use)에 따라 alert() 출력
/**
* prdNocheck.js
*/
$(document).ready(function(){
$('#prdNoCheckBtn').on('click', function(){
event.preventDefault();
$.ajax({
type:"post",
url:"prdNoCheck",
data:{"prdNo":$('#prdNo').val()},
success:function(result){
if(result=="no_use") {
alert("사용할 수 없는 번호입니다.");
} else {
alert("사용 가능한 번호입니다.");
}
},
error:function(data, textStatus){
alert("전송 실패");
}
});
});
});
IProductService
package com.spring_mvc.mybatis.service;
import java.util.ArrayList;
import java.util.HashMap;
import com.spring_mvc.mybatis.model.ProductVO;
public interface IProductService {
// 구현 클래스에서 오버라이딩할 추상 메소드 선언
// 규격 지정 : 반드시 구현해야 할 메소드 지정해 놓는 것
ArrayList<ProductVO> listAllProduct(); // 전체 상품 조회
void insertProduct(ProductVO prdVo); // 상품 정보 등록
void updateProduct(ProductVO prdVo); // 상품 정보 수정
void deleteProduct(String prdNo); // 상품 정보 삭제
ProductVO detailViewProduct(String prdNo);// 상세 상품 조회
String prdNoCheck(String prdNo); // 상품 번호 중복 확인
}
ProductService
package com.spring_mvc.mybatis.service;
import java.util.ArrayList;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.spring_mvc.mybatis.dao.IProductDAO;
import com.spring_mvc.mybatis.model.ProductVO;
@Service
public class ProductService implements IProductService {
// MyBatis 사용하는 경우의 DI 설정
@Autowired
@Qualifier("IProductDAO")
IProductDAO dao;
@Override
public ArrayList<ProductVO> listAllProduct() {
return dao.listAllProduct();
}
@Override
public void insertProduct(ProductVO prdVo) {
dao.insertProduct(prdVo);
}
@Override
public void updateProduct(ProductVO prdVo) {
dao.updateProduct(prdVo);
}
@Override
public void deleteProduct(String prdNo) {
dao.deleteProduct(prdNo);
}
@Override
public ProductVO detailViewProduct(String prdNo) {
return dao.detailViewProduct(prdNo);
}
@Override
public String prdNoCheck(String prdNo) {
return dao.prdNoCheck(prdNo);
}
}
IProductDAO
package com.spring_mvc.mybatis.dao;
import java.util.ArrayList;
import java.util.HashMap;
import com.spring_mvc.mybatis.model.ProductVO;
public interface IProductDAO {
ArrayList<ProductVO> listAllProduct(); // 전체 상품 조회
void insertProduct(ProductVO prdVo); // 상품 정보 등록
void updateProduct(ProductVO prdVo); // 상품 정보 수정
void deleteProduct(String prdNo); // 상품 정보 삭제
ProductVO detailViewProduct(String prdNo);// 상세 상품 조회
String prdNoCheck(String prdNo); // 상품 번호 중복 확인
}
ProductMapper 추가
<!-- 상품번호 중복 확인 -->
<select id="prdNoCheck" resultType="string" parameterType="string">
SELECT prdNo FROM product WHERE prdNo=#{prdNo}
</select>
ProdcutController 추가 : prdNo 전달 받아서 서비스에게 전달
받은 결과 있으면 ( = null이 아니면 ) “no_use” / 아니면 “use” 반환
//상품번호 중복 확인
@ResponseBody
@RequestMapping("product/prdNoCheck")
public String prdNoCheck(@RequestParam("prdNo") String prdNo) {
// 서비스 호출 -> DAO -> Mapper -> prdNo가 존재하면 prdNo 반환
String prdNo_result = service.prdNoCheck(prdNo);
String result = "use";
if(prdNo_result != null) // prdNo_result가 받은 값이 있으면 (널이 아니면)
result = "no_use";
return result;
}
예제 2 : 상품 검색 : 상품 검색 결과를 현재 페이지에 출력
index.jsp 추가
<a href="product/productSearchForm">상품 검색</a><br><br>
<a href="product/productSearchForm2">상품 검색2</a><br><br>
ProductMapper 추가
<!-- 상품 검색 -->
<select id="productSearch" resultMap="prdResult" parameterType="hashmap">
SELECT * FROM product WHERE
<!-- 상품명으로 검색 -->
<choose>
<when test="type != null and type.equals('prdName')">
prdName LIKE CONCAT('%', #{keyword}, '%')
</when>
<!-- 제조회사로 검색 -->
<when test="type != null and type.equals('prdCompany')">
prdCompany LIKE CONCAT('%', #{keyword}, '%')
</when>
</choose>
</select>
IProductDAO, IProductService 추가
ArrayList<ProductVO> productSearch(HashMap<String, Object> map); // 상품 검색
ProductService 추가
@Override
public ArrayList<ProductVO> productSearch(HashMap<String, Object> map) {
return dao.productSearch(map);
}
방법1 : Ajax / @ResponseBody 사용
- 컨트롤러에서 Ajax로 ArrayList 반환 (jackson-databind - pom.xml에 추가)
- Ajax success:function(){에서 출력} : 자바스크립트로 출력
productSearchForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 검색</title>
<script src="<c:url value='/js/jquery-3.6.0.min.js'/>"></script>
<script src="<c:url value='/js/productSearch.js'/>"></script>
</head>
<body>
<h3>상품 검색</h3>
<form id="prdSearchFrm">
<select id="type" name="type">
<option value="">검색 조건 선택</option>
<option value="prdName">상품명</option>
<option value="prdCompany">제조회사</option>
</select>
<input type="text" name="keyword">
<input type="submit" value="검색">
</form>
<div id="searchResultbox"></div>
</body>
</html>
ProductController 추가
// 상품 검색폼으로 이동
@RequestMapping("/product/productSearchForm")
public String productSearchForm() {
return "product/productSearchForm";
}
// 상품 검색
@ResponseBody
@RequestMapping("/product/productSearch")
public ArrayList<ProductVO> productSearch(@RequestParam HashMap<String, Object> param,
Model model){
ArrayList<ProductVO> prdList = service.productSearch(param);
model.addAttribute("prdList", prdList);
return prdList;
}
productSearch.js
/**
* productSearch.js
상품 검색
*/
$(document).ready(function(){
$('#prdSearchFrm').on('submit', function(){
event.preventDefault();
var formData = $(this).serialize();
// serialize() : 폼에 입력한 값을 쿼리 스트링 방식의 데이터로 변환
//type=prdName&keyword=노트북...
$.ajax({
type:"post",
url:"productSearch",
data:formData,
success:function(result){ // 컨트롤러에서 반환한 prdList를 result가 받음
//alert(result.length);
// 반환된 결과(ArrayList<ProductVO>)를 searchResultbox에 테이블 형태로 출력
$('#searchResultbox').empty();
$('#searchResultbox').append('<table id="resultTable" border="1" width="600">' +
'<tr><th>상품번호</th><th>상품명</th><th>가격</th>' +
'<th>제조사</th><th>재고</th><th>사진</th></tr>');
if(result == ""){
$('#resultTable').append('<tr align="center"><td colspan="6">찾는 상품이 없습니다 </td></tr>');
}else{
for(var i=0; i <result.length; i++){
$('#resultTable').append('<tr><td>' + result[i].prdNo + '</td><td>' +
result[i].prdName + '</td><td>' +
result[i].prdPrice+ '</td><td>' +
result[i].prdCompany + '</td><td>' +
result[i].prdStock + '</td><td>' +
'<img src="/mybatis/images/' + result[i].prdNo + '.jpg" width="30" height="20"></td></tr>');
}
}
$('#searchResultbox').append('</table>');
},
error:function(data, textStatus){
alert("전송 실패");
}
});
});
});
productSearchResultView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 검색 결과</title>
</head>
<body>
<h3>상품 검색 결과</h3>
<table border="1" width="600">
<tr><th>상품번호</th><th>상품명</th><th>가격</th>
<th>제조사</th><th>재고</th><th>사진</th></tr>
<c:forEach items="${prdList }" var="prd">
<tr><td><a href="<c:url value='/product/detailViewProduct/${prd.prdNo}'/>">${prd.prdNo }</a></td>
<td>${prd.prdName }</td>
<td>${prd.prdPrice }</td>
<td>${prd.prdCompany }</td>
<td>${prd.prdStock }</td>
<td><img src="<c:url value='/images/${prd.prdNo}.jpg'/>" width="30" height="20">
<!-- 또는 -->
<img src="/mybatis/images/${prd.prdNo}.jpg" width="30" height="20"></td>
</tr>
</c:forEach>
</table><br>
<a href="/mybatis/">메인 화면으로 이동</a><br>
<a href="<c:url value='/' />">메인 화면으로 이동</a> <!-- 같은 표현 -->
</body>
</html>
방법2 : @ResponseBody 없이 뷰 페이지 리턴 & Ajax에서 현재 페이지에 결과 뷰 페이지를 삽입
- JSTL 사용해서 테이블 형태로 출력
ProductController 추가
// 상품 검색 폼2 이동
@RequestMapping("/product/productSearchForm2")
public String productSearchForm2() {
return "product/productSearchForm2";
}
// 상품 검색 폼2 검색
@RequestMapping("/product/productSearch2")
public String productSearch2(@RequestParam HashMap<String, Object> param,
Model model){
ArrayList<ProductVO> prdList = service.productSearch(param);
model.addAttribute("prdList", prdList);
return "product/productSearchResultView";
}
productSearchForm2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 검색2</title>
<script src="<c:url value='/js/jquery-3.6.0.min.js/' />"></script>
<script src="<c:url value='/js/productSearch2.js/' />"></script>
</head>
<body>
<h3>상품 검색</h3>
<form id="prdSearchFrm2">
<select id="type" name="type">
<option value="">검색 조건 선택</option>
<option value="prdName">상품명</option>
<option value="prdCompany">제조회사</option>
</select>
<input type="text" name="keyword">
<input type="submit" value="검색">
</form>
<div id="searchResultBox"></div>
</body>
</html>
productSearch2.js
/**
* productSearch2.js
상품 검색
*/
$(document).ready(function(){
$('#prdSearchFrm2').on('submit', function(){
event.preventDefault();
var formData = $(this).serialize();
// serialize() : 폼에 입력한 값을 쿼리 스트링 방식의 데이터로 변환
//type=prdName&keyword=노트북
$.ajax({
type:"post",
url:"productSearch2",
data:formData,
success:function(result){
$('#searchResultBox').html(result);
},
error:function(data, textStatus){
alert("전송 실패");
}
});
});
});
productSearchResultView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 검색 결과</title>
</head>
<body>
<h3>상품 검색 결과2</h3>
<table border="1" width="600">
<tr><th>상품번호</th><th>상품명</th><th>가격</th><th>제조사</th><th>재고</th><th>사진</th></tr>
<c:choose>
<c:when test="${empty prdList}">
<tr align="center"><td colspan="6">찾는 상품이 없습니다.</td></tr>
</c:when>
<c:otherwise>
<c:forEach items="${prdList }" var="prd">
<tr><td><a href="<c:url value='/product/detailViewProduct/${prd.prdNo}'/>">${prd.prdNo }</a></td>
<td>${prd.prdName }</td>
<td>${prd.prdPrice }</td>
<td>${prd.prdCompany }</td>
<td>${prd.prdStock }</td>
<td><img src="c:url value='/images/${prd.prdNo}.jpg' />" width="30" height="20"/></td></tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<br>
<a href="<c:url value='/' />">메인 화면으로 이동</a>
</body>
</html>
예제 3 : 도서 관리 프로그램 : 도서 등록 폼 - 도서 번호 중복확인 / 도서 검색 기능 추가