DAO
댓글 상세
public BoardReplyVO getReplyBoard(int re_num)
throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
BoardReplyVO reply = null;
String sql = null;
try {
conn = DBUtil.getConnection();
sql = "SELECT * FROM zboard_reply WHERE re_num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, re_num);
rs = pstmt.executeQuery();
if(rs.next()) {
reply = new BoardReplyVO();
reply.setRe_num(rs.getInt("re_num"));
reply.setMem_num(rs.getInt("mem_num"));
}
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(rs, pstmt, conn);
}
return reply;
}
댓글 수정
public void updateReplyBoard(BoardReplyVO reply)
throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
conn = DBUtil.getConnection();
sql = "UPDATE zboard_reply SET re_content=?,"
+ "re_modifydate=SYSDATE,re_ip=? WHERE re_num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, reply.getRe_content());
pstmt.setString(2, reply.getRe_ip());
pstmt.setInt(3, reply.getRe_num());
pstmt.executeUpdate();
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
댓글 삭제
public void deleteReplyBoard(int re_num)throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
conn = DBUtil.getConnection();
sql = "DELETE FROM zboard_reply WHERE re_num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, re_num);
pstmt.executeUpdate();
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
Action
댓글 수정
package kr.board.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.codehaus.jackson.map.ObjectMapper;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardReplyVO;
import kr.controller.Action;
public class UpdateReplyAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
int re_num = Integer.parseInt(
request.getParameter("re_num"));
BoardDAO dao = BoardDAO.getInstance();
BoardReplyVO db_reply = dao.getReplyBoard(re_num);
HttpSession session = request.getSession();
Integer user_num =
(Integer)session.getAttribute("user_num");
Map<String,String> mapAjax =
new HashMap<String,String>();
if(user_num==null) {
mapAjax.put("result", "logout");
}else if(user_num!=null
&& user_num == db_reply.getMem_num()) {
BoardReplyVO reply = new BoardReplyVO();
reply.setRe_num(re_num);
reply.setRe_content(
request.getParameter("re_content"));
reply.setRe_ip(request.getRemoteAddr());
dao.updateReplyBoard(reply);
mapAjax.put("result", "success");
}else {
mapAjax.put("result", "wrongAccess");
}
ObjectMapper mapper = new ObjectMapper();
String ajaxData = mapper.writeValueAsString(mapAjax);
request.setAttribute("ajaxData", ajaxData);
return "/WEB-INF/views/common/ajax_view.jsp";
}
}
댓글 삭제
package kr.board.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.codehaus.jackson.map.ObjectMapper;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardReplyVO;
import kr.controller.Action;
public class DeleteReplyAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
int re_num = Integer.parseInt(
request.getParameter("re_num"));
Map<String,String> mapAjax =
new HashMap<String,String>();
BoardDAO dao = BoardDAO.getInstance();
BoardReplyVO db_reply = dao.getReplyBoard(re_num);
HttpSession session = request.getSession();
Integer user_num =
(Integer)session.getAttribute("user_num");
if(user_num==null) {
mapAjax.put("result", "logout");
}else if(user_num!=null
&& user_num == db_reply.getMem_num()) {
dao.deleteReplyBoard(re_num);
mapAjax.put("result", "success");
}else {
mapAjax.put("result","wrongAccess");
}
ObjectMapper mapper = new ObjectMapper();
String ajaxData = mapper.writeValueAsString(mapAjax);
request.setAttribute("ajaxData", ajaxData);
return "/WEB-INF/views/common/ajax_view.jsp";
}
}
JS
Board.Reply
$(function(){
let rowCount = 10;
let currentPage;
let count;
function selectList(pageNum){
currentPage = pageNum;
$('#loading').show();
$.ajax({
url:'listReply.do',
type:'post',
data:{pageNum:pageNum,rowCount:rowCount,board_num:$('#board_num').val()},
dataType:'json',
success:function(param){
$('#loading').hide();
count = param.count;
if(pageNum==1){
$('#output').empty();
}
$(param.list).each(function(index,item){
let output = '<div class="item">';
output += '<h4>' + item.id + '</h4>';
output += '<div class="sub-item">';
output += '<p>' + item.re_content + '</p>';
if(item.re_modifydate){
output += '<span class="modify-date">최근 수정일 : ' + item.re_modifydate + '</span>';
}else{
output += '<span class="modify-date">등록일 : ' + item.re_date + '</span>';
}
if(param.user_num == item.mem_num){
output += ' <input type="button" data-renum="' + item.re_num + '" value="수정" class="modify-btn">';
output += ' <input type="button" data-renum="' + item.re_num + '" value="삭제" class="delete-btn">';
}
output += '<hr size="1" noshade width="100%">';
output += '</div>';
output += '</div>';
$('#output').append(output);
});
if(currentPage>=Math.ceil(count/rowCount)){
$('.paging-button').hide();
}else{
$('.paging-button').show();
}
},
error:function(){
$('#loading').hide();
alert('네트워크 오류 발생');
}
});
}
$('.paging-button input').click(function(){
selectList(currentPage + 1);
});
$('#re_form').submit(function(event){
if($('#re_content').val().trim()==''){
alert('내용을 입력하세요');
$('#re_content').val('').focus();
return false;
}
let form_data = $(this).serialize();
$.ajax({
url:'writeReply.do',
type:'post',
data:form_data,
dataType:'json',
success:function(param){
if(param.result == 'logout'){
alert('로그인해야 작성할 수 있습니다.');
}else if(param.result == 'success'){
initForm();
selectList(1);
}else{
alert('댓글 등록 오류');
}
},
error:function(){
alert('네트워크 오류 발생');
}
});
event.preventDefault();
});
function initForm(){
$('textarea').val('');
$('#re_first .letter-count').text('300/300');
}
$(document).on('click','.modify-btn',function(){
let re_num = $(this).attr('data-renum');
let content = $(this).parent().find('p').html().replace(/<br>/gi,'\n');
let modifyUI = '<form id="mre_form">';
modifyUI += '<input type="hidden" name="re_num" id="mre_num" value="' + re_num + '">';
modifyUI += '<textarea rows="3" cols="50" name="re_content" id="mre_content" class="rep-content">' + content +'</textarea>';
modifyUI += '<div id="mre_first"><span class="letter-count">300/300</span></div>';
modifyUI += '<div id="mre_second" class="align-right">';
modifyUI += ' <input type="submit" value="수정">';
modifyUI += ' <input type="button" value="취소" class="re-reset">';
modifyUI += '</div>';
modifyUI += '<hr size="1" noshade width="96%">';
modifyUI += '</form>';
initModifyForm();
$(this).parent().hide();
$(this).parents('.item').append(modifyUI);
let inputLength = $('#mre_content').val().length;
let remain = 300 - inputLength;
remain += '/300';
$('#mre_first .letter-count').text(remain);
});
function initModifyForm(){
$('.sub-item').show();
$('#mre_form').remove();
}
$(document).on('click','.re-reset',function(){
initModifyForm();
});
$(document).on('submit','#mre_form',function(event){
if($('#mre_content').val().trim()==''){
alert('내용을 입력하세요');
$('#mre_content').val('').focus();
return false;
}
let form_data = $(this).serialize();
$.ajax({
url:'updateReply.do',
type:'post',
data:form_data,
dataType:'json',
success:function(param){
if(param.result == 'logout'){
alert('로그인해야 수정할 수 있습니다.');
}else if(param.result == 'success'){
$('#mre_form').parent().find('p').html($('#mre_content').val().replace(/</g,'<').replace(/>/g,'>').replace(/\n/g,'<br>'));
$('#mre_form').parent().find('.modify-date').text('최근 수정일 : 5초미만');
initModifyForm();
}else if(param.result == 'wrongAccess'){
alert('타인의 글을 수정할 수 없습니다.');
}else{
alert('댓글 수정 오류 발생');
}
},
error:function(){
alert('네트워크 오류 발생');
}
});
event.preventDefault();
});
$(document).on('keyup','textarea',function(){
let inputLength = $(this).val().length;
if(inputLength > 300){
$(this).val($(this).val().substring(0,300));
}else{
let remain = 300 - inputLength;
remain += '/300';
if($(this).attr('id') == 're_content'){
$('#re_first .letter-count').text(remain);
}else{
$('#mre_first .letter-count').text(remain);
}
}
});
$(document).on('click','.delete-btn',function(){
let re_num = $(this).attr('data-renum');
$.ajax({
url:'deleteReply.do',
type:'post',
data:{re_num:re_num},
dataType:'json',
success:function(param){
if(param.result == 'logout'){
alert('로그인해야 삭제할 수 있습니다.');
}else if(param.result == 'success'){
alert('삭제 완료!');
selectList(1);
}else if(param.result == 'wrongAccess'){
alert('타인의 글을 삭제할 수 없습니다.');
}else{
alert('댓글 삭제 오류 발생');
}
},
error:function(){
alert('네트워크 오류 발생');
}
});
});
selectList(1);
});
Properties
Board
/board/updateReply.do=kr.board.action.UpdateReplyAction
/board/deleteReply.do=kr.board.action.DeleteReplyAction