2020년 01월 08일
업데이트:
썸네일
게시글 목록에서 어느 위치에 썸네일이 보여지고 싶은지 결정하고,
어느 컨트롤러가 불러와야 되는지 생각해보기
썸네일 출력
BoardController 게시글 목록이 조회 되었을 때 해당 게시글의 썸네일도 얻어온다.
// 게시글 목록 조회 Controller **********************************************************
if(command.equals("/list.do")) {
errorMsg = "게시판 목록 조회 과정에서 오류 발생";
// 1) 페이징 처리를 위한 값 계산 Service 호출
PageInfo pInfo = service.getPageInfo(cp);
// System.out.println(pInfo);
// 2) 게시글 목록 조회 비즈니스 로직 수행
List<Board> bList = service.selectBoardList(pInfo);
// pInfo에 있는 currentPage, limit를 사용해야지만
// 현재 페이지에 맞는 게시글 목록만 조회할 수 있음.
/*for(Board b : bList) {
System.out.println(b);
}*/
// 썸네일 추가 부분
// 3. 게시글 목록이 조회 되었을 때
// 해당 게시글 목록 요소에 작성된 썸네일 이미지 목록 얻어오는 서비스 진행
if(bList !=null ) {
// 썸네일 이미지 목록 조회 서비스 호출
List<Attachment> fList = service.selectThumbnailList(pInfo);
// 썸네일 이미지 목록이 비어있지 않은 경우
if(!fList.isEmpty()) {
request.setAttribute("fList", fList);
}
}
path = "/WEB-INF/views/board/boardList.jsp";
request.setAttribute("bList", bList);
request.setAttribute("pInfo", pInfo);
view = request.getRequestDispatcher(path);
view.forward(request, response);
}
BoardService.java
/** 썸네일 목록 조회 Service
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> selectThumbnailList(PageInfo pInfo) throws Exception {
Connection conn = getConnection();
List<Attachment> fList = dao.selectThumbnailList(conn,pInfo);
close(conn);
return fList;
}
BoardDAO.java
/** 썸네일 목록 조회 DAO
* @param conn
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> selectThumbnailList(Connection conn, PageInfo pInfo) throws Exception {
List<Attachment> fList = null;
String query = prop.getProperty("selectThumbnailList");
try {
// 위치 홀더에 들어갈 시작 행, 끝 행번호 계산
int startRow = (pInfo.getCurrentPage() -1) * pInfo.getLimit() + 1;
int endRow = startRow + pInfo.getLimit()-1;
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, startRow);
pstmt.setInt(2, endRow);
rset = pstmt.executeQuery();
fList = new ArrayList<Attachment>();
while(rset.next()){
Attachment at = new Attachment();
at.setFileName(rset.getString("FILE_NAME"));
at.setParentBoardNo(rset.getInt("PARENT_BOARD_NO"));
fList.add(at);
}
}finally {
close(rset);
close(pstmt);
}
return fList;
}
board-query.xml
<!-- 썸네일 목록 조회 -->
<entry key="selectThumbnailList">
SELECT * FROM ATTACHMENT
WHERE PARENT_BOARD_NO
IN (SELECT BOARD_NO FROM
(SELECT ROWNUM RNUM, V.* FROM
(SELECT BOARD_NO FROM V_BOARD
WHERE BOARD_STATUS='Y'
ORDER BY BOARD_NO DESC)V)
WHERE RNUM BETWEEN ? AND ?)
AND FILE_LEVEL=0
</entry>
boardList.jsp
<%-- 썸네일 출력 --%>
<c:forEach var="thumbnail" items="${fList }">
<%-- 현재 출력하려는 게시글 번호와 썸네일 목록 중 부모게시글번호가 일치하는 썸네일 정보가 있다면 --%>
<c:if test="${board.boardNo == thumbnail.parentBoardNo }">
<img src="${contextPath }/resources/uploadImages/${thumbnail.fileName}">
</c:if>
</c:forEach>
- 검색을 했을 때도 썸네일이 출력 될 수 있게 검색 컨트롤러에도 썸네일을 추가해주어야 한다.
검색 시 게시글 목록
SearchController.java
// 검색 게시글 목록 조회 성공 시 썸네일 목록 조회 수행
if(bList != null) {
List<Attachment> fList = service.searchThumbnailList(map, pInfo);
if(!fList.isEmpty()) { // 조회된 썸네일 목록이 있다면
request.setAttribute("fList", fList);
}
}
SearchService.java
/** 검색이 적용된 썸네일 목록 조회 Service
* @param map
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> searchThumbnailList(Map<String, Object> map, PageInfo pInfo) throws Exception {
Connection conn = getConnection();
// 검색에 사용될 SQL 조건문 생성
String condition = createCondition(map);
List<Attachment> fList = dao.searchThumbnailList(conn, pInfo, condition);
close(conn);
return fList;
}
SearchDAO.java
/** 검색이 적용된 썸네일 목록 조회 DAO
* @param conn
* @param pInfo
* @param condition
* @return fList
* @throws Exception
*/
public List<Attachment> searchThumbnailList(Connection conn, PageInfo pInfo, String condition) throws Exception {
List<Attachment> fList = null;
String query =
"SELECT FILE_NAME, PARENT_BOARD_NO FROM ATTACHMENT " +
"WHERE PARENT_BOARD_NO IN (" +
" SELECT BOARD_NO FROM " +
" (SELECT ROWNUM RNUM, V.* FROM " +
" (SELECT BOARD_NO FROM V_BOARD " +
" WHERE BOARD_STATUS='Y' " +
" AND " + condition +
" ORDER BY BOARD_NO DESC ) V) " +
" WHERE RNUM BETWEEN ? AND ?" +
") " +
"AND FILE_LEVEL = 0";
try {
// 위치 홀더에 들어갈 시작 행, 끝 행번호 계산
int startRow = (pInfo.getCurrentPage() -1) * pInfo.getLimit() + 1;
int endRow = startRow + pInfo.getLimit()-1;
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, startRow);
pstmt.setInt(2, endRow);
rset = pstmt.executeQuery();
fList = new ArrayList<Attachment>();
while(rset.next()){
Attachment at = new Attachment();
at.setFileName(rset.getString("FILE_NAME"));
at.setParentBoardNo(rset.getInt("PARENT_BOARD_NO"));
fList.add(at);
}
}finally {
close(rset);
close(pstmt);
}
return fList;
}
게시글 수정
게시글 수정 버튼을 누르면 게시글 수정 화면 전환
전체 목록조회 상태에서 수정할 때
- 수정 버튼 클릭 -> 수정 화면 -> 수정 성공 -> 상세조회 화면
검색 후 게시글을 수정할 때
- 검색 -> 검색목록 -> 상세조회 -> 수정 버튼 클릭 -> 수정화면 -> 수정 성공 -> 상세조회 화면
상황에 따라 게시글 수정 후 상세조회 페이지로 돌아오기 위한 url 조합을 해주어야 한다.
boardView.jsp
<%-- 로그인된 회원과 해당 글 작성자가 같은 경우--%>
<c:if test="${!empty loginMember && (board.memberId == loginMember.memberId) }">
<button id="deleteBtn" class="btn btn-primary float-right">삭제</button>
<%-- 게시글 수정 후 상세조회 페이지로 돌아오기 위한 url 조합 --%>
<c:if test="${!empty param.sv && !empty param.sk }">
<%-- 검색을 통해 들어온 상세 조회 페이지인 경우 --%>
<c:set var="searchStr" value="&sk=${param.sk }&sv=${param.sv }"/>
</c:if>
<a href="updateForm.do?cp=${param.cp}&no=${param.no}${searchStr}" class="btn btn-primary float-right ml-1 mr-1">수정</a>
</c:if>
- 글 수정을 진행하려면 우선 이전에 작성된 내용을 불러와야한다.
BoardController.java
//게시글 수정 화면 전환 controller ***************************
else if(command.equals("/updateForm.do")) {
errorMsg="게시글 수정 화면 전환 과정에서 오류 발생";
//수정화면이 미리 이전 내용을 작성될 수 있게
//글 번호를 이용하여 이전 내용을 조회해옴
int boardNo = Integer.parseInt(request.getParameter("no"));
Board board = service.updateView(boardNo);
if(board!=null) {
List<Attachment> fList = service.selectBoardFiles(boardNo);
if(!fList.isEmpty()) {
request.setAttribute("fList", fList);
}
request.setAttribute("board", board);
path = "/WEB-INF/views/board/boardUpdate.jsp";
view = request.getRequestDispatcher(path);
view.forward(request, response);
} else {
request.getSession().setAttribute("swalIcon", "error");
request.getSession().setAttribute("swalTitle", "게시글 수정화면 전환 실패");
response.sendRedirect(request.getHeader("referer"));
}
}
BoardService.java
/** 게시글 수정 화면 출력용 Service
* @param boardNo
* @return board
* @throws Exception
*/
public Board updateView(int boardNo) throws Exception {
Connection conn = getConnection();
// 이전에 만들어 둔 상세조회 DAO 호출
Board board = dao.selectBoard(conn, boardNo);
// 스크립팅 방지를 위해 개행문자가 <br>로 변해있는 상태.
// 수정할때 내용이 보여지는 부분은 textArea
// textArea의 개행문자는 \r\n 형태이다. <br>을 \r\n으로 바꾸기
// textArea 출력을 위한 개행문자 변경
board.setBoardContent(board.getBoardContent().replaceAll("<br>", "\r\n"));
close(conn);
return board;
}
BoardDAO.java
/** 게시글 상세조회 DAO
* @param conn
* @param boardNo
* @return board
* @throws Exception
*/
public Board selectBoard(Connection conn, int boardNo) throws Exception {
Board board = null;
String query = prop.getProperty("selectBoard");
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1,boardNo);
rset = pstmt.executeQuery();
if(rset.next()) {
board = new Board();
board.setBoardNo(rset.getInt("BOARD_NO"));
board.setBoardTitle(rset.getString("BOARD_TITLE"));
board.setBoardContent(rset.getString("BOARD_CONTENT"));
board.setMemberId(rset.getString("MEMBER_ID"));
board.setReadCount(rset.getInt("READ_COUNT"));
board.setBoardCreateDate(rset.getTimestamp("BOARD_CREATE_DT"));
board.setBoardModifyDate(rset.getTimestamp("BOARD_MODIFY_DT"));
board.setCategoryName(rset.getString("CATEGORY_NM"));
}
}finally {
close(rset);
close(pstmt);
}
return board;
}
board-query.xml
<!-- 게시글 상세 조회 -->
<entry key="selectBoard">
SELECT * FROM V_BOARD
WHERE BOARD_NO=?
AND BOARD_STATUS='Y'
</entry>
boardUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<style>
.insert-label {
display: inline-block;
width: 80px;
line-height: 40px
}
.boardImg{
cursor : pointer;
}
</style>
</head>
<body>
<jsp:include page="../common/header.jsp"></jsp:include>
<div class="container my-5">
<h3>게시글 수정</h3>
<hr>
<c:if test="${!empty param.sk && !empty param.sv}">
<c:set var="searchStr" value="&sk=${param.sk}&sv=${param.sv}"/>
</c:if>
<form action="update.do?cp=${param.cp}&no=${param.no}${searchStr}" method="post"
enctype="multipart/form-data" role="form" onsubmit="return updateValidate();">
<div class="mb-2">
<label class="input-group-addon mr-3 insert-label">카테고리</label>
<select class="custom-select" id="categoryCode" name="categoryCode" style="width: 150px;">
<option value="10">운동</option>
<option value="20">영화</option>
<option value="30">음악</option>
<option value="40">요리</option>
<option value="50">게임</option>
<option value="60">기타</option>
</select>
</div>
<div class="form-inline mb-2">
<label class="input-group-addon mr-3 insert-label">제목</label>
<input type="text" class="form-control" id="boardTitle" name="boardTitle" size="70" value="${board.boardTitle }">
</div>
<div class="form-inline mb-2">
<label class="input-group-addon mr-3 insert-label">작성자</label>
<h5 class="my-0" id="writer">${board.memberId }</h5>
</div>
<div class="form-inline mb-2">
<label class="input-group-addon mr-3 insert-label">작성일</label> <fmt:formatDate value="${board.boardCreateDate }" pattern="yyyy년 MM월 dd일 HH:mm:ss"/>
</div>
<hr>
<div class="form-inline mb-2">
<label class="input-group-addon mr-3 insert-label">썸네일</label>
<div class="boardImg" id="titleImgArea">
<img id="titleImg" width="200" height="200">
</div>
</div>
<div class="form-inline mb-2">
<label class="input-group-addon mr-3 insert-label">업로드<br>이미지</label>
<div class="mr-2 boardImg" id="contentImgArea1">
<img id="contentImg1" width="150" height="150">
</div>
<div class="mr-2 boardImg" id="contentImgArea2">
<img id="contentImg2" width="150" height="150">
</div>
<div class="mr-2 boardImg" id="contentImgArea3">
<img id="contentImg3" width="150" height="150">
</div>
</div>
<!-- 파일 업로드 하는 부분 -->
<div id="fileArea">
<input type="file" id="img0" name="img0" onchange="LoadImg(this,0)">
<input type="file" id="img1" name="img1" onchange="LoadImg(this,1)">
<input type="file" id="img2" name="img2" onchange="LoadImg(this,2)">
<input type="file" id="img3" name="img3" onchange="LoadImg(this,3)">
</div>
<div class="form-group">
<div>
<label for="content">내용</label>
</div>
<textarea class="form-control" id="boardContent" name="boardContent" rows="15" style="resize: none;">${board.boardContent }</textarea>
</div>
<hr class="mb-4">
<div class="text-center">
<button type="submit" class="btn btn-primary">수정</button>
<button type="button" class="btn btn-primary">이전으로</button>
</div>
</form>
</div>
<jsp:include page="../common/footer.jsp"></jsp:include>
<script>
// 유효성 검사
function updateValidate() {
if ($("#boardTitle").val().trim().length == 0) {
alert("제목을 입력해 주세요.");
$("#boardTiitle").focus();
return false;
}
if ($("#boardContent").val().trim().length == 0) {
alert("내용을 입력해 주세요.");
$("#boardContent").focus();
return false;
}
}
// 이미지 영역을 클릭할 때 파일 첨부 창이 뜨도록 설정하는 함수
$(function () {
$("#fileArea").hide();
$(".boardImg").on("click",function(){
var index = $(".boardImg").index(this);
$("#img" + index).click();
});
});
// 각각의 영역에 파일을 첨부 했을 경우 미리 보기가 가능하도록 하는 함수
function LoadImg(value, num) {
if (value.files && value.files[0]) {
var reader = new FileReader();
// 자바스크립트 FileReader
// 웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 읽을 파일을 가리키는 File 혹은 Blob객체를 이용해 파일의 내용을 읽고 사용자의 컴퓨터에 저장하는 것을 가능하게 해주는 객체
reader.readAsDataURL(value.files[0]);
// FileReader.readAsDataURL()
// 지정된의 내용을 읽기 시작합니다. Blob완료되면 result속성 data:에 파일 데이터를 나타내는 URL이 포함 됩니다.
// FileReader.onload
// load 이벤트의 핸들러. 이 이벤트는 읽기 동작이 성공적으로 완료 되었을 때마다 발생합니다.
reader.onload = function (e) {
//console.log(e.target.result);
// e.target.result
// -> 파일 읽기 동작을 성공한 객체에(fileTag) 올라간 결과(이미지 또는 파일)
$(".boardImg").eq(num).children("img").attr("src", e.target.result);
}
}
}
// 카테고리 초기값 지정
(function(){
$("#categoryCode > option").each(function(index, item){
if($(item).text() == "${board.categoryName}"){
$(item).prop("selected", true);
}
});
})();
// 이미지 배치
<c:forEach var="file" items="${fList}">
$(".boardImg").eq(${file.fileLevel}).children("img").attr("src","${contextPath}/resources/uploadImages/${file.fileName}");
</c:forEach>
</script>
</body>
</html>
게시글 수정
BoardController.java
// 게시글 수정 Controller ********************************
else if(command.equals("/update.do")) {
errorMsg = "게시글 수정 과정에서 오류 발생";
// 1. MultipartRequest 객체 생성에 필요한 값 설정
int maxSize = 20 * 1024 * 1024; // 최대 크기 20MB
String root = request.getServletContext().getRealPath("/");
String filePath = root + "resources/uploadImages/";
// 2. MultipartRequest 객체 생성
// -> 생성과 동시에 전달받은 파일이 서버에 저장됨
MultipartRequest mRequest = new MultipartRequest(request, filePath, maxSize, "UTF-8", new MyFileRenamePolicy());
// 3. 파일 정보를 제외한 파라미터 얻어오기
String boardTitle = mRequest.getParameter("boardTitle");
String boardContent = mRequest.getParameter("boardContent");
int categoryCode = Integer.parseInt(mRequest.getParameter("categoryCode"));
int boardNo = Integer.parseInt(mRequest.getParameter("no"));
// 4. 전달받은 파일 정보를 List에 저장
List<Attachment> fList = new ArrayList<Attachment>();
Enumeration<String> files = mRequest.getFileNames();
// input type="file"인 모든 요소의 name 속성 값을 반환받아 files에 저장
while(files.hasMoreElements()) {
// 현재 접근중인 name속성값을 변수에 저장
String name = files.nextElement();
// 현재 name 속성이 일치하는 요소로 업로드된 파일이 있다면
if(mRequest.getFilesystemName(name) != null) {
Attachment temp = new Attachment();
// 변경된 파일 이름 temp에 저장
temp.setFileName(mRequest.getFilesystemName(name));
// 지정한 파일 경로 tmep에 저장
temp.setFilePath(filePath);
// 해당 게시글 번호 temp에 저장
temp.setParentBoardNo(boardNo);
// 파일 레벨 temp에 저장
switch(name) {
case "img0" : temp.setFileLevel(0); break;
case "img1" : temp.setFileLevel(1); break;
case "img2" : temp.setFileLevel(2); break;
case "img3" : temp.setFileLevel(3); break;
}
// temp를 fList에 추가
fList.add(temp);
// 이미지를 변경한 부분들만 fList에 추가가 된다.
}
}
// 5. Session에서 로그인한 회원의 번호를 얻어와 저장
int boardWriter = ((Member)request.getSession().getAttribute("loginMember")).getMemberNo();
// 6. 준비된 값들을 하나의 Map에 저장
Map<String, Object> map = new HashMap<String, Object>();
map.put("boardTitle", boardTitle);
map.put("boardContent", boardContent);
map.put("categoryCode",categoryCode);
map.put("boardNo",boardNo);
map.put("fList",fList);
map.put("boardWriter",boardWriter);
// 7. 준비된 값을 매개변수로 하여 게시글 수정 Service 호출
int result = service.updateBoard(map);
// 8. result 값에 따라 View 연결 처리
path = "view.do?cp=" + cp + "&no=" + boardNo;
String sk = mRequest.getParameter("sk");
String sv = mRequest.getParameter("sv");
// 전달된 sk,sv가 존재 할 때 (검색을 통한 접근일 때)
if(sk != null && sv != null ) {
path += "&sk="+sk + "&sv=" + sv;
}
if (result>0) {
swalIcon = "success";
swalTitle = "게시글 수정 성공";
}else {
swalIcon = "error";
swalTitle = "게시글 수정 실패";
}
request.getSession().setAttribute("swalIcon", swalIcon);
request.getSession().setAttribute("swalTitle", swalTitle);
response.sendRedirect(path);
}
BoardService.java
/** 게시글 수정 Service
* @param map
* @return
* @throws Exception
*/
public int updateBoard(Map<String, Object> map) throws Exception {
Connection conn = getConnection();
int result = 0; // Service 수정 결과 저장 변수
List<Attachment> deleteFiles = null; // 삭제할 파일 정보 저장 변수 선언
// 1. 크로스 사이트 스크립팅 방지 처리
String boardTitle = (String) map.get("boardTitle");
String boardContent = (String) map.get("boardContent");
boardTitle = replaceParameter(boardTitle);
boardContent = replaceParameter(boardContent);
// 2. 글 내용 개행문자 \r\n -> <br>
boardContent.replaceAll("\r\n", "<br>");
// 처리된 내용을 다시 map에 추가
map.put("boardTitle", boardTitle);
map.put("boardContent", boardContent);
try {
// 3. 게시글 부분 수정 DAO 호출
result = dao.updateBoard(conn, map);
// 4. 게시글 수정이 성공하고 fList가 비어있지 않으면
// 파일 정보 수정 DAO를 호출함
// 수정 화면에서 새로운 이미지가 업로드된 파일 정보만을 담고 있는 List
List<Attachment> newFileList = (List<Attachment>)map.get("fList");
if(result > 0 && !newFileList.isEmpty()) {
// DB에서 해당 게시글의 수정전 파일 목록 조회
List<Attachment> oldFileList = dao.selectBoardFiles(conn, (int)map.get("boardNo"));
// newFileList -> 수정된 썸네일(lv.0)
// oldFileList -> 썸네일(lv.0), 이미지 (lv.1), 이미지2(lv.2)
// 기존 썸네일(lv.0) -> 수정된 썸네일(lv.0)로 변경됨
// -> DB에서 기존 썸네일의 데이터를 수정된 썸네일로 변경
// --> DB에서 기존 썸네일 정보가 사라짐
result = 0; // result 재활용
deleteFiles = new ArrayList<Attachment>(); // 삭제될 파일 정보 저장 List
// 새로운 이미지 정보 반복 접근
for(Attachment newFile : newFileList) {
// flag가 false인 경우 : 새 이미지와 기존 이미지의 파일 레벨이 중복되는 경우 -> update
// flag가 true인 경우 : 새 이미지와 기존 이미지의 파일 레벨이 중복되지 않는 경우 -> insert
boolean flag = true;
// 기존 이미지 정보 반복 접근
for(Attachment oldFile : oldFileList) {
// 새로운 이미지와 기존 이미지의 파일 레벨이 동일한 파일이 있다면
if(newFile.getFileLevel() == oldFile.getFileLevel()) {
// 기존 파일을 삭제 List에 추가
deleteFiles.add(oldFile);
// 새 이미지 정보에 이전 파일 번호를 추가 -> 파일 번호를 이용한 수정 진행
newFile.setFileNo(oldFile.getFileNo());
flag = false;
break;
}
}
// flag 값에 따라 파일 정보 insert 또는 update수행
if(flag) {
result = dao.insertAttachment(conn, newFile);
}else {
result = dao.updateAttachment(conn, newFile);
}
// 파일 정보 삽입 또는 수정 중 실패 시
if(result == 0) {
// 강제로 사용자 정의 예외 발생
throw new FileInsertFailedException("파일 정보 삽입 또는 수정 실패");
}
}
}
} catch (Exception e) {
// 게시글 수정 중 실패 또는 오류 발생 시
// 서버에 미리 저장되어 있던 이미지 파일 삭제
List<Attachment> fList = (List<Attachment>)map.get("fList");
if(!fList.isEmpty()) {
for(Attachment at : fList) {
String filePath = at.getFilePath();
String fileName = at.getFileName();
File deleteFile = new File(filePath + fileName);
if(deleteFile.exists()) {
// 해당 경로에 해당 파일이 존재하면
deleteFile.delete(); // 해당 파일 삭제
}
}
}
// 에러페이지가 보여질 수 있도록 catch한 Exception을 Controller로 던져줌
throw e;
}
// 5. 트랜잭션 처리 및 삭제 목록에 있는 파일 삭제
if(result > 0) {
commit(conn);
// DB 정보와 맞지 않는 파일(deleteFiles) 삭제 진행
if(deleteFiles !=null) {
for(Attachment at : deleteFiles) {
String filePath = at.getFilePath();
String fileName = at.getFileName();
File deleteFile = new File(filePath + fileName);
if(deleteFile.exists()) {
deleteFile.delete();
}
}
}
}else {
rollback(conn);
}
return result;
}
BoardDAO.java
/** 게시글 수정 DAO
* @param conn
* @param map
* @return result
* @throws Exception
*/
public int updateBoard(Connection conn, Map<String, Object> map) throws Exception {
int result =0;
String query = prop.getProperty("updateBoard");
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, (String)map.get("boardTitle"));
pstmt.setString(2, (String)map.get("boardContent"));
pstmt.setInt(3, (int)map.get("categoryCode"));
pstmt.setInt(4, (int)map.get("boardNo"));
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 게시글에 포함된 이미지 목록 조회 DAO
* @param conn
* @param boardNo
* @return fList
* @throws Exception
*/
public List<Attachment> selectBoardFiles(Connection conn, int boardNo)throws Exception {
List<Attachment> fList = null;
String query = prop.getProperty("selectBoardFiles");
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1,boardNo);
rset = pstmt.executeQuery();
fList = new ArrayList<Attachment>();
while(rset.next()) {
Attachment at = new Attachment(
rset.getInt("FILE_NO"),
rset.getNString("FILE_NAME"),
rset.getInt("FILE_LEVEL"));
at.setFilePath(rset.getString("FILE_PATH") );
fList.add(at);
}
}finally {
close(rset);
close(pstmt);
}
return fList;
}
/** 파일 정보 삽입 DAO
* @param conn
* @param at
* @return result
* @throws Exception
*/
public int insertAttachment(Connection conn, Attachment at) throws Exception {
int result =0;
String query = prop.getProperty("insertAttachment");
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, at.getFilePath());
pstmt.setString(2, at.getFileName());
pstmt.setInt(3, at.getFileLevel());
pstmt.setInt(4, at.getParentBoardNo());
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 파일 정보 수정 DAO
* @param conn
* @param newFile
* @return result
* @throws Exception
*/
public int updateAttachment(Connection conn, Attachment newFile) throws Exception {
int result =0;
String query = prop.getProperty("updateAttachment");
try{
pstmt = conn.prepareStatement(query);
pstmt.setString(1, newFile.getFilePath());
pstmt.setString(2, newFile.getFileName());
pstmt.setInt(3, newFile.getFileNo());
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
board-query.xml
<!-- 게시글 수정 -->
<entry key="updateBoard">
UPDATE BOARD SET
BOARD_TITLE = ?,
BOARD_CONTENT = ?,
CATEGORY_CD = ?,
BOARD_MODIFY_DT = SYSDATE
WHERE BOARD_NO = ?
</entry>
<!-- 게시글에 포함된 이미지 목록 조회 -->
<entry key="selectBoardFiles">
SELECT FILE_NO, FILE_NAME, FILE_LEVEL , FILE_PATH
FROM ATTACHMENT
WHERE PARENT_BOARD_NO = ?
ORDER BY FILE_LEVEL
</entry>
<!-- 파일 정보 삽입 -->
<entry key="insertAttachment">
INSERT INTO ATTACHMENT
VALUES(SEQ_FNO.NEXTVAL, ?,?,?,?)
</entry>
<!-- 파일 정보 수정 -->
<entry key="updateAttachment">
UPDATE ATTACHMENT SET
FILE_PATH =?,
FILE_NAME =?
WHERE FILE_NO=?
</entry>
댓글남기기