[ITWILL : JSP]Javabean 8 : 게시판만들기(글내용보기, 글수정하기)

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

1. 순서

  1. content.jsp 생성
    • html 테이블작성
  2. boardDAO.java에 updateReadCount(int bno)메서드 생성
  3. boardDAO.java에 getBoard(int bno)메서드 생성
  4. 글수정할 수 있는 updateForm.jsp 생성
  5. 글수정할 수 있는 updatePro.jsp 생성
  6. boardDAO.java에 updateBoard(bb)메서드 생성

2. content.jsp 생성

글목록에서 제목을 눌렀을때 컨텐츠를 볼 수 있게 만드는 페이지이다.

  • 목록으로 되돌아가는 버튼 만들때 주의점
    • location.href=boardList.jsp만 하면 5페이지보고있다가 다시 1페이지로 돌아가버린다
    • 이때 historyback하면 조회수가 올라가지않는다.
    • 따라서 pageNum을 가져와서 사용하면된다
    • location.href=boardList.jsp?pageNum=<%=pageNum%>으로 해줘야한다.
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
59
60
61
62
63
<%
//1. html테이블작성

//글번호(pk제약조건의 컬럼필수)에 해당하는 글의 정보를 가져오기
//2. 전달된 데이터 저장(bno, pageNum)

int bno = Integer.parseInt(request.getParameter("bno"));
String pageNum = request.getParameter("pageNum");

//3. DAO객체생성
BoardDAO bdao = new BoardDAO();

//4. 글의 조회수정보를 1증가 : DB에서처리 -> DAO객체에 updateReadCount(bno)메서드 생성
bdao.updateReadCount(bno);

//5. 화면(테이블)에 출력 (getBoard(bno))
// DAO객체에 글정보를 가져오는 메서드 생성
BoardBean bb = bdao.getBoard(bno);
//System.out.println(bdao.getBoard(bno));
%>

<fieldset>
<legend>글 내용 보기</legend>
<table border="solid,1px">
<tr>
<th>글번호</th>
<td><%=bno%></td>
<th>조회수</th>
<td><%=bb.getReadcount()%></td>
</tr>
<tr>
<th>작성자</th>
<td><%=bb.getName() %></td>
<th>작성일</th>
<td><%=bb.getDate() %></td>
</tr>
<tr>
<th>제목</th>
<td colspan="3"><%=bb.getSubject() %></td>
</tr>
<tr>
<th>첨부파일</th>
<td colspan="3"><%=bb.getFile() %></td>
</tr>
<tr>
<th>내용</th>
<td colspan="3" height="300px"><%=bb.getContent() %></td>
</tr>
<tr>
<td colspan="4" style="text-align:center">
<input type="button" value="글수정" class="btn" onclick="location.href='updateForm.jsp?bno=<%=bb.getBno()%>&pageNum=<%=pageNum%>'">
<input type="button" value="글삭제" class="btn">
<input type="button" value="답글쓰기" class="btn">
<input type="button" value="목록으로" class="btn"
onclick="location.href='boardList.jsp?pageNum=<%=pageNum%>'">
<!-- location.href='boardList.jsp만 하면 5페이지보고있다가 다시 1페이지로 돌아가버린다
이때 historyback하면 조회수가 올라가지않는다.
따라서 pageNum을 가져와서 사용하면된다
-->
</td>
</tr>
</table>
</fieldset>

3. boardDAO.java에 updateReadCount(int bno)메서드 생성

조회수 올리는 메서드를 생성하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void updateReadCount(int bno){
try {
//1. 디비연결
getCon();
//2. sql작성 & pstmt생성
//select를 안하는 이유? 기존의 데이터를 굳이 가져올 필요가 없기 때문
sql = "update itwill_board set readcount=readcount+1 where bno=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, bno);
//3. 실행
pstmt.executeUpdate();
System.out.println("조회수 1증가 완료");
} catch (Exception e) {
System.out.println("조회수 1증가 실패");
e.printStackTrace();
} finally {
//4. 자원해제
closeDB();
}
}

4. boardDAO.java에 getBoard(int bno)메서드 생성

글 내용을 다 가져와서 오는 메서드를 만들어보자
이는 글제목을 클릭시 화면에 내용을 보여줄때 사용된다.

  • 내코드
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
public BoardBean getBoard(int bno){
BoardBean bb = new BoardBean();
try {
//1. 디비연결
getCon();
//2. sql작성, pstmt
//sql = "select * from itwill_board";
sql = "select * from itwill_board where bno=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, bno);
//3. 실행 -> rs저장
rs = pstmt.executeQuery();
//4. 데이터처리
if(rs.next()){
//4-1.BoardBean 객체생성해서 그 안에 rs데이터 저장
bb.setBno(rs.getInt("bno"));
bb.setContent(rs.getString("content"));
bb.setDate(rs.getDate("date"));
bb.setFile(rs.getString("file"));
bb.setIp(rs.getString("ip"));

bb.setName(rs.getString("name"));
bb.setPw(rs.getString("pw"));
bb.setRe_lev(rs.getInt("re_lev"));
bb.setRe_ref(rs.getInt("re_ref"));
bb.setRe_seq(rs.getInt("re_seq"));

bb.setReadcount(rs.getInt("readcount"));
bb.setSubject(rs.getString("subject"));
//여기까지가 한 행의 데이터를 저장한 것임

}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeDB();
}
return bb;
}//getBoard닫음
  • 강사님코드
    • BoardBean객체를 언제 생성하는 지가 내 코드와 달랐다. BoardBean객체를 미리 생성할 필요가 없었다.
    • try catch로 예외가 발생하거나, rs에 데이터가 없는 경우에는 객체를 생성할 필요가 없기 때문이다.
    • 글정보 저장완료 후 리턴값 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
//글 정보를 가져오는 메서드구현
public BoardBean getBoard(int bno){
//rs에 데이터가 없으면 객체생성할 필요가 없음. 따라서 객채생성안하고 null함.
BoardBean bb = null;
try {
//1. 디비연결
getCon();
//2. sql작성, pstmt
//sql = "select * from itwill_board";
sql = "select * from itwill_board where bno=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, bno);
//3. 실행 -> rs저장
rs = pstmt.executeQuery();
//4. 데이터처리
if(rs.next()){
//4-1.BoardBean 객체생성해서 그 안에 rs데이터 저장
// 글내용에서 보이지 않는 컴럼들도 만들어야할까?
// 만들기를 추천함 why? 매개변수인 bno자체가 pk를 가졌다.
// 지금뿐만아니라 다음 기능이 필요할때 불러와서 사용할 수 있다.
// 재사용성
bb = new BoardBean();
bb.setBno(rs.getInt("bno"));

(중략)

bb.setSubject(rs.getString("subject"));
//여기까지가 한 행의 데이터를 저장한 것임
}
//글정보 저장완료 후 정보확인
System.out.println("해당 글 저장 완료");
System.out.println(bb);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeDB();
}
return bb;
}//getBoard닫음

5. updateForm.jsp생성

글을 수정할수있는 페이지를 만들어보자.

  • 아래 태그 두개는 동일할까?

    • <input type="button" value="목록으로" class="btn" onclick="location.href='boardList.jsp?bno=<%=bno%>'">
    • <input type="button" value="목록으로" class="btn" onclick="location.href='boardList.jsp?bno=<%=bb.getBno()%>'">
  • YES! 동일하다!

  • 인풋 히튼타입 : 화면에는 보이지않지만 데이터 저장 및 전달이 가능해서 데이터 이동용으로 주로 사용

  • BoardBean안에 포함되지 않는 pageNum 변수등은 어떻게 전달할까?

    • 액션페이지 주소줄에 get방식으로 전달
    • 만약 (BoardBean에 포함되지않은) 전달될 데이터가 개인정보등 중요한 데이터라면 get방식으로 전달해선 절대 안된다(=>정보유출문제발생)
      • 그럼 중요한 정보들은 전달할수없는걸까? CAN! 1. 클로저이용 또는 2.BoardBean구조자체를 변경
    • 결론: 가능하면 BoardBean형태의 데이터만 저장해서 처리할 수 있도록 해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%//1. 파라미터저장
int bno = Integer.parseInt(request.getParameter("bno"));
String pageNum = request.getParameter("pageNum");

BoardDAO bdao = new BoardDAO();
BoardBean bb = bdao.getBoard(bno);
%>

<fieldset>
<legend>게시판 글쓰기</legend>
<form action="updatePro.jsp?pageNum=<%=pageNum %>" method="post" name="fr">
<!-- 인풋 히튼타입 : 화면에는 보이지않지만 데이터 저장 및 전달이 가능해서 데이터 이동용으로 주로 사용 -->
<input type="hidden" name="bno" value="<%=bb.getBno() %>">
글쓴이 : <input type="text" name="name" required value="<%=bb.getName() %>"><br>
비밀번호 : <input type="password" name="pw" required ><br>
제목 : <input type="text" name="subject" required value="<%=bb.getSubject() %>"><br>
내용 : <br>
<textarea rows="10" cols="35" name="content" placeholder="여기에 작성해주세요" required>
<%=bb.getContent() %></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>

6. updatePro.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
31
32
33
34
35
<%//1. 한글처리
request.setCharacterEncoding("UTF-8");
//2. 파라미터저장(액션태그사용 & pageNum은 파라미터로)
String pageNum = request.getParameter("pageNum");
%>
<jsp:useBean id="bb" class="com.itwillbs.board.BoardBean"></jsp:useBean>
<jsp:setProperty property="*" name="bb"/>
<% //3. DAO생성
BoardDAO bdao = new BoardDAO();
//4. 정보수정메서드 updateBoard(bb)
// -> 결과를 정수형 데이터로 리턴 (1=>정상처리, 0=>비번오류, -1=>해당글없음)
int result = bdao.updateBoard(bb);
if( result == 1){
%>
<script type="text/javascript">
alert("글 수정 완료!");
location.href="boardList.jsp?pageNum=<%=pageNum%>";
</script>
<%
}else if(result == 0){
%>
<script type="text/javascript">
alert("비번이 일치하지않습니다");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("존재하지 않는 글입니다");
history.back();
</script>
<%
}
%>

7. boardDAO.java에 updateBoard(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
public int updateBoard(BoardBean bb){
int result = 0;

try {
//DB연결
getCon();
System.out.println("디비연결완료");
//sql & pstmt
sql = "select pw from itiwill_board where bno=?";
pstmt = con.prepareStatement(sql);
System.out.println("pstmt 객체생성완료");
pstmt.setInt(1, bb.getBno());

rs = pstmt.executeQuery();
System.out.println("pstmt 실행");
if(rs.next()){
//비번비교 후 일치하면 update 쿼리실행
if(bb.getPw().equals(rs.getString("pw"))){
sql="update itwill_board set name=?, subject=?, content=? where bno=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bb.getName());
pstmt.setString(2, bb.getSubject());
pstmt.setString(3, bb.getContent());
pstmt.setInt(4, bb.getBno());
pstmt.executeUpdate();
System.out.println("글수정완료 - 비번일치");
//리컨값 변경
result =1;
}else{//비번불일치
System.out.println("글수정실패 - 비번불일치");
result = 0;
}
}else{
System.out.println("글수정실패 - 해당글없음");
result = -1;
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeDB();
}
return result;
}//updateBoard닫음

Comments