본문 바로가기

콩's EDUCATION/콩's JSP&SERVLET

게시판 만들기 (진행중)

간단하지 않은 게시판 만들기.

교육을 받으면서 진행중이라 이해가 안가는 부분 혹은 오류가 생기는 부분이 많지만 다른 블로거분들이 올리신 오류 메시지 도움을 받으면서 처리를 하니 기본적으로 구동은 가능했다. 물론 현재 게시판 글쓰기 삭제 수정 부분은 진행중입니다.

넣어준 DB정보는 DB게시판을 참고하시면 됩니다.

 

 

 

 

 

bbslistServlet.java

 

package com.bbs.controller;

import 생략

 

@WebServlet("/list.do")
public class BbsListServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
      
    public BbsListServlet() {
        super();
    }
    public static final int COUNT_PER_PAGE=10; //페이지당 보여줄 게시글
    int totalArticleCount = 0; // 전체 글 개수
    int totalPageCount = 0; // 페이지 개수
    int firstRow = 0; // 조회할 페이지의 시작 글번호
    int endRow = 0; // 조회할 페이지의 끝 글번호
    int requestPage=0; // 사용자가 요청한 페이지 번호
   
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
     doPost(request, response);
    }

 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 request.setCharacterEncoding("utf-8");
 response.setContentType("text/html;charset=utf-8");
 PrintWriter out = response.getWriter();
 
 String page = request.getParameter("page");
 requestPage = 1; // 항상 1페이지 보여줘야 한다.
 if(page!=null && page.length()>0){
  requestPage = Integer.parseInt(page); 
 }
 
 ArticleDAO dao = new ArticleDAO();
 totalArticleCount = dao.selectCount();
 if(totalArticleCount==0){
  // 게시글이 없을 때 처리
  request.setAttribute("msg", "게시글이 존재 하지 않습니다.");
 }
 // 전체 글 개수를 조회한 후에 전체 페이지 개수를 계산
 totalPageCount = totalArticleCount/COUNT_PER_PAGE; // 전체 페이지 개수 계산
 if(totalArticleCount%COUNT_PER_PAGE>0){
  totalPageCount++;
 }
 // 사용자가 요청한 페이지를 기준으로 조회할 시작게시글 번호 계산
 firstRow = (requestPage-1)*COUNT_PER_PAGE+1;
 // 사용자가 요청한 페이지를 기준으로 조회할 끝게시글 번호 계산
 endRow = firstRow + COUNT_PER_PAGE -1;
 
 if(endRow>totalArticleCount){
  endRow = totalArticleCount;
 }
 
 List<ArticleVO> articleList = dao.selectArticleList(firstRow, endRow);
 ArticleListVO articleListView = new ArticleListVO(articleList, requestPage, totalPageCount
   ,firstRow, endRow);
 ServletContext sc =  getServletContext();
 RequestDispatcher rd = null;

 // 페이지 보여줄 목록수 예를들어 35페이지면 31~40페이지까지 보여준다.
 // 게시글 리스트 아래 링크될 페이지 번호 그룹 계산
 if(articleListView.getTotalPageCount()>0){ 
  int beginPage = (articleListView.getRequestPage()-1/10*10+1);
  int endPage = beginPage+9;
  if(endPage> articleListView.getTotalPageCount()){
   endPage = articleListView.getTotalPageCount();   
  }
  request.setAttribute("beginPage", beginPage);
  request.setAttribute("endPage", endPage);
 }
 request.setAttribute("articles", articleListView);
 rd = sc.getRequestDispatcher("/list.jsp");
 rd.forward(request, response);
 } 
}

ArticleDAO

 

package com.bbs.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ArticleDAO {
  public Connection dbCon(){
 // Tomcat Context로부터 jdbc/oracle이름의 DataSource를 가져와서
 // DB Connection객체를 생성해서 리턴
 Connection con = null;
 try{
  Context ctx = new InitialContext();
  Context tomcat = (Context)ctx.lookup("java:comp/env");
  DataSource ds = (DataSource)tomcat.lookup("jdbc/oracle");
  con = ds.getConnection();  
 }catch(Exception e){
  e.printStackTrace();
 } 
 return con;
  }//dbCon() end 
 
  public void dbClose(Connection con, Statement stat, ResultSet rs){
  try{
   if(rs!=null)rs.close();
   if(stat!=null)stat.close();
   if(con!=null)con.close();  
  }catch(Exception e){
   e.printStackTrace();
     }   
  }//dbClose() end
 
  public int selectCount(){  // 전체 게시글 갯수 조회 메서드
   Connection con = null;
   Statement stat = null;
   ResultSet rs = null;
   String sql = "select count(*) from article";
   int cnt = 0;
   try{
    con=dbCon();
    stat = con.createStatement();
    rs = stat.executeQuery(sql);
    if(rs.next()){
     cnt = rs.getInt(1);
    }
   }
   catch(Exception e){
    e.printStackTrace();
   }
   finally{
    dbClose(con,stat,rs);
    }
   return cnt;
  }
  public List<ArticleVO> selectArticleList(int firstRow, int endRow){
   Connection con = null;
   PreparedStatement stat = null;
   ResultSet rs = null;
  
   List<ArticleVO> lists = new ArrayList<ArticleVO>();
   int start = firstRow -1;
   int end = endRow - firstRow +1;
  
   StringBuffer sql = new StringBuffer();
   sql.append("  select rownum rn, article_id, group_id, sequence_no ");
   sql.append(", posting_date, read_count, writer_name, passwd ");
   sql.append(", title from (select article_id, group_id ");
   sql.append(", sequence_no, posting_date, read_count ");
   sql.append(", writer_name, passwd, title from article ");
   sql.append(" order by group_id, sequence_no desc) ");
   sql.append(" where rownum > ? and rownum < ? ");
   try{
    con=dbCon();
    stat = con.prepareStatement(sql.toString());
    stat.setInt(1, start);
    stat.setInt(2, end);
    rs = stat.executeQuery();
    if(!rs.next()){
     return Collections.emptyList();
    }
    do{
     ArticleVO article = new ArticleVO();
     article.setArticle_id(rs.getInt("article_id"));
     article.setGroup_id(rs.getInt("group_id"));
     article.setPasswd(rs.getString("passwd"));
     article.setPosting_date(rs.getDate("posting_date"));
     article.setRead_count(rs.getInt("read_count"));
     article.setTitle(rs.getString("title"));
     article.setWriter(rs.getString("writer_name"));
     lists.add(article);
    }while(rs.next());  
   }  catch(Exception e){
   e.printStackTrace();
    }   finally{
     dbClose(con,stat,rs);
     }
   return lists; 
  }
  }

ArticleListVO

 

package com.bbs.model;
import java.util.*;

public class ArticleListVO {
 private List<ArticleVO> articleList; // 화면에 보여줄 게시글 목록
 private int requestPage;       // 사용자가 요청한 페이지 번호
 private int totalPageCount;          // 전체 페이지 개수
 private int startRow;                // 현재 게시글의 목록의 시작 번호
 private int endRow;                  // 현재 게시글의 목록 끝 번호
 public ArticleListVO() {
  this(Collections.<ArticleVO>emptyList(),0,0,0,0);
 }
 public ArticleListVO(List<ArticleVO> articleList, int requestPage,
   int totalPageCount, int startRow, int endRow) {
  super();
  this.articleList = articleList;
  this.requestPage = requestPage;
  this.totalPageCount = totalPageCount;
  this.startRow = startRow;
  this.endRow = endRow;
 }
 public List<ArticleVO> getArticleList() {
  return articleList;
 }
 public boolean isHasArticle() {
  return !articleList.isEmpty();
 }
 public int getRequestPage() {
  return requestPage;
 }

 public int getTotalPageCount() {
  return totalPageCount;
 }

 public int getStartRow() {
  return startRow;
 }

 public int getEndRow() {
  return endRow;
 }
}

 

ArticleVO

 

package com.bbs.model;

import java.sql.Date;
public class ArticleVO {
 private int article_id;
 private int group_id;
 private String sequence_no;
 private Date posting_date;
 private int read_count = 0;
 private String writer_name;
 private String passwd;
 private String title;
 private String content;
 public int getArticle_id() {
  return article_id;
 }
 public void setArticle_id(int article_id) {
  this.article_id = article_id;
 }
 public int getGroup_id() {
  return group_id;
 }
 public void setGroup_id(int group_id) {
  this.group_id = group_id;
 }
 public String getSequence_no() {
  return sequence_no;
 }
 public void setSequence_no(String sequence_no) {
  this.sequence_no = sequence_no;
 }
 public Date getPosting_date() {
  return posting_date;
 }
 public void setPosting_date(Date posting_date) {
  this.posting_date = posting_date;
 }
 public int getRead_count() {
  return read_count;
 }
 public void setRead_count(int read_count) {
  this.read_count = read_count;
 }
 public String getWriter() {
  return writer_name;
 }
 public void setWriter(String writer_name) {
  this.writer_name = writer_name;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getContent() {
  return content;
 }
 public void setContent(String content) {
  this.content = content;
 }
 @Override
 public String toString() {
  return "ArticleVO [article_id=" + article_id + ", group_id=" + group_id
    + ", sequence_no=" + sequence_no + ", posting_date="
    + posting_date + ", read_count=" + read_count
    + ", writer_name=" + writer_name + ", passwd=" + passwd
    + ", title=" + title + ", content=" + content + "]";
 }
}

 

List

 

<%@  page contentType="text/html; charset=utf-8"   %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- 
<link rel="stylesheet" href="https://user.design.co.kr/images/user/2006/basic/regi.css" type="text/css">
-->
<style>
body{margin:0;}
body , td{color:#555;font:11pt Dotum,sans-serif;}

td{font:12px;line-height:140%;}
.tbl {margin:0 0 30px 0; border-top:2px solid #B6B6B6;border-bottom:2px solid #B6B6B6;width:100%}

.tbl th, .tbl td {font-size:10pt;text-align:left;padding:12px 0 12px 15px;border-bottom: 1px dotted #cccccc}
.tbl th {padding:12px; color:#000;
background:yellowgreen; width:145px}

.main_layout {border:1px solid #EDEDED;
border-top:none; padding:25px 24px 100px 24px; width:752px;
margin:0 auto}
.main_layout form {margin-top:10px}
.main_title {padding:30px 0 0 0 }
.main_title img {margin:0 0 10px 0}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>list.jsp</title>
</head>

<body>
 <div class = "main_layout" >
 <div class="main_title">  
    <h3>게시글 목록</h3><hr>
 </div>
<table cellpadding="0" cellspacing="0" border="0"  class="tbl">
<tr><th style="width:100px;">글번호 </th>
 <th style="width:400px;">글 제목 </th>
 <th style="width:100px;">작성자 </th>
 <th style="width:100px;">작성일 </th>
 <th style="width:100px;">조회수  </th>
</tr>
</table>
 
</div>
</body>
</html>

 

 

[결과]