Ajax를 이용하여 댓글 게시판 만들기
○ struts2 답변형 게시판 & Ajax를 사용한 방명록 참고
1. 필요한 파일 확인
○ com.util.sqlMap
- ibbs_sqlMap.xml
○ com.ibbs
- BoardAction.java
- BoardDTO.java
- CommentAction.java
- CommentDTO.java
○ WebContent > ibbs
- css폴더 : article.css, created.css, list.css, style.css
- article.jsp
- commentList.jsp
- created.jsp
- list.jsp
○ WEB-INF > classes
- struts.xml
- struts-ibbs.xml
○ WEB-INF > sqlMapConfig
- sqlMapConfig.xml
2. 테이블 생성
① 게시판 테이블
create table ibbs (
boardNum NUMBER(9) not null,
name VARCHAR2(20) not null,
email VARCHAR2(50),
subject VARCHAR2(50) not null,
content VARCHAR2(4000) not null,
ipAddr VARCHAR2(20) not null,
hitCount NUMBER(9) not null,
created DATE,
constraint pk_ibbs_boardNum primary key(boardNum));
② 댓글 테이블
create table ibbsComment (
commentNum NUMBER(9) not null,
boardNum NUMBER(9) not null,
commentName VARCHAR2(20) not null,
commentContent VARCHAR2(100) not null,
ipAddr VARCHAR2(20) not null,
created DATE,
constraint pk_ibbsComment_commentNum primary key(commentNum),
constraint fk_ibbsComment_boardNum foreign key(boardNum) referenceibbs(boardNum) on delete cascade);
① BoardDTO
package com.ibbs;
public class BoardDTO {
private int boardNum;
private String name;
private String email;
private String subject;
private String content;
private String ipAddr;
private int hitCount;
private String created;
private int comment;
private int boardListNum;
private String pageNum;
private String searchKey;
private String searchValue;
private String mode;
//getter&setter
}
② CommentDTO
package com.ibbs;
public class CommentDTO {
private int commentNum;
private int boardNum;
private String commentName;
private String commentContent;
private String ipAddr;
private String created;
private int commentListNum;
private String commentPageNum;
//getter&setter
}
4. jsp파일 작성
○ created.jsp : 게시물 작성 및 수정
○ list.jsp : 작성된 게시물 보여주는 창
○ article.jsp : 하나의 게시물 내용 + 이전글&다음글 + 댓글
○ commentList.jsp : 댓글내용
① created.jsp
○ 수정 부분
- 답글 부분 삭제
<div id="bbsCreated_footer">
<input type="hidden" name="searchKey" value="${dto.searchKey }">
<input type="hidden" name="searchValue" value="${dto.searchValue }">
<!-- 수정에서 필요 -->
<input type="hidden" name="boardNum" value="${dto.boardNum }">
<input type="hidden" name="pageNum" value="${pageNum }">
<input type="hidden" name="mode" value="${mode }">
<c:if test="${mode=='created' }">
<input type="button" value="등록하기" class="btn2" onclick="sendIt()" />
<input type="reset" value="다시입력" class="btn2" onclick="document.myForm.subject.focus();" />
<input type="button" value="작성취소" class="btn2"
onclick="javascript:location.href='<%=cp %>/ibbs/list.action?pageNum=${pageNum }';" />
</c:if>
<c:if test="${mode=='updated' }">
<input type="button" value="수정하기" class="btn2" onclick="sendIt()" />
<input type="button" value="수정취소" class="btn2" onclick="javascript:location.href='<%=cp %>/ibbs/list.action?
pageNum=${pageNum }&searchKey=${dto.searchKey }&searchValue=${dto.searchValue }';" />
</c:if>
② list.jsp
○ 수정 부분 없음
③ article.jsp
○ script 추가
- Ajax 실행 부분
- 댓글 작성시 넘겨줘야 하는 데이터 : boardNum, commentName, commentContent
$(function(){
$("#writeComment").click(function(){
var params = "boardNum=" + ${dto.boardNum} + "&commentName=" + $("#commentName").val()
+ "&commentContent=" + $("#commentContent").val();
$.ajax({
type:"POST",
url:"<%=cp%>/ibbs/commentCreated.action",
data:params,
success:function(args){
$("#listData").html(args);
$("#commentName").val("");
$("#commentContent").val("");
},
beforeSend:showRequest,
error:function(e){
alert(e.responseText);
}
});
});
});
○ showRequest() 함수
- 사용자가 값을 입력했는지 검사 : beforeSend
- 마지막에 return값으로 반드시 true를 줘야 한다.
- beforeSend는 true값이 오지 않으면 다음 작업을 실행하지 않음
function showRequest(){
var commentName = $.trim($("#commentName").val());
var commentContent = $.trim($("#commentContent").val());
if(!commentName){
alert("\n이름을 입력해주세요");
$("#commentName").focus();
return false;
}
if(!commentContent){
alert("\n내용을 입력해주세요");
$("#commentContent").focus();
return false;
}
if(commentContent.length>100){
alert("\n내용은 100자를 초과할 수 없습니다");
$("#content").focus();
return false;
}
return true;
}
○ listPage() 함수
- 페이징 작업
- boardNum을 넘겨줘야 한다
function listPage(page){
var url = "<%=cp%>/ibbs/commentList.action?boardNum="+ ${dto.boardNum};
$.post(url,{commentPageNum:page},function(args){
$("#listData").html(args);
});
$("#listData").show(); //display:block의 역할 - 보여지는거(none의 반대)
}
○ deleteData() 함수
- 댓글 삭제
- boardNum을 넘겨줘야 한다
function deleteData(num,page){
var url = "<%=cp%>/ibbs/commentDeleted.action?boardNum="+ ${dto.boardNum};
$.post(url,{commentNum:num,commentPageNum:page},function(args){
$("#listData").html(args);
});
}
○ 댓글 작성창 및 댓글 출력 창 작성
- <span id="listData" style="display: none;"></span> : 댓글 출력 부분
<div id="bbsCreated">
<table width="600" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td width="600" colspan="3" height="2" bgcolor="#dbdbdb"></td>
</tr>
<tr>
<td width="120" height="30" bgcolor="#eeeeee" align="center">작성자</td>
<td width="380" height="30" style="padding-left: 10px;">
<input type="text" id="commentName" size="72" maxlength="20" class="boxTF"/>
</td>
<td width="100" rowspan="3" height="30" align="right" style="padding-right: 15px;">
<input type="button" value="등록" class="btn2" style="width: 50pt; height: 50pt;" id="writeComment">
</td>
</tr>
<tr>
<td width="600" colspan="2" height="1" bgcolor="#dbdbdb"></td>
</tr>
<tr>
<td width="120" height="30" bgcolor="#eeeeee" align="center">내용</td>
<td width="380" style="padding-left: 10px;">
<textarea rows="2" cols="55" class="boxTA" style="height: 50px" id="commentContent"></textarea>
</td>
</tr>
<tr>
<td width="600" colspan="3" height="2" bgcolor="#dbdbdb"></td>
</tr>
</table>
</div>
<br/>
<span id="listData" style="display: none;"></span>
④ commentList.jsp
○ 댓글 출력폼을 만들어서 넘겨주는 부분
<c:if test="${commentDataCount!=0 }">
<table width="600" border="0" cellpadding="0" cellspacing="0" align="center">
<c:forEach var="dto" items="${commentList }">
<tr>
<td colspan="2" bgcolor="#999999" height="2"></td>
</tr>
<tr height="30">
<td width="300" style="padding-left: 10px;" bgcolor="#eeeeee">
<b>작성자 : ${dto.commentName }</b>
</td>
<td width="300" align="right" style="padding-right: 10px;" bgcolor="#eeeeee">
${dto.created }
<a href="javascript:deleteData('${dto.commentNum }','${commentPageNum }')">삭제</a>
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#e6e6e6" height="1"></td>
</tr>
<tr>
<td height="30" style="padding: 10px;" colspan="2">
${dto.commentContent }
</td>
</tr>
</c:forEach>
<tr>
<td colspan="2" bgcolor="#dbdbdb" height="2"></td>
</tr>
<tr height="30">
<td align="center" colspan="2">
${pageIndexList }
</td>
</tr>
</table>
</c:if>
5. ibbs_sqlMpa.xml 작성
① 게시판
○ boardNum 최댓값
○ 게시판 입력
○ 데이터 갯수
○ 전체 게시판 데이터
○ 게시판 조회수 증가
○ 한 개의 게시물 내용
○ 이전글
○ 다음글
○ 게시물 수정
○ 게시물 삭제
② 댓글
○ commentNum 최댓값
○ 댓글 입력
○ 하나의 게시물에 달린 댓글 갯수
○ 하나의 게시물에 달린 전체 댓글 데이터
○ 댓글 삭제
6. BoardAction 작성
○ dao와 myutil 생성 부분을 스프링으로 변경
private BoardDTO dto;
public BoardDTO getDto() {
return dto;
}
@Resource(name="dao")
private CommonDAO dao;
@Resource(name="myUtil")
private MyUtil myutil;
@Override
public BoardDTO getModel() {
return dto;
}
@Override
public void prepare() throws Exception {
dto = new BoardDTO();
}
○ 각각의 메소드에서 dao와 myutill 객체 생성 부분 지움
○ created, updated, article, deleted 메소드는 변경 부분 없음
○ list메소드에서 댓글 갯수를 dto에 추가
while(it.hasNext()){
BoardDTO vo = (BoardDTO)it.next();
listNum = totalDataCount-(start+n-1);
vo.setBoardListNum(listNum);
vo.setComment(dao.getIntValue("ibbs.commentDataCount", vo.getBoardNum()));
n++;
}
7. CommentAction 작성
① 객체 생성
private CommentDTO dto;
@Resource(name="dao")
private CommonDAO dao;
@Resource(name="myUtil")
private MyUtil myutil;
@Override
public CommentDTO getModel() {
return dto;
}
@Override
public void prepare() throws Exception {
dto = new CommentDTO();
}
② commentCreated() 메소드
○ 리다이렉트를 하면 안되므로 commentList 메소드를 찾아가도록 설정
public String commentCreated() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
int maxNum = dao.getIntValue("ibbs.maxCommentNum");
dto.setCommentNum(maxNum+1);
dto.setIpAddr(request.getRemoteAddr());
dao.insertData("ibbs.insertCommentData", dto);
return commentList();
}
③ commentList() 메소드
public String commentList() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String cp = request.getContextPath();
int boardNum = Integer.parseInt(request.getParameter("boardNum"));
int numPerPage = 5;
int totalPage = 0;
int commentDataCount = 0;
String commentPageNum = request.getParameter("commentPageNum");
int currentPage = 1;
if(commentPageNum!=null && !commentPageNum.equals("")){
currentPage = Integer.parseInt(commentPageNum);
}else{
commentPageNum = "1";
}
commentDataCount = dao.getIntValue("ibbs.commentDataCount",boardNum);
if(commentDataCount!=0)
totalPage = myutil.getPageCount(numPerPage, commentDataCount);
if(currentPage>totalPage)
currentPage = totalPage;
int start = (currentPage-1)*numPerPage+1;
int end = currentPage*numPerPage;
Map<String, Object> hMap = new HashMap<String, Object>();
hMap.put("start", start);
hMap.put("end", end);
hMap.put("boardNum",boardNum);
List<Object> commentList = (List<Object>)dao.getListData("ibbs.listCommentData", hMap);
int listNum,n=0;
ListIterator<Object> it = commentList.listIterator();
while(it.hasNext()){
CommentDTO vo = (CommentDTO)it.next();
listNum = commentDataCount-(start+n-1);
vo.setCommentListNum(listNum);
vo.setCommentContent(vo.getCommentContent().replaceAll("\n", "<br/>"));
n++;
}
String pageIndexList = myutil.pageIndexList(currentPage, totalPage);
request.setAttribute("commentList", commentList);
request.setAttribute("pageIndexList", pageIndexList);
request.setAttribute("commentDataCount", commentDataCount);
request.setAttribute("commentPageNum", commentPageNum);
return SUCCESS;
}
④ commentDeleted() 메소드
○ 리다이렉트를 하면 안되므로 commentList 메소드를 찾아가도록 설정
public String commentDeleted() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
int commentNum = Integer.parseInt(request.getParameter("commentNum"));
dao.deleteData("ibbs.deleteCommentData",commentNum);
return commentList();
}
8. struts-ibbs.xml 작성
<package name="ibbs" extends="default" namespace="/ibbs" >
<action name="created" method="created" class="com.ibbs.BoardAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result name="input">/ibbs/created.jsp</result>
<result name="success" type="redirectAction">list</result>
</action>
<action name="updated" method="updated" class="com.ibbs.BoardAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result name="input">/ibbs/created.jsp</result>
<result name="success" type="redirectAction">list?pageNum=${pageNum}&searchKey=${searchKey}&searchValue=${searchValue}</result>
</action>
<action name="deleted" method="deleted" class="com.ibbs.BoardAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result name="success" type="redirectAction">list?pageNum=${pageNum}&searchKey=${searchKey}&searchValue=${searchValue}</result>
</action>
<action name="list" method="list" class="com.ibbs.BoardAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result name="success">/ibbs/list.jsp</result>
</action>
<action name="article" method="article" class="com.ibbs.BoardAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result name="success">/ibbs/article.jsp</result>
<result name="read-error" type="redirectAction">list</result>
</action>
action name="commentCreated" method="commentCreated" class="com.ibbs.CommentAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result>/ibbs/commentList.jsp</result>
</action>
<action name="commentList" method="commentList" class="com.ibbs.CommentAction">
<result>/ibbs/commentList.jsp</result>
</action>
<action name="commentDeleted" method="commentDeleted" class="com.ibbs.CommentAction">
<interceptor-ref name="myPrepareParamsStack"/>
<result>/ibbs/commentList.jsp</result>
</action>
</package>
9.xml에 파일 추가
① struts.xml
<include file="struts-ibbs.xml"></include>
② action-Content.xml
<bean id="BoardAction" class="com.ibbs.BoardAction" scope="prototype"/>
<bean id="CommentAction" class="com.ibbs.CommentAction" scope="prototype"/>
③ sqlMapConfig.xml
<sqlMap resource="com/util/sqlMap/iguest_sqlMap.xml"/>
<sqlMap resource="com/util/sqlMap/ibbs_sqlMap.xml"/>
10. 댓글 작성 실행 흐름
추가. 필요한 파일 확인
○ com.util.sqlMap
○ com.ibbs
○ WebContent > ibbs
- css풀도
- jsp 파일
○ WEB-INF > classes
'STUDY > jQuery & Ajax' 카테고리의 다른 글
Ajax를 사용한 방명록 (0) | 2019.04.03 |
---|---|
Json을 사용해서 자바스크립트의 객체 생성 (0) | 2019.04.03 |
자바스크립트 객체 : JSON 표기법 (0) | 2019.04.02 |
Document Object Model과 XML (0) | 2019.04.02 |
자바스크립트로 Ajax 구현 (0) | 2019.04.01 |
댓글