2013년 7월 15일 월요일

(130715~0716) 16일, 17일차 BoardWrite.jsp 외 7개 (답변형 게시판을 이용한 게시판 관리 웹페이지 만들기)

 - BoardWrite.jsp 소스
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center> <h2> 글 쓰 기 </h2>
   <%
   // 해당글이 최신글인지 답변글인지에 대한 정보를 파악 후
   // 답글이라면 저장할 변수 선언
   int num = 0;
   // 글그룹, 글스텝, 글레벨을 초기화함
   int ref = 1, re_level=0, re_step = 0;

   if(request.getParameter("num") != null){
    //답변글이라면
    num = Integer.parseInt(request.getParameter("num"));
    ref = Integer.parseInt(request.getParameter("ref"));
    re_level = Integer.parseInt(request.getParameter("re_level"));
    re_step = Integer.parseInt(request.getParameter("re_step"));
   }
  %>

   <form action="BoardWriteProc.jsp" method="post">

   <input type="hidden" name="num" value="<%=num%>">
  <%-- 새글이라면 1, 1, 1이 넘어가고, 답글이라면 지정한 값이 넘어간다. --%>
  <input type="hidden" name="ref" value="<%=ref%>">
  <input type="hidden" name="re_level" value="<%=re_level%>">
  <input type="hidden" name="re_step" value="<%=re_step%>">
  
<table width="500" border="1" cellpadding="5" cellspacing="2">
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 이 름 </th>
    <td width="330"> <input type="text" name="writer" size="25"> </td>
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 제 목  </th>
    <td width="330"> 
    <%
    if(request.getParameter("num") == null){ 
    %>
<input type="text" name="subject" size="25">
    <%
    }
    else{ 
    %>
      <input type="text" name="subject" size="25" value="┗  [Re] ">
    <%
   
    %>
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> Email </th>
    <td width="330"> <input type="text" name="email" size="25"> </td>
    </tr>

    <tr>

    <th width="70" align="center" bgcolor="FFFFFFF"> 내 용  </th>
    <td width="330"> <textarea name="content" rows="13" cols="40"></textarea> </td>
    </tr>

    <tr>

    <th width="70" align="center" bgcolor="FFFFFFF"> 비밀번호 </th>
    <td width="330"> <input type="password" name="passwd" size="25"> </td>
    </tr>
    </table>
   
    <table width="180" border="0" cellpadding="5">
    <tr>
    <td> <input type="submit" value="쓰기"> </td>
    <td> <input type="reset" value="취소"> </td>
    <td> <input type="button" value="목록" onclick="window.location='BoardList.jsp'"> </td>    
    </tr>
  </table>
  </form> 
</center>
</body>
</html>


 - BoardWriteProc.jsp 소스

<%@page import="java.util.Calendar"%>
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
   <% request.setCharacterEncoding("euc-kr"); %>
   <!-- 빈클래스 생성 -->
  <jsp:useBean id = "bbean" class = "board.BoardBean"></jsp:useBean>
  <!-- 빈클래스에 데이터를 추가 -->
   <jsp:setProperty property = "*" name = "bbean"/>
  
   <!-- 데이터를 추가 -->
  <%
  BoardDao bdao = new BoardDao();

  // 데이터를 추가하는 메소드 호출

  bdao.insertBoard(bbean);
  
  // 데이터를 추가 후 제어권을 MemberList로 넘겨줌
  response.sendRedirect("BoardList.jsp");
  %>
</body>
</html>


 - BoardBean.java 소스

package board;

import java.util.Date;


public class BoardBean {

private int num;
private String writer;
private String passwd;
private String subject;
private String content;
private String email;
private int ref;
private int re_level;
private int re_step;
private Date reg_date;
private int readcount;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public int getRe_step() {
return re_step;
}
public void setRe_step(int re_step) {
this.re_step = re_step;
}
public Date getReg_date() {
return reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
}



 - BoardDao.java 소스
package board;
import java.sql.*;
import java.util.Vector;

public class BoardDao {

String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
String id="system";
String pass="123456";
Connection con;
PreparedStatement pstmt;
ResultSet rs;


// 데이터 베이스에 접근하는 메소드 

public void con(){
try {
// 1.어느 데이터 베이스를 사용할건지를 설정 
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.실제 데이터 베이스에 접근하기위한 소스를 작성 == 접속완료되면 커넥션을 리턴
con = DriverManager.getConnection(url, id, pass); 
} catch(Exception e){

}


// 하나의 게시글을 저장하는 메소드

public void insertBoard(BoardBean bbean){
try {
// 데이터 베이스에 접근
this.con();
int num = bbean.getNum();
int ref = bbean.getRef();
int re_level = bbean.getRe_level();
int re_step = bbean.getRe_step();

// num값이 0이 아니라면 즉, 답글 이라면
// 부모값으로 넘어온 ref를 기준으로 re_level, re_step의 값을 증가시킨다.
if(num != 0){
// step을 증가시키는 데 현재 부모의 step보다 큰 것들만 1씩 더한다
// 새로운 댓글을 집어넣으면 그 댓글을 위해서 나머지 글들의 step을 1씩 증가시켜야 함
String sql = "update bboard set re_step=re_step+1 where ref=? and re_step > ?";
pstmt = con.prepareStatement(sql);
// pstmt ?에 값을 대입
pstmt.setInt(1, ref);
pstmt.setInt(2, re_step);
// 쿼리 실행
pstmt.executeUpdate();
// re_step과 re_level을 1씩 증가 = 즉, 현재 re_step과 re_level은 부모의 값이기에
// 부모값에서 1씩 증가시킨다.
re_level+=1;
re_step+=1; // 자신을 증가시킴
}

else{
// 새 글이라면
// 현재 글그룹의 최고값을 가져옴
String sql = "select max(ref) from bboard"; // ref의 최고값을 리턴
pstmt = con.prepareStatement(sql);
// 쿼리 실행 후 결과를 rs가 받아줌
rs = pstmt.executeQuery();
if(rs.next()){
ref = rs.getInt(1)+1; // max(ref)를 가져와서 +1을 수행
}
else{ // 첫 새 글 이라면
ref = 1;
}
re_step = 0; // 새 글이라면
re_level = 0;
}

// 쿼리준비 (nextval를 이용해서 자동적으로 값을 증가시킴, sysdate를 이용해서 현재 날짜를 입력함)
String sql ="insert into bboard values(board_seq.nextval,?,?,?,?,?,?,?,?,sysdate,0)";
// 쿼리 실행객체 준비
pstmt = con.prepareStatement(sql);
// ?에 데이터 입력
pstmt.setString(1, bbean.getWriter()); 
pstmt.setString(2, bbean.getPasswd());
pstmt.setString(3, bbean.getSubject()); 
pstmt.setString(4, bbean.getContent()); 
pstmt.setString(5, bbean.getEmail()); 
pstmt.setInt(6, ref);
pstmt.setInt(7, re_level);
pstmt.setInt(8, re_step);

// 쿼리를 실행 하시오

pstmt.executeUpdate();
// 자원 반납
pstmt.close();
con.close();
rs.close();
} catch (Exception e) {
}
}


// 모든 게시글의 데이터를 가져오는 메소드

public Vector<BoardBean> getAllBoard(int startRow, int endRow){
// 전체 게시글의 내용을 저장하는 객체
Vector<BoardBean> vector = new Vector<>();
BoardBean bean;
// 커넥션 연결
this.con();
// 쿼리 준비
// String sql = "select * from bboard ORDER BY REF DESC, RE_STEP ASC"; // Order by를 이용해서 정렬
String sql = "select * from (Select A.*, Rownum Rnum from (select * from bboard order by ref Desc, re_step Asc)A) WHERE Rnum > ? and Rnum <= ?";
try {
// 쿼리 실행할 준비
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, startRow-1);
pstmt.setInt(2, endRow);
// 쿼리 실행
rs = pstmt.executeQuery();
// 반복문을 이용하여 데이터를 빈클래스에 담은 후 그 빈클래스를 백터에 저장
while(rs.next()){
bean = new BoardBean();
bean.setNum(rs.getInt(1));
bean.setWriter(rs.getString(2));
bean.setPasswd(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setContent(rs.getString(5));
bean.setEmail(rs.getString(6));
bean.setRef(rs.getInt(7));
bean.setRe_level(rs.getInt(8));
bean.setRe_step(rs.getInt(9));
bean.setReg_date(rs.getDate(10));
bean.setReadcount(rs.getInt(11));
// 빈클래스에 담은 데이터를 백터에 추가
vector.add(bean);
}   
con.close();
pstmt.close();
rs.close();
} catch (Exception e) {
}  
return vector;
}


// 한사람의 대한 정보를 모두 얻어오는 메소드

public BoardBean getOneBoard(int num){
// 조회수를 증가시켜주는 메소드 호출
setCount(num);
BoardBean bean = null; // 리턴하기위해서 필요한 객체- 한 게시물에 대한 정보가 저장되는 클래스
// 커넥션 연결
this.con();
// 쿼리 준비
String sql ="select * from bboard where num=?";
try {
// 쿼리를 실행시킬 객체 선언
pstmt = con.prepareStatement(sql);
// ?에 값을 입력
pstmt.setInt(1, num);
// 쿼리 실행후 데이터를 리턴 받음
rs = pstmt.executeQuery();

while(rs.next()){

bean = new BoardBean();
bean.setNum(rs.getInt(1));
bean.setWriter(rs.getString(2));
bean.setPasswd(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setContent(rs.getString(5));
bean.setEmail(rs.getString(6));
bean.setRef(rs.getInt(7));
bean.setRe_level(rs.getInt(8));
bean.setRe_step(rs.getInt(9));
bean.setReg_date(rs.getDate(10));
bean.setReadcount(rs.getInt(11));
}
con.close();
pstmt.close();
rs.close();  
} catch (Exception e) {
}
return bean;
}


// 게시판 정보 수정

public void updateBoard(int num, String subject, String content){
// 커넥션 연결
this.con();
// 쿼리준비
String sql = "update bboard set subject=?, contents=? where num=?";
try {
// 커리를 실행할수 있는 객체 생성
pstmt = con.prepareStatement(sql);
pstmt.setString(1, subject);
pstmt.setString(2, content);
pstmt.setInt(3, num);
// 커리 실행
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
}
}


// 게시판 정보 삭제

public void deleteBoard(int num){
// 커넥션 연결
this.con();
// 쿼리준비
String sql = "delete from bboard where num=?";
try {
// 쿼리를 실행할수 있는 객체 생성
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
// 쿼리 실행
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
}
}


// 조회수를 증가시키기 위한 메소드

public void setCount (int num){
// 커넥션 연결
this.con();
// 현재 선택된 게시글 번호의 조회수를 가져옴
String sql = "update bboard set readcount=readcount+1 where num=?";
try{
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
// 쿼리 실행
pstmt.executeUpdate();
pstmt.close();
con.close();
} catch (Exception e) {
}
}


// 전체 게시글의 수를 리턴

public int getAllCount(){
int count = 0;
try{
this.con();
String sql = "select count(*) from bboard";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()){
count = rs.getInt(1);
}
con.close();
rs.close();
pstmt.close();
} catch (Exception e){
}
return count;
}
}


 - BoardList.jsp 소스
<%@page import="board.BoardBean"%>
<%@page import="java.util.Vector"%>
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<%
// 화면에 보여질 개수를 저장하는 변수 선언
int pageSize = 10;
// 화면에 표시해야할 페이지의 넘버를 읽어드림
String pageNum = request.getParameter("pageNum");
// 전체 글의 개수를 저장할 변수 선언
int count = 0;
// 현재 페이지에 표시할 레코드 수
int number = 0;

// 새로쓴 글, 삭제, 또는 수정시 호출되었는지 아니면 페이징 처리되었는지를 파악해주어야 함
if(pageNum == null){ // 미 페이징 처리라면
pageNum = "1";
}
// pageNum를 숫자로 바꾸어줌
int currentPage = Integer.parseInt(pageNum);
// 디비로부터 데이터를 받아야할 저장 객체 선언
Vector<BoardBean> vector = new Vector();
// 데이터 베이스 연결
BoardDao bdao = new BoardDao();
// 전체 게시글의 데이터를 얻어옴
count = bdao.getAllCount();

// 현재 페이지에 보여줄 시작 번호와 끝번호를 설정
int startRow = (currentPage-1) * pageSize+1;
  int endRow = currentPage*pageSize; // 10개씩 게시글을 보여줌

if(count > 0){
// 총게시글에서 원하는 부분의 데이터를 가져옴
vector = bdao.getAllBoard(startRow, endRow);
// 테이플에 표시해야할 번호를 지정하기 위해서 사용하는 변수
number = count - (currentPage-1) * pageSize;

%>
<h2> 게 시 판 목 록 </h2>
  <form action = "BoardWrite.jsp" method = "post">
<table border = "1" width = "740" cellpadding="4" cellspacing="2">
<tr bgcolor = "FFFFFFF">
  <th width = "50"> 번호 </th>
  <th width = "330"> 제목 </th>
  <th width = "130"> 작성자 </th>
  <th width = "130"> 날짜 </th>
  <th width = "80"> 조회수 </th>
</tr>

<%
for(int i = 0 ; i < vector.size() ; i++){
  // 백터에 담긴 BoardBean 클래스를 추출
  BoardBean bean = vector.get(i);
%>
<tr>
  <th width = "50"> <%=number--%> </th>
  <td width = "330" align = "left"> 
  <%
    int wid=0; // 답글인지를 파악해서 들여쓰기를 하기위한 변수
    if(bean.getRe_level() > 0){
    wid = 5*bean.getRe_level();
    for(int j=0 ; j<wid ; j++){
    out.print("&nbsp;");
    }
  }
  %>
  <a href = "BoardInfo.jsp?num=<%=bean.getNum()%>"><%=bean.getSubject()%></a> </td>
<td width = "130"> <%=bean.getWriter()%> </td>
  <td width = "130"> <%=bean.getReg_date()%> </td>
  <td width = "80"> <%=bean.getReadcount()%></td>
  </tr>
    <%
    }
}
    %>
    </table>

    <table border = "0" width = "740" cellpadding="4">

    <tr>
<td colspan = "5" align = "right"> <input type = "submit" value = "글쓰기"> </td>
</tr>
  </table>
  </form>
 
  <!-- 페이지 처리 -->
    <%
    if(count > 0){
    int pageCount = count/pageSize+(count%pageSize==0 ? 0 : 1);
    // 시작 페이지 숫자 설정
    int startPage = 1;
   
    if(currentPage%10 != 0){
    startPage = (int)(currentPage/10)*10+1;
    }
    else{
    startPage = ((int)(currentPage/10)-1)*10+1;
    }
    // 화면에 보여질 페이징 처리 숫자 즉, [1][2]... 이런 숫자를 의미
    int pageBlock = 10;
    int endPage = startPage+pageBlock-1; // 화면에 보여질 페이지의 마지막 숫자
   
    if(endPage > pageCount)
    endPage = pageCount;
    if(startPage > 10){
    %>
    <a href = "BoardList.jsp?pageNum=<%=startPage-10%>">[이전]</a>
    <% }
    // 현재 레코드의 개수를 페이징 처리함
    for(int m = startPage ; m<=endPage ; m++){
    %>
    <a href = "BoardList.jsp?pageNum=<%=m%>">[<%=m%>]</a>
    <%
    }
    if(endPage < pageCount){
    %>
    <a href = "BoardList.jsp?pageNum=<%=startPage+10%>">[다음]</a>
    <%
    }
    }
    %>
</center>
</body>
</html>


 - BoardInfo.jsp 소스
<%@page import="board.BoardBean"%>
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> 게 시 글 보 기 </h2>
  <%
    BoardDao bdao = new BoardDao();
    // 게시판 빈클래스 선언
    BoardBean board = new BoardBean();
    int num = Integer.parseInt(request.getParameter("num").trim()); // trim()을 이용해서 공백 제거
    board = bdao.getOneBoard(num); // 하나의 게시판에대한 정보를 가져옴
  %>
 
   <form action = "BoardUpdate.jsp" method = "post" name = "form">
   <table border = "1" width = "500" height = "380" cellpadding="5" cellspacing="2">
  <tr>
    <th width = "100" bgcolor="FFFFFFF"> 글번호 </th>
    <td width = "250"> <input type = "text" size = "40" name = "num" value = "<%=board.getNum()%>" disabled> </td>
  </tr>
  <tr>
    <th width = "100" bgcolor="FFFFFFF"> 작성자 </th>
    <td width = "250"> <input type = "text" size = "40" name = "writer" value = "<%=board.getWriter()%>" disabled> </td>
  </tr>
  <tr>
    <th width = "100" bgcolor="FFFFFFF"> 글 제목 </th>
    <td width = "250"> <input type = "text" size = "40" name = "subject" value = "<%=board.getSubject()%>"> </td>
  </tr>
  <tr>
    <th width = "100" bgcolor="FFFFFFF"> 내용 </th>
    <td width = "250"> <textarea cols = "40" rows = "10" name = "content"><%=board.getContent()%></textarea> </td>
  </tr>
  <tr>
    <th width = "100" bgcolor="FFFFFFF"> 비밀번호 </th>
    <td width = "250"> <input type = "password" size = "40" name = "passwd"> </td>
  </tr>
  </table>
  
  <table border = "0" width = "250" cellpadding = "5">
  <tr>
    <td> <input type = "submit" value = "수정"> </td>
    <td> <input type = "button" value = "삭제" onclick = "window.location='BoardDelete.jsp?num=<%=board.getNum()%>'"> </td>
    <td> <input type = "button" value = "답글" onclick = "window.location='BoardWrite.jsp?num=<%=board.getNum()%>&ref=<%=board.getRef()%>&re_level=<%=board.getRe_level()%>&re_step=<%=board.getRe_step()%>'"> </td>
    <td> <input type = "button" value = "목록" onclick = "window.location='BoardList.jsp'"> </td>
  </tr>
  </table>
  <input type = "hidden" name = "num2" value = "<%=board.getNum()%>">
  <input type = "hidden" name = "passwd2" value = "<%=board.getPasswd()%>">
  </form>
</center>
</body>
</html>


 - BoardUpdate.jsp 소스
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("euc-kr");
int num = Integer.parseInt(request.getParameter("num2"));
String subject = request.getParameter("subject");
String content = request.getParameter("content");
   
// 디비 연결객체 생성
BoardDao bdao = new BoardDao();

if(request.getParameter("passwd").equals(request.getParameter("passwd2"))){
  // 게시판 글을 수정하는 메소드 호출
  bdao.updateBoard(num, subject, content);
    response.sendRedirect("BoardList.jsp"); // 게시판 리스트로 보냄
  }
  else{
  %>
    <script type="text/javascript">
    alert("비밀번호를 확인해 주십시오.");
    history.go(-1); // -1은 이전페이지로 이동하라는 의미
    </script>
  <%
  }
  %>
</body>
</html>



 - BoardDelete.jsp 소스
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("euc-kr");
int num = Integer.parseInt(request.getParameter("num"));

  // 디비 연결객체 생성
  BoardDao bdao = new BoardDao();
 
  // 게시판 글을 수정하는 메소드 호출
  bdao.deleteBoard(num);
    response.sendRedirect("BoardList.jsp"); // 게시판 리스트로 보냄
  %>
</body>
</html>


 - 결과