[ITWILL : JSP]Javabean 10 : 게시판만들기(답글쓰기)

ITWILL학원 : 30강 JSP기초 BY 정규태강사

1. 답글처리구현 순서

  • 일반글 = 답글이 아닌 글.
  • num : 일반글+답글 둘 다 작성할때마다 계속 증가된 값으로 사용(순차적)
  • re_ref : 답글의 그룹번호(일반글번호와 동일), 답글을 다는 원글의 그룹번호를 사용
  • re_lev (level) : 답글의 레벨값 (깊이), 원글을 기준으로한다 ex)한번내려가면1 두번내려가면 2
  • re_seq (sequence) : 답글의 순서, 원글에 답글이 몇개인지하는 순서대로 카운트.

글목록 예시

  • 일반글은 ref만 num값과 동일하게 초기화
  • 답글은 lev, seq는 0으로 초기화

만약 여기서 3번글의 답글 1개를 추가한다면?
6 / 답급3-1 / 3 / 1 / 1

만약 여기서 3번글의 답글 1개를 추가한다면?
6 / 답글3-1 / 3 / 1 / 1

만약 여기서 3번글의 답글 1개를 또 추가한다면?
7 / 답글3-2 / 3 / 1 / 2

만약 여기서 3번답글인 3-1에 답글 1개를 추가한다면?
8 / 답글3-1-1 / 3 / 2 / 3

만약 여기서 4번밑에 답글을 단다면?
9 / 답글4-1 / 4 / 1 / 1

만약 여기서 일반글 작성한다면?
10 / 일반글 / 10 / 0 / 0

만약 여기서 답글4-1에 답글을 단다면?
11 / 답글4-1-1 / 4 / 2 / 2

2. reWriteForm.jsp 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%
//한글처리
request.setCharacterEncoding("UTF-8");

//전달한 데이터 저장 (bno,re_ref, re_lev, &re_seq)
int bno = Integer.parseInt(request.getParameter("bno"));
int re_ref = Integer.parseInt(request.getParameter("re_ref"));
int re_lev = Integer.parseInt(request.getParameter("re_lev"));
int re_seq = Integer.parseInt(request.getParameter("re_seq"));

//어떻게 가져갈 것인가? 폼태그안에 담아갈까? 주소창에 GET방식으로 가져갈까?
//bean의 멤버변수에 있는 변수는 폼태그안에 담아가면된다. =>hidden 인풋태그
%>
<fieldset>
<legend>게시판 답글쓰기</legend>
<form action="reWritePro.jsp" method="post" name="fr">
<input type="hidden" name="bno" value="<%=bno%>">
<input type="hidden" name="re_ref" value="<%=re_ref%>">
<input type="hidden" name="re_lev" value="<%=re_lev%>">
<input type="hidden" name="re_seq" value="<%=re_seq%>">
글쓴이 : <input type="text" name="name" required><br>
비밀번호 : <input type="password" name="pw" required><br>
제목 : <input type="text" name="subject" maxlength="15" value="[답글] " required><br>
내용 : <br>
<textarea rows="10" cols="35" name="content" placeholder="여기에 답글을 작성해주세요" required></textarea><br>
<input type="submit" value="답글등록" class="btn">
<button type="reset" class="btn">초기화</button>
<input type="button" value="목록으로" class="btn" onclick="location.href='boardList.jsp'">
</form>
</fieldset>

3. reWritePro.jsp 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%
// 한글 처리
request.setCharacterEncoding("UTF-8");
// 액션태그 사용 파라미터값 저장
// useBean,setProperty
%>
<jsp:useBean id="bb" class="com.itwillbs.board.BoardBean"/>
<jsp:setProperty property="*" name="bb"/>
<%
System.out.println(bb);
// ip 정보 저장
bb.setIp(request.getRemoteAddr());

// BoardDAO 객체 생성 - reInsertBoard(객체)
BoardDAO bdao = new BoardDAO();
bdao.reInsertBoard(bb);

// 페이지 이동(글 목록)
response.sendRedirect("boardList.jsp");
%>

4. BoardDAO.java에서 reInsertBoard(BoardBean bb)메서드 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public void reInsertBoard(BoardBean bb){
//1.지역변수생성
int num = 0;
//2. 디비연결
try {
getCon();
//sql(게시판의 글번호 중 최댓값 계산) & pstmt
//2-1. 답글번호 계산
sql = "select max(bno) from itwill_board";
pstmt = con.prepareStatement(sql);
// 실행
rs = pstmt.executeQuery();
// 데이터 처리
if(rs.next()){
num = rs.getInt(1)+1;
}
System.out.println(" 답글 번호 : "+num);

//2-2. 답글 순서 재배치
//re_ref(같은 그룹기준)으로 re_seq값이 기존의 값보다 큰 값이 있을경우 seq값을 1증가시킴
sql = "update itwill_board set re_seq=re_seq+1 "
+ "where re_ref=? and re_seq>?";
pstmt = con.prepareStatement(sql);

pstmt.setInt(1, bb.getRe_ref());
pstmt.setInt(2, bb.getRe_seq());

pstmt.executeUpdate();

//2-3. 답글 추가 동작
sql="insert into itwill_board "
+ "values(?,?,?,?,?"
+ ",?,?,?,?,now()"
+ ",?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);//bno는 가지고있는게 아니라 계산해서 만든것이므로 num사용
pstmt.setString(2, bb.getName());
pstmt.setString(3, bb.getPw());
pstmt.setString(4, bb.getSubject());
pstmt.setString(5, bb.getContent());
pstmt.setInt(6, bb.getReadcount());
pstmt.setInt(7, bb.getRe_ref()); //기존 원글의 그룹번호와 동일
pstmt.setInt(8, bb.getRe_lev()+1); // 기존의 값 + 1
pstmt.setInt(9, bb.getRe_seq()+1); // 기존의 값 + 1
pstmt.setString(10, bb.getFile());
pstmt.setString(11, bb.getIp());

//3. 실행
pstmt.executeUpdate();
System.out.println("답글쓰기 성공");
} catch (Exception e) {
e.printStackTrace();
} finally {
closeDB();
}
} //reInsertBoard닫음

5. BoardList.jsp에서 답글 들여쓰기 추가 구현

이미지와 조건문을 통해 구현

  • img src=”level.gif” width=”<%=wid%>” height=”15”
  • img src=”re.gif”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<fieldset>
<legend>땡땡게시판</legend>
<div id="contents">
게시판 총 글의 수 : <%=cnt%> 개
<%
if(id == null){
%>
<input class="btn" type="button" value="로그인" onclick="location.href='../member/main.jsp'">
<%
}else if( id != null){
%>
<input class="btn" type="button" value="로그아웃" onclick="location.href='../member/logout.jsp'">
<input class="btn" type="button" value="글쓰기" onclick="location.href='writeForm.jsp'">
<%
}
%>
<br>
<table>
<tr>
<th>글번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
<th>작성일</th>
<th>IP</th>
</tr>
<%//반복문
//ArrayList는 가변배열이므로 length가 없고 size가 존재한다.
//size()메서드는 배열의 요소의 갯수를 리턴
for(int i=0;i<boardList.size(); i++){
//ArrayList 한칸의 정보 ->BoardBean 객체 하나로 이동
BoardBean bb = (BoardBean) boardList.get(i);
%>
<tr>
<td><%=bb.getBno()%></td>
<td>
<%
//답글일때만 이미지넣기
//변수 wid를 이용하여 들여쓰기 처리
int wid = 0;
if(bb.getRe_lev() > 0){
wid= 10 * bb.getRe_lev(); //레벨값의 10을 곱한 값만큼 이미지 가로길이를 길게해줌
%>
<img src="level.gif" width="<%=wid%>" height="15">
<img src="re.gif">
<% } %>
<a href="content.jsp?bno=<%=bb.getBno()%>&pageNum=<%=pageNum%>"><%=bb.getSubject()%></a></td>
<td><%=bb.getName()%></td>
<td><%=bb.getReadcount()%></td>
<td><%=bb.getDate()%></td>
<td><%=bb.getIp()%></td>
</tr>
<%
}
%>
</table>
</div>
</fieldset>