TIL/academy

국비 TIL(Today I Learned) 20220810 검색하기, sell, manager, anboard테이블

토희 2022. 8. 10. 17:51
728x90

어제 한거 복습

 

우리는 어제 이렇게 썼지만,

마리아DB limit쓰면 행 갯수 제한할수도 있음

 

 

페이지 추가 후

 

 

 

검색 구현

sellList.jsp

params에는 4개가 들어있음 no, page, searchGbn, searchTxt

 

쿼리작성

Dynamic Query(동적 쿼리) : 조건에 따라 쿼리의 형태가 변경되는 쿼리

-> 태그로 구현

iBatis와 MyBatis의 경우 기능은 유사하나 이름과 형태가 다소 틀림(우리는 지금 MyBatis 쓰고 있음)

iBatis가 좀더 직관적이래, MyBatis의 경우 코어태그와 형태가 동일

el태그가 없어 c가 없음

 

getSellCnt, getSellList 두군데에 쿼리 변경

 

WHERE 1=1 대신 상시 조건을 WHERE구문에 넣어주면 돼

예를 들어 이제 삭제를 실제 삭제 안하고, 업데이트로 한다음 삭제 안된 데이터들만 보여주걸래 화면에는(DB에는 삭제한 데이터도 있고) 그럴때 삭제 안된 데이터들만 보여주는 조건을 WHERE 1=1 쓰면 된데

 

sellList.jsp

 

sellDetail.jsp

 

sellUpdate.jsp

 

sellRes.jsp

Res부분

 

검색 기능 잘 작동

 

검색정보 추가후

오늘은 jsp랑 쿼리만 수정함

 

 

manager테이블 실습

managerList.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>Insert title here</title>
<style type="text/css">
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

#pagingWrap span{
	cursor: pointer;
}

</style>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	if("${param.searchGbn}" != "") { // 검색구분이 넘어오면
		$("#searchGbn").val("${param.searchGbn}");	
	}
	
	$("tbody").on("click", "tr", function () {
		console.log($(this).attr("no"));
		$("#no").val($(this).attr("no"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		$("#actionForm").attr("action","managerDetail");
		$("#actionForm").submit();
	})
	
	$("#insertBtn").on("click", function () {
		location.href = "managerInsert";
	});
	
	$("#pagingWrap").on("click", "span", function () {
		$("#page").val($(this).attr("page"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		$("#actionForm").attr("action","managerList");
		$("#actionForm").submit();
	});
	

	$("#searchBtn").on("click", function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$("#page").val("1"); // 페이지 초기화
		
		$("#actionForm").attr("action","managerList");
		$("#actionForm").submit();
	})
	
})

</script>
</head>
<body>
<!-- 기존 검색 내용 유지용 -->
<input type="hidden" id="oldGbn" value="${param.searchGbn}"/>
<input type="hidden" id="oldTxt" value="${param.searchTxt}"/>
<form action="#" id="actionForm" method="post">
	<input type="hidden" id="no" name="no" />
	<input type="hidden" id="page" name="page" value="${page}" />
	<select name="searchGbn" id="searchGbn">
		<option value="0">이름</option>
		<option value="1">부서</option>
	</select>
	<input type="text" name="searchTxt" id="searchTxt" value="${param.searchTxt}"/> <!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 -->
	<input type="button" value="검색" id="searchBtn" />
	<input type="button" value="추가" id="insertBtn" />
</form>
<table>
	<thead>
		<tr>
			<th>사원번호</th>
			<th>이름</th>
			<th>부서</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach var="data" items="${list}">
			<tr no="${data.EMP_NO}">
				<td>${data.EMP_NO}</td>
				<td>${data.NAME}</td>
				<td>${data.DEPT}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
<div id="pagingWrap">
<span page="1">처음</span>
<!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요-->
<!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 -->
<c:choose>
	<c:when test="${page eq 1}">
		<span page="1">이전</span>
	</c:when>
	<c:otherwise>
		<span page="${page - 1}">이전</span>
	</c:otherwise>
</c:choose>
<!-- 페이지들 -->
<c:forEach var="i" begin="${pd.startP}" end="${pd.endP}" step="1">
	<%-- 현재 페이지의 경우 별도 처리 --%>
	<c:choose>
		<c:when test="${i eq page}"> <%-- 현재페이지 --%>
			<span page="${i}"><b>${i}</b></span>
		</c:when>
		<c:otherwise> <%-- 다른페이지 --%>
			<span page="${i}">${i}</span>
		</c:otherwise>
	</c:choose>
</c:forEach>

<!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 -->
<c:choose>
	<c:when test="${page eq pd.maxP}">
		<span page="${pd.maxP}">다음</span>
	</c:when>
	<c:otherwise>
		<span page="${page + 1}">다음</span>
	</c:otherwise>
</c:choose>

<span page="${pd.maxP}">마지막</span>
</div>
</body>
</html>

 

Test_SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace : 클래스와 동일, 이 파일의 대표명 -->
<mapper namespace="test">
	
	<select id="getManagerList" resultType="hashmap" parameterType="hashmap">
		SELECT S.EMP_NO, S.NAME, S.DEPT
		FROM(SELECT EMP_NO, NAME, DEPT,
		ROW_NUMBER() OVER(ORDER BY EMP_NO DESC) AS RNK
		FROM MANAGER
		WHERE 1 =1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND NAME LIKE '%' || #{searchTxt}|| '%'
				</when>
				<when test="searchGbn == 1">
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
		</if>
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	</select>

	<select id="getManager" resultType="hashmap" parameterType="hashmap">
		SELECT EMP_NO, NAME, DEPT
		FROM MANAGER
		WHERE EMP_NO = #{no}
	</select>
	
	<insert id="insertManager" parameterType="hashmap">
		INSERT INTO MANAGER(EMP_NO, NAME, DEPT)
		VALUES(MANAGER_SEQ.NEXTVAL, #{name}, #{deptName})
	</insert>
	
	<delete id="deleteManager" parameterType="hashmap">
		DELETE FROM MANAGER
		WHERE EMP_NO = #{no}
	</delete>
	
	<update id="updateManager" parameterType="hashmap">
		UPDATE MANAGER SET NAME = #{name},
                DEPT = #{deptName}
                WHERE EMP_NO = #{no}
	</update>
	
	
	<select id="getManagerCnt" parameterType="hashmap" resultType="Integer">
		SELECT COUNT(*) AS CNT 
		FROM MANAGER
		WHERE 1 =1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND NAME LIKE '%' || #{searchTxt} || '%'
				</when>
				<when test="searchGbn == 1">
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
		</if>
	</select>

	
</mapper>

managerDetail, managerUpdate, managerRes

<!-- 전 화면에서 넘어온 검색 정보 -->
<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>

 

이거 붙여주기

 

 

 

 

테이블 새로 만들기

 

시퀀스 이름: ANBOARD_SEQ

 

 

 

 

sellList.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>Insert title here</title>
<style type="text/css">
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

#pagingWrap span{
	cursor: pointer;
}

</style>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	
	if("${param.searchGbn}" != "") { // 검색구분이 넘어오면
		$("#searchGbn").val("${param.searchGbn}");	
	}
	
	$("tbody").on("click", "tr", function () {
		console.log($(this).attr("no"));
		$("#no").val($(this).attr("no"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		$("#actionForm").attr("action","sellDetail");
		$("#actionForm").submit();
	})
	
	$("#insertBtn").on("click", function () {
		location.href = "sellInsert";
	});
	
	
	$("#pagingWrap").on("click", "span", function () {
		$("#page").val($(this).attr("page"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		
		$("#actionForm").attr("action","sellList");
		$("#actionForm").submit();
	});
	
	$("#searchBtn").on("click", function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$("#page").val("1"); // 페이지 초기화
		
		$("#actionForm").attr("action","sellList");
		$("#actionForm").submit();
	})
	
});

</script>
</head>
<body>
<!-- 기존 검색 내용 유지용 -->
<input type="hidden" id="oldGbn" value="${param.searchGbn}"/>
<input type="hidden" id="oldTxt" value="${param.searchTxt}"/>
<form action="#" id="actionForm" method="post">
	<input type="hidden" id="no" name="no" /> 
	<input type="hidden" id="page" name="page" value="${page}" />  <!-- 상세보기 갈때 page 가져갈거임 -->
	<select name="searchGbn" id="searchGbn">
		<option value="0">품목</option>
		<option value="1">수량</option>
	</select>
	<input type="text" name="searchTxt" id="searchTxt" value="${param.searchTxt}"/> <!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 -->
	<input type="button" value="검색" id="searchBtn" />
	<input type="button" value="추가" id="insertBtn" />
</form>

<br />
<table>
	<thead>
		<tr>
			<th>판매번호</th>
			<th>품목</th>
			<th>수량</th>
			<th>일자</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach var="data" items="${list}">
			<tr no="${data.SELL_NO}">
				<td>${data.SELL_NO}</td>
				<td>${data.ITEM_NAME}</td>
				<td>${data.COUNT}</td>
				<td>${data.SELL_DT}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
<div id="pagingWrap">
<span page="1">처음</span>
<!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요-->
<!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 -->
<c:choose>
	<c:when test="${page eq 1}">
		<span page="1">이전</span>
	</c:when>
	<c:otherwise>
		<span page="${page - 1}">이전</span>
	</c:otherwise>
</c:choose>
<!-- 페이지들 -->
<c:forEach var="i" begin="${pd.startP}" end="${pd.endP}" step="1">
	<%-- 현재 페이지의 경우 별도 처리 --%>
	<c:choose>
		<c:when test="${i eq page}"> <%-- 현재페이지 --%>
			<span page="${i}"><b>${i}</b></span>
		</c:when>
		<c:otherwise> <%-- 다른페이지 --%>
			<span page="${i}">${i}</span>
		</c:otherwise>
	</c:choose>
</c:forEach>

<!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 -->
<c:choose>
	<c:when test="${page eq pd.maxP}">
		<span page="${pd.maxP}">다음</span>
	</c:when>
	<c:otherwise>
		<span page="${page + 1}">다음</span>
	</c:otherwise>
</c:choose>

<span page="${pd.maxP}">마지막</span>
</div>
</body>
</html>

 

sellDetail.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>Insert title here</title>
<script type="text/javascript" 
		src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#listBtn").on("click", function() {
		$("#actionForm").attr("action","sellList"); 
		$("#actionForm").submit();
	});
	
	$("#deleteBtn").on("click", function () {
		if(confirm("삭제하시곘습니까?")){
			$("#actionForm").attr("action","sellRes"); 
			$("#actionForm").submit();
		}
	})
	
	$("#updateBtn").on("click", function () {
		$("#actionForm").attr("action","sellUpdate");
		$("#actionForm").submit();
	});
});

</script>
</head>
<body>
<!-- form action에서 #은 아무런 이동을 하지 않는다. -->
<form action="#" id="actionForm" method="post">
<!-- 상세보기에서는 삭제만 쓸거니 d를 박아줘도 됨, 수정이면 수정페이지로 이동할거니 -->
<!-- 이 페이지에서 수정도 같이하면 value에 값 비어두기 -->
	<input type="hidden" name="gbn" value="d" /> <!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 -->
	<input type="hidden" name="no" value="${data.SELL_NO}" /> <!-- 삭제하기위해  번호 보내주기 -->
	 <!-- 전 화면에서 넘어온 페이지 정보 -->
	<input type="hidden" name="page" value="${param.page}" />
	<!-- 전 화면에서 넘어온 검색 정보 -->
	<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
	<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
</form>	
	판매번호: ${data.SELL_NO}<br/>
	품목: ${data.ITEM_NAME}<br/>
	수량: ${data.COUNT}<br/>
	일자: ${data.SELL_DT}<br/>
<input type="button" value="수정" id="updateBtn" />
<input type="button" value="삭제" id="deleteBtn" />
<input type="button" value="목록" id="listBtn" />
</body>
</html>

 

sellInsert.jsp(Insert는 변동사항 없음)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#listBtn").on("click", function () {
		history.back();
	});
	
	$("#insertBtn").on("click", function () {
		if($("#count").val() == ""){
			alert("수량을 입력하세요");
			$("#count").focus();
		} else if($("#count").val()*1 < 1){ // 문자열이기 때문에 *1 해줘야 숫자로 바뀜
			alert("수량은 1개 이상이어야 합니다");
			$("#count").focus();
		}
		else if($("#sellDt").val() == ""){
			alert("일자를 입력하세요");
			$("#sellDt").focus();
		} else {
			$("#actionForm").submit();
		}
	});
});

</script>
</head>
<body>
<!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 -->
<!-- select 전달하기 위해  name줘야함 -->
<!-- option value 지정해줘야함! -->
<form action="sellRes" id="actionForm" method="post">
<!-- gbn : 구분, 혹은 flag -->
<!-- 구분: i - insert, u - update, d - delete -->
<input type="hidden" name="gbn" value="i"/>
품목명
<select name="itemName">
	<option value="감자">감자</option>
	<option value="고구마">고구마</option>
	<option value="애호박">애호박</option>
	<option value="호박">호박</option>
	<option value="호박고구마">호박고구마</option>
</select>
<br />
수량 <input type="number" name="count" id="count" value="0" />
<br />
일자 <input type="date" name="sellDt" id="sellDt" />
<br />
</form>
<input type="button" value="등록" id="insertBtn">
<input type="button" value="목록" id="listBtn">
</body>
</html>

 

sellRes.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	
	// el tag를 script에서 사용시
	// 해당 위치에 값이 그대로 들어가기 때문에 보편적으로 ''를 달아서 문자열로 인식시킨 뒤 사용
	// ${res}해서  success가 들어올경우, success 이렇게되면 변수로 인식되서 "success" 이렇게 인식되게
	// "${res}"로 써줌
	switch("${res}"){
	case "success" : 
		if("${param.gbn}" == "u"){ // 수정이 성공했을 떄
			$("#goForm").submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = "sellList" 
		}
		break;
	case "failed" : 
		alert("작업에 실패하였습니다.");
		history.back();
		break;
	case "error" : 
		alert("작업중 문제가 발생 하였습니다.");
		history.back();
		break;
	}
});
</script>
</head>
<body>
<form action="sellDetail" id="goForm" method="post">
	<input type="hidden" name="no" value="${param.no}" /> <!-- 전 화면에서 넘어오니까 param.no -->
	<input type="hidden" name="page" value="${param.page}" /> <!-- 전 화면에서 넘어온 페이지 정보 -->
	<!-- 전 화면에서 넘어온 검색 정보 -->
	<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
	<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
</form>
</body>
</html>

sellUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	// 기존값으로 셀렉트박스 선택 내용 변경
	$("#itemName").val("${data.ITEM_NAME}");
	
	$("#listBtn").on("click", function () {
		history.back();
	});
	
	$("#updateBtn").on("click", function () {
		if($("#count").val() == ""){
			alert("수량을 입력하세요");
			$("#count").focus();
		} else if($("#count").val()*1 < 1){ // 문자열이기 때문에 *1 해줘야 숫자로 바뀜
			alert("수량은 1개 이상이어야 합니다");
			$("#count").focus();
		}
		else if($("#sellDt").val() == ""){
			alert("일자를 입력하세요");
			$("#sellDt").focus();
		} else {
			$("#actionForm").submit();
		}
	});
});

</script>
</head>
<body>
<!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 -->
<!-- select 전달하기 위해  name줘야함 -->
<!-- option value 지정해줘야함! -->
<form action="sellRes" id="actionForm" method="post">
<!-- gbn : 구분, 혹은 flag -->
<!-- 구분: i - insert, u - update, d - delete -->
<input type="hidden" name="gbn" value="u"/>
<input type="hidden" name="no" value="${data.SELL_NO}"/> <!-- 이 번호만 수정해라라는 조건 달기위해 필요 -->
<input type="hidden" name="page" value="${param.page}" /> <!-- 전 화면에서 넘어온 페이지 정보 -->
<!-- 전 화면에서 넘어온 검색 정보 -->
<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
판매번호 : ${data.SELL_NO}<br/>
품목명
<select name="itemName" id="itemName">
	<option value="감자">감자</option>
	<option value="고구마">고구마</option>
	<option value="애호박">애호박</option>
	<option value="호박">호박</option>
	<option value="호박고구마">호박고구마</option>
</select>
<br />
수량 <input type="number" name="count" id="count" value="${data.COUNT}" />
<br />
일자 <input type="date" name="sellDt" id="sellDt" value="${data.SELL_DT}" />
<br />
</form>
<input type="button" value="수정" id="updateBtn">
<input type="button" value="뒤로가기" id="listBtn">
</body>
</html>

Text_SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace : 클래스와 동일, 이 파일의 대표명 -->
<mapper namespace="test">
	<!-- select : 조회 
		id: 구분자, 메소드명과 동일
		resultType : 조회 결과 중 한줄에 대한 자료 형태를 지정
		hashmap: mybatis-config.xml에서 별칭 지정해놔서 줄여쓸수있는거임
		쿼리 삽입시 주의사항: ;이 있는경우 문제가 발생한다. 이유는 해당 쿼리 실행시 자동으로 추가되기 때문
	-->
	<select id="getSellList" resultType="hashmap" parameterType="hashmap">
		SELECT S.SELL_NO, S.ITEM_NAME, S.COUNT, S.SELL_DT
		FROM (SELECT SELL_NO, ITEM_NAME, COUNT, SELL_DT,
       		  ROW_NUMBER() OVER(ORDER BY SELL_DT DESC, SELL_NO DESC) AS RNK
			  FROM SELL
			  WHERE 1 = 1
			<if test="searchTxt != null and searchTxt != ''"> <!-- 검색어가 있다면 -->
				<choose>
					<when test="searchGbn == 0"> <!-- 품목 -->
						AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
					</when>
					<when test="searchGbn == 1"> <!-- 수량 -->
						AND COUNT = #{searchTxt}
					</when>
				</choose>
			</if>
             ) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	</select>
	
	<!-- 
		parameterType : 실행시 받는 값 
		#{키} : 헤당위치에 문자열로 키에 해당하는 값을 넣어준다
		ex) no에 3이 들어있는 경우
		WHERE SELL_NO = #{no}
		=> WHERE SELL_NO = '3' // 문자열이기 때문에  ' '이 들어감
		parameterType dao받는값, resultType값이 db실행결과
	-->
	<select id="getSell" resultType="hashmap" parameterType="hashmap">
		SELECT SELL_NO, ITEM_NAME, COUNT, SELL_DT
		FROM SELL
		WHERE SELL_NO = #{no}
	</select>
	
	<!-- insert는 resultType 이 없음 -->
	<insert id="insertSell" parameterType="hashmap">
		INSERT INTO SELL(SELL_NO, ITEM_NAME, COUNT, SELL_DT)
		VALUES(SELL_SEQ.NEXTVAL, #{itemName},#{count},#{sellDt})
	</insert>
	
	<delete id="deleteSell" parameterType="hashmap">
		DELETE FROM SELL
		WHERE SELL_NO = #{no}
	</delete>
	
	<update id="updateSell" parameterType="hashmap">
		UPDATE SELL SET ITEM_NAME = #{itemName},
                COUNT = #{count},
                SELL_DT = #{sellDt}
       	WHERE SELL_NO = #{no}
	</update>
	
	<select id="getManagerList" resultType="hashmap" parameterType="hashmap">
		SELECT S.EMP_NO, S.NAME, S.DEPT
		FROM(SELECT EMP_NO, NAME, DEPT,
		ROW_NUMBER() OVER(ORDER BY EMP_NO DESC) AS RNK
		FROM MANAGER
		WHERE 1 =1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND NAME LIKE '%' || #{searchTxt}|| '%'
				</when>
				<when test="searchGbn == 1">
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
		</if>
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	</select>

	<select id="getManager" resultType="hashmap" parameterType="hashmap">
		SELECT EMP_NO, NAME, DEPT
		FROM MANAGER
		WHERE EMP_NO = #{no}
	</select>
	
	<insert id="insertManager" parameterType="hashmap">
		INSERT INTO MANAGER(EMP_NO, NAME, DEPT)
		VALUES(MANAGER_SEQ.NEXTVAL, #{name}, #{deptName})
	</insert>
	
	<delete id="deleteManager" parameterType="hashmap">
		DELETE FROM MANAGER
		WHERE EMP_NO = #{no}
	</delete>
	
	<update id="updateManager" parameterType="hashmap">
		UPDATE MANAGER SET NAME = #{name},
                DEPT = #{deptName}
                WHERE EMP_NO = #{no}
	</update>
	
	<select id="getDivsList" resultType="hashmap">
		SELECT DIV_CODE, DIV_NAME FROM DIVS ORDER BY DIV_CODE
	</select>
	
	<select id="getDivs" resultType="hashmap" parameterType="hashmap">
		SELECT DIV_CODE, DIV_NAME FROM DIVS
		WHERE DIV_CODE = #{no}
	</select>
	
	<insert id="insertDivs" parameterType="hashmap">
		INSERT INTO DIVS(DIV_CODE, DIV_NAME)
		VALUES((SELECT #{divCode} || LPAD(NVL(MAX(REPLACE(DIV_CODE, #{divCode}, '')),0) + 1,2,0 )
		FROM DIVS
		WHERE DIV_CODE LIKE #{divCode} || '%'), #{divName})
	</insert>
	
	<delete id="deleteDivs" parameterType="hashmap">
		DELETE FROM DIVS
		WHERE DIV_CODE = #{no}
	</delete>
	
	<update id="updateDivs" parameterType="hashmap">
		UPDATE DIVS SET DIV_CODE = #{divCode},
                DIV_NAME = #{divName}
                WHERE DIV_CODE = #{no}
	</update>
	
	
	<select id="getBookList" resultType="hashmap">
		SELECT BOOK_NO, BOOK_TITLE, BOOK_AUTHOR
		FROM BOOK
	</select>
	
	<select id="getBook" resultType="hashmap" parameterType="hashmap">
		SELECT BOOK_NO, BOOK_TITLE, BOOK_AUTHOR, BOOK_CO,
		TO_CHAR(BOOK_DT,'YYYY-MM-DD') AS BOOK_DT, TO_CHAR(REG_DT,'YYYY-MM-DD') AS REG_DT
		FROM BOOK
		WHERE BOOK_NO = #{no}
	</select>
	
	<insert id="insertBook" parameterType="hashmap">
		INSERT INTO BOOK(BOOK_NO, BOOK_TITLE, BOOK_AUTHOR, BOOK_CO, BOOK_DT)
		VALUES(BOOK_SEQ.NEXTVAL, #{bookTitle}, #{bookAuthor}, #{bookCo}, #{bookDt})
	</insert>
	
	<delete id="deleteBook" parameterType="hashmap">
		DELETE FROM BOOK
		WHERE BOOK_NO = #{no}
	</delete>
	       
	<update id="updateBook" parameterType="hashmap">
			UPDATE BOOK SET BOOK_TITLE = #{bookTitle},
                BOOK_AUTHOR = #{bookAuthor},
                BOOK_CO = #{bookCo},
                BOOK_DT = #{bookDt}
                WHERE BOOK_NO = #{no}
	</update>
	
	<select id="getSellCnt" parameterType="hashmap" resultType="Integer">
		SELECT COUNT(*) AS CNT 
		FROM SELL
		WHERE 1 = 1
		<if test="searchTxt != null and searchTxt != ''"> <!-- 검색어가 있다면 -->
			<choose>
				<when test="searchGbn == 0"> <!-- 품목 -->
					AND ITEM_NAME LIKE '%' || #{searchTxt} || '%'
				</when>
				<when test="searchGbn == 1"> <!-- 수량 -->
					AND COUNT = #{searchTxt}
				</when>
			</choose>
		</if>
	</select>
	
	<select id="getManagerCnt" parameterType="hashmap" resultType="Integer">
		SELECT COUNT(*) AS CNT 
		FROM MANAGER
		WHERE 1 =1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND NAME LIKE '%' || #{searchTxt} || '%'
				</when>
				<when test="searchGbn == 1">
					AND DEPT LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
		</if>
	</select>
	
</mapper>

 

 

manager 실습 코드

jsp적기

 

 

 

 

anboard 실습 코드

pshExamController.java

package com.spring.sample.web.test.controller;

import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITestService1;

@Controller
public class PshExamController {
	// 3.
	@Autowired
	public ITestService1 iTestService1;
	
	@Autowired
	public IPagingService ips; // 페이징 서비스 객체 주입
	
	/*
	 * Database나 파일 같이 외부에 접근하는 경우 외적 요인으로 문제가 발샐할 수 있음으로 예외처리가 반드시 필요하다.
	 */
	
	// 실습
	@RequestMapping(value = "/anboardList")
	public ModelAndView anboardList(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) throws Throwable {
		
		// 현재페이지
		int page = 1;

		if (params.get("page") != null) { // 페이지가 넘어왔을때
			page = Integer.parseInt(params.get("page")); // 받아온 페이지 할당
		}

		// 총 데이터 개수 취득
		int cnt = iTestService1.getAnboardCnt(params);

		// 페이징 데이터 계산
		// ips.getPagingData(page, maxCount, viewCnt, pageCnt)
		HashMap<String, Integer> pd = ips.getPagingData(page, cnt, 3, 2);

		// 파라미터에 시작, 종료값 추가
		// 한쪽으로 필요 데이터를 몰았다?
		params.put("start", Integer.toString(pd.get("start")));
		params.put("end", Integer.toString(pd.get("end")));

				
		// 데이터 취득
		List<HashMap<String, String>> list = iTestService1.getAnboardList(params);

		// 목록 데이터
		mav.addObject("list", list);
		// 페이징 정보
		mav.addObject("pd", pd);
		// 현재 페이지
		mav.addObject("page", page);
		mav.setViewName("test/anboardList");

		return mav;
	}

	@RequestMapping(value = "/anboardDetail")
	public ModelAndView anboardDetail(@RequestParam HashMap<String, String> params, ModelAndView mav) throws Throwable {

		if (params.get("no") == null || params.get("no") == "") {
			mav.setViewName("redirect:anboardList");

		} else {
			HashMap<String, String> data = iTestService1.getAnboard(params);

			mav.addObject("data", data);
			mav.setViewName("test/anboardDetail");
		}

		return mav;
	}

	@RequestMapping(value = "/anboardInsert")
	public ModelAndView managerInsert(ModelAndView mav) {
		mav.setViewName("test/anboardInsert");
		return mav;

	}

	@RequestMapping(value = "/anboardRes")
	public ModelAndView anboardInsertRes(@RequestParam HashMap<String, String> params, ModelAndView mav)
			throws Throwable {

		System.out.println(params.toString());
		try {
			int cnt = 0; // insert, update, delete 다 쓸거기 때문에 처음에 0줌

			switch (params.get("gbn")) {
			case "i":
				cnt = iTestService1.insertAnboard(params);
				break;
			case "u":
				cnt = iTestService1.updateAnboard(params);
				break;
			case "d":
				cnt = iTestService1.deleteAnboard(params);
				break;
			}

			if (cnt > 0) { // 1건 이상 등록된 경우
				mav.addObject("res", "success");
			} else { // 등록 안된 경우
				mav.addObject("res", "failded");
			}
		} catch (Exception e) { // 예외 발생시
			e.printStackTrace();
			mav.addObject("res", "error");
		}
		mav.setViewName("test/anboardRes");
		return mav;
	}

	// 글 수정페이지
	@RequestMapping(value = "/anboardUpdate")
	public ModelAndView anboardUpdate(@RequestParam HashMap<String, String> params, ModelAndView mav) throws Throwable {
		// 기존데이터 조회해와야함
		HashMap<String, String> data = iTestService1.getAnboard(params);
		mav.addObject("data", data);

		mav.setViewName("test/anboardUpdate");

		return mav;

	}
}

ITestService1.java

package com.spring.sample.web.test.service;

import java.util.HashMap;
import java.util.List;

public interface ITestService1 {

	public List<HashMap<String, String>> getAnboardList(HashMap<String, String> params) throws Throwable;

	public HashMap<String, String> getAnboard(HashMap<String, String> params) throws Throwable;

	public int insertAnboard(HashMap<String, String> params) throws Throwable;

	public int updateAnboard(HashMap<String, String> params) throws Throwable;

	public int deleteAnboard(HashMap<String, String> params) throws Throwable;

	public int getAnboardCnt(HashMap<String, String> params) throws Throwable;

}

TestService1.java

package com.spring.sample.web.test.service;

import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spring.sample.web.test.dao.ITestDao1;

@Service
public class TestService1 implements ITestService1 {
	@Autowired
	public ITestDao1 iTestDao1;
	

	@Override
	public List<HashMap<String, String>> getAnboardList(HashMap<String, String> params) throws Throwable {
		return iTestDao1.getAnboardList(params);
	}

	@Override
	public HashMap<String, String> getAnboard(HashMap<String, String> params) throws Throwable {
		return iTestDao1.getAnboard(params);
	}

	@Override
	public int insertAnboard(HashMap<String, String> params) throws Throwable {
		return iTestDao1.insertAnboard(params);
	}

	@Override
	public int updateAnboard(HashMap<String, String> params) throws Throwable {
		return iTestDao1.updateAnboard(params);
	}

	@Override
	public int deleteAnboard(HashMap<String, String> params) throws Throwable {
		return iTestDao1.deleteAnboard(params);
	}

	@Override
	public int getAnboardCnt(HashMap<String, String> params) throws Throwable {
		return iTestDao1.getAnboardCnt(params);
	}
}

ITestDao1.java

package com.spring.sample.web.test.dao;

import java.util.HashMap;
import java.util.List;

public interface ITestDao1 {

	public List<HashMap<String, String>> getAnboardList(HashMap<String, String> params) throws Throwable;

	public HashMap<String, String> getAnboard(HashMap<String, String> params) throws Throwable;

	public int insertAnboard(HashMap<String, String> params) throws Throwable;

	public int deleteAnboard(HashMap<String, String> params) throws Throwable;

	public int updateAnboard(HashMap<String, String> params) throws Throwable;

	public int getAnboardCnt(HashMap<String, String> params) throws Throwable;

}

TestDao1.java

package com.spring.sample.web.test.dao;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class TestDao1 implements ITestDao1 {
	
	@Autowired
	public SqlSession sqlSession;

	@Override
	public List<HashMap<String, String>> getAnboardList(HashMap<String, String> params) throws Throwable {
		return sqlSession.selectList("test.getAnboardList", params);
	}

	@Override
	public HashMap<String, String> getAnboard(HashMap<String, String> params) throws Throwable {
		return sqlSession.selectOne("test.getAnboard", params);
	}

	@Override
	public int insertAnboard(HashMap<String, String> params) throws Throwable {
		return sqlSession.insert("test.insertAnboard", params);
	}

	@Override
	public int deleteAnboard(HashMap<String, String> params) throws Throwable {
		return sqlSession.delete("test.deleteAnboard", params);
	}

	@Override
	public int updateAnboard(HashMap<String, String> params) throws Throwable {
		return sqlSession.update("test.updateAnboard", params);
	}

	@Override
	public int getAnboardCnt(HashMap<String, String> params) throws Throwable {
		return sqlSession.selectOne("test.getAnboardCnt", params);
	}

}

Test_SQL.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace : 클래스와 동일, 이 파일의 대표명 -->
<mapper namespace="test">

	<!-- Anboard 테이블 -->
	
	<select id="getAnboardList" resultType="hashmap" parameterType="hashmap">		
		SELECT S.NO, S.TITLE, S.WRITER, S.HIT, S.DT
		FROM (SELECT NO, TITLE, WRITER, HIT, TO_CHAR(DT,'YYYY-MM-DD') AS DT,
		ROW_NUMBER() OVER(ORDER BY DT DESC, NO DESC) AS RNK
		FROM ANBOARD
		WHERE DEL = 1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				</when>
				<when test="searchGbn == 1">
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
			</if>
		) S
		WHERE S.RNK BETWEEN #{start} AND #{end}
	</select>

	<select id="getAnboard" resultType="hashmap" parameterType="hashmap">
		SELECT NO, TITLE, WRITER, CON, HIT, DT 
		FROM ANBOARD
		WHERE NO = #{no}
	</select>
	
	<insert id="insertAnboard" parameterType="hashmap">
		INSERT INTO ANBOARD(NO, TITLE, WRITER, CON)
		VALUES(ANBOARD_SEQ.NEXTVAL, #{title}, #{writer}, #{con})
	</insert>
	
	<update id="deleteAnboard" parameterType="hashmap">
		UPDATE ANBOARD SET DEL = 0
		WHERE NO = #{no}
	</update>
	
	<update id="updateAnboard" parameterType="hashmap">
		UPDATE ANBOARD SET TITLE = #{title},
                WRITER = #{writer},
                CON = #{con}
                WHERE NO = #{no}
	</update>
	
	<select id="getAnboardCnt" parameterType="hashmap" resultType="Integer">
		SELECT COUNT(*) AS CNT 
		FROM ANBOARD
		WHERE DEL = 1
		<if test="searchTxt != null and searchTxt != ''"> 
			<choose>
				<when test="searchGbn == 0">
					AND TITLE LIKE '%' || #{searchTxt} || '%'
				</when>
				<when test="searchGbn == 1">
					AND WRITER LIKE '%' || #{searchTxt} || '%'
				</when>
			</choose>
			</if>
	</select>
</mapper>

 

anboardList.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>Insert title here</title>
<style type="text/css">
table{
	border-collapse: collapse;
}

th, td {
	border: 1px solid #000;
	padding: 5px;
}

</style>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	
	if("${param.searchGbn}" != "") { // 검색구분이 넘어오면
		$("#searchGbn").val("${param.searchGbn}");	
	}
	
	
	$("tbody").on("click", "tr", function () {
		console.log($(this).attr("no"));
		$("#no").val($(this).attr("no"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		$("#actionForm").attr("action","anboardDetail");
		$("#actionForm").submit();
	})
	
	$("#insertBtn").on("click", function () {
		location.href = "anboardInsert";
	});
	
	$("#pagingWrap").on("click", "span", function () {
		$("#page").val($(this).attr("page"));
		
		// 검색 상태 유지
		$("#searchGbn").val($("#oldGbn").val());
		$("#searchTxt").val($("#oldTxt").val());
		
		$("#actionForm").attr("action","anboardList");
		$("#actionForm").submit();
	});
	
	$("#searchBtn").on("click", function () {
		// 검색하면 페이지는 무조건 1페이지로 감
		$("#page").val("1"); // 페이지 초기화
		
		$("#actionForm").attr("action","anboardList");
		$("#actionForm").submit();
	})
})

</script>
</head>
<body>
<!-- 기존 검색 내용 유지용 -->
<input type="hidden" id="oldGbn" value="${param.searchGbn}"/>
<input type="hidden" id="oldTxt" value="${param.searchTxt}"/>
<form action="anboardDetail" id="actionForm" method="post">
	<input type="hidden" id="no" name="no" />
	<input type="hidden" id="page" name="page" value="${page}" />  <!-- 상세보기 갈때 page 가져갈거임 -->
	<!-- 검색 -->
	<select name="searchGbn" id="searchGbn">
		<option value="0">제목</option>
		<option value="1">작성자</option>
	</select>
	<input type="text" name="searchTxt" id="searchTxt" value="${param.searchTxt}"/> <!-- 검색어 유지되게, 그래야 페이징할떄도 유지됨 -->
	<input type="button" value="검색" id="searchBtn" />
	<input type="button" value="추가" id="insertBtn" />
</form>

<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>조회수</th>
			<th>작성일</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach var="data" items="${list}">
			<tr no="${data.NO}">
				<td>${data.NO}</td>
				<td>${data.TITLE}</td>
				<td>${data.WRITER}</td>
				<td>${data.HIT}</td>
				<td>${data.DT}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
<div id="pagingWrap">
<span page="1">처음</span>
<!-- 이전은 현재페이지에서 하나 전, 
지금 1페이지인지 아닌지 먼저 체크 따라서, 현재페이지 필요-->
<!-- 이전페이지 : 현제페이지가 1이면 1로 이동 아니면 현제페이지 -1 -->
<c:choose>
	<c:when test="${page eq 1}">
		<span page="1">이전</span>
	</c:when>
	<c:otherwise>
		<span page="${page - 1}">이전</span>
	</c:otherwise>
</c:choose>
<!-- 페이지들 -->
<c:forEach var="i" begin="${pd.startP}" end="${pd.endP}" step="1">
	<%-- 현재 페이지의 경우 별도 처리 --%>
	<c:choose>
		<c:when test="${i eq page}"> <%-- 현재페이지 --%>
			<span page="${i}"><b>${i}</b></span>
		</c:when>
		<c:otherwise> <%-- 다른페이지 --%>
			<span page="${i}">${i}</span>
		</c:otherwise>
	</c:choose>
</c:forEach>

<!-- 다음페이지 : 마지막에 도달했을때는 증가하지 않고, 다른 경우는 +1 -->
<c:choose>
	<c:when test="${page eq pd.maxP}">
		<span page="${pd.maxP}">다음</span>
	</c:when>
	<c:otherwise>
		<span page="${page + 1}">다음</span>
	</c:otherwise>
</c:choose>

<span page="${pd.maxP}">마지막</span>
</div>
</body>
</html>

anboardDetail.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>Insert title here</title>
<script type="text/javascript" 
		src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#listBtn").on("click", function() {
		$("#actionForm").attr("action","anboardList"); 
		$("#actionForm").submit();
	});
	
	$("#deleteBtn").on("click", function () {
		if(confirm("삭제하시곘습니까?")){
			$("#actionForm").attr("action","anboardRes"); 
			$("#actionForm").submit();
		}
	})
	
	$("#updateBtn").on("click", function () {
		$("#actionForm").attr("action","anboardUpdate");
		$("#actionForm").submit();
	});
});

</script>
</head>
<body>
<form action="#" id="actionForm" method="post">
	<input type="hidden" name="gbn" value="d"> <!-- selRes는 gbn을 받게 되어있어서 값을 추가해줘야함 -->
	<input type="hidden" name="no" value="${data.NO}">
	<input type="hidden" name="page" value="${param.page}" /> <!-- 전 화면에서 넘어온 페이지 정보 -->
		<!-- 전 화면에서 넘어온 검색 정보 -->
	<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
	<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
</form>	
번호: ${data.NO}<br/>
제목: ${data.TITLE}<br/>
내용: ${data.CON}<br/>
작성자: ${data.WRITER}<br/>
조회수: ${data.HIT}<br/>
작성일: ${data.DT}<br/>
<input type="button" value="수정" id="updateBtn" />
<input type="button" value="삭제" id="deleteBtn" />
<input type="button" value="목록" id="listBtn" />
</body>
</html>

anboardInsert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#listBtn").on("click", function () {
		history.back();
	});
	
	$("#insertBtn").on("click", function () {
		if($("#title").val() == ""){
			alert("제목을 입력하세요");
			$("#title").focus();
		} else if($("#writer").val() == ""){
			alert("작성자를 입력하세요");
			$("#writer").focus();
		} else if($("#con").val() == ""){
			alert("내용을 입력하세요");
			$("#con").focus();
		} else {
			$("#actionForm").submit();
		}
	});
});

</script>
</head>
<body>
<form action="anboardRes" id="actionForm" method="post">
<!-- gbn : 구분, 혹은 flag -->
<!-- 구분: i - insert, u - update, d - delete -->
<input type="hidden" name="gbn" value="i"/>
제목 
<input type="text" name="title" id="title" />
<br />
작성자 
<input type="text" name="writer" id="writer" />
<br/>
내용 
<textarea name="con" id="con"></textarea>
<br/>
</form>
<input type="button" value="등록" id="insertBtn">
<input type="button" value="목록" id="listBtn">
</body>
</html>

anboardRes.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	
	switch("${res}"){
	case "success" : 
		if("${param.gbn}" == "u"){ // 수정이 성공했을 떄
			$("#goForm").submit();
		} else { // 등록, 삭제가 성공했을 떄
			location.href = "anboardList" 
		}
		break;
	case "failed" : 
		alert("작업에 실패하였습니다.");
		history.back();
		break;
	case "error" : 
		alert("작업중 문제가 발생 하였습니다.");
		history.back();
		break;
	}
});
</script>
</head>
<body>
<form action="anboardDetail" id="goForm" method="post">
	<input type="hidden" name="no" value="${param.no}" />
	<input type="hidden" name="page" value="${param.page}" /> <!-- 전 화면에서 넘어온 페이지 정보 -->
		<!-- 전 화면에서 넘어온 검색 정보 -->
	<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
	<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
</form>
</body>
</html>

anboardUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="resources/script/jquery/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	// 기존값으로 셀렉트박스 선택 내용 변경
	$("#title").val("${data.TITLE}");
	$("#writer").val("${data.WRITER}");
	$("#con").val("${data.CON}");
	
	$("#listBtn").on("click", function () {
		history.back();
	});
	
	$("#updateBtn").on("click", function () {
		if($("#title").val() == ""){
			alert("제목을 입력하세요");
			$("#title").focus();
		} else if($("#writer").val() == ""){
			alert("작성자를 입력하세요");
			$("#writer").focus();
		} else if($("#con").val() == ""){
			alert("내용을 입력하세요");
			$("#con").focus();
		} else {
			$("#actionForm").submit();
		}
	});
});

</script>
</head>
<body>
<!-- 번호는 시퀀스 쓸거기 때문에 받을 필요없음, 보여줄 필요 없음, 저장되야 글번호 보여지지 -->
<!-- select 전달하기 위해  name줘야함 -->
<!-- option value 지정해줘야함! -->
<form action="anboardRes" id="actionForm" method="post">
<!-- gbn : 구분, 혹은 flag -->
<!-- 구분: i - insert, u - update, d - delete -->
<input type="hidden" name="gbn" value="u"/>
<input type="hidden" name="no" value="${data.NO}"/> <!-- 이 번호만 수정해라라는 조건 달기위해 필요 -->
<input type="hidden" name="page" value="${param.page}" /> <!-- 전 화면에서 넘어온 페이지 정보 -->
<!-- 전 화면에서 넘어온 검색 정보 -->
<input type="hidden" name="searchGbn" value="${param.searchGbn}"/>
<input type="hidden" name="searchTxt" value="${param.searchTxt}"/>
제목 
<input type="text" name="title" id="title" />
<br />
작성자 
<input type="text" name="writer" id="writer" />
<br/>
내용 
<textarea name="con" id="con"></textarea>
<br />
</form>
<input type="button" value="수정" id="updateBtn">
<input type="button" value="뒤로가기" id="listBtn">
</body>
</html>

 

anboardList 화면

지금까지 했던 거(목록, 수정페이지, 상세페이지, 삭제, 페이징, 검색) 플러스

강사님이 요즘에는 

테이블에서 데이터를 삭제할때 실제 데이터가 삭제되는게 아니고 안보이게 하는거라고 하셨음, 그거를 해보라고 했는데,

이렇게 함, 아직 맞는지는 몰라 내일 같이 할 예정

DEL 컬럼을 주고, 1이면 삭제 안된데이터, 0이면 삭제된 데이터, 쿼리에서 1만 보이게 처리

조건걸때 WHERE 1=1 대신 DEL =1로 바꿔주고

삭제부분 쿼리

기존 삭제부분은 delete 사용했는데, 이제 update로 변경

728x90