ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 만들기 - 5. DB에 저장한 게시글을 조회하고 읽기 가능하게 만들기
    JAVA/웹 프로그래밍 - JSP 2020. 11. 26. 19:43

    아래의 내용에 뒤이어 구현해보자.

    designatedroom87.tistory.com/322?category=901206

     

    게시판 만들기 - 4. 게시판 글을 DB에 저장하기

    먼저 만들려고 하는 게시판은 댓글도 가능한 게시판이다. DB를 좀 다뤄야 하고 조금 복잡하다. DB의 테이블에 여러 정보가 있지만, 그 중에서 index, groupid, re_order 라는 세 가지 개념이 중요하다.

    designatedroom87.tistory.com

     

    게시글 나오게 하고, 글 읽기하고 조회한 게시물 증가를 구현하자.

     

    src/board.model/Board.java 파일에 수정이 필요하다.

    기존에 날짜는 자료형을 String에서 Date로 수정한다. 

    Board.java

    더보기
    package board.model;
    
    import java.util.Date;
    
    public class Board 
    {
    	int idx;
    	String title;
    	String content;
    	int readcount;
    	int groupid;
    	int depth;
    	int re_order;
    	int isdel;
    	String write_id;
    	String write_name;
    	Date write_day;
    
    	public Board() {}
    
    	public Board(int idx, String title, String content, int readcount, int groupid, 
    			int depth, int re_order, int isdel,
    			String write_id, String write_name, Date write_day) {
    
    		this.idx = idx;
    		this.title = title;
    		this.content = content;
    		this.readcount = readcount;
    		this.groupid = groupid;
    		this.depth = depth;
    		this.re_order = re_order;
    		this.isdel = isdel;
    		this.write_id = write_id;
    		this.write_name = write_name;
    		this.write_day = write_day;
    	}
    
    	public int getIdx() {return idx;}
    	public void setIdx(int idx) {this.idx = idx;}
    	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;}
    	public int getReadcount() {return readcount;}
    	public void setReadcount(int readcount) {this.readcount = readcount;}
    	public int getGroupid() {return groupid;}
    	public void setGroupid(int groupid) {this.groupid = groupid;}
    	public int getDepth() {return depth;}
    	public void setDepth(int depth) {this.depth = depth;}
    	public int getRe_order() {return re_order;}
    	public void setRe_order(int re_order) {this.re_order = re_order;}
    	public int getIsdel() {return isdel;}
    	public void setIsdel(int isdel) {this.isdel = isdel;}
    	public String getWrite_id() {return write_id;}
    	public void setWrite_id(String write_id) {this.write_id = write_id;}
    	public String getWrite_name() {return write_name;}
    	public void setWrite_name(String write_name) {this.write_name = write_name;}
    	public Date getWrite_day() {return write_day;}
    	public void setWrite_day(Date write_day) {this.write_day = write_day;}
    }

     

    common/header.jsp 에서 수정이 필요하다.

    /board에서 /board/list로 변경하면 된다.

    아래의 맨 아래의 문장을 수정하면 된다.

    기존의 내용의 의미는 board.controller의 if ~ else if ~ else 문에서 board 조건으로 가는 것을

    list 조건으로 넘기기 위해서이다.

    즉, 로그인 상태에서 게시판을 선택하면 게시글들을 보여주기 위한 상태로 만들어주기 위함이다.

    header.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!--Ctag를 사용하기 위해 추가를 한다. -->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <div>
    <!--nav 태그에서 메뉴를 만들면 된다.-->
        <nav class="navbar">
            <ul>
                <li><a href="/home">홈</a></li>
                <li><a href="/company">회사소개</a></li>
                <li><a href="/iot">IOT</a></li>
                <li><a href="/board/list">게시판</a></li>
                
                <!--로그인이 된 경우와 아닌 경우 두 경우로 나뉜다. 세션 id가 비어있으면 로그인으로 출력 -->
                <!--로그인/로그아웃을 선택함에 따라 다시  member.controller 패키지의 Controller 서블릿으로 이동 
                	해서 login 혹은 logout을 처리한다.
                -->
                <c:choose>
                <c:when test="${empty sessionScope.id }">
                <li><a href="/member/login">로그인</a></li>
                </c:when>
                <c:otherwise>
                <li><a href="/member/logout">로그아웃[${sessionScope.id}]</a></li>
                </c:otherwise>
                </c:choose>
            </ul>
        </nav>
    </div>

     

    글에 대한 리스트를 나오게 하자. (게시글을 보이도록)

    Controller에서 else if (list) 에서 처리를 해야 한다.
    DB에 접속해서 데이터들을 가지고 와야 한다.
    즉, DB에 접속해서 리스트를 받아와야 한다. 이 받은 리스트를 웹 페이지에 뿌려줘야 한다.

    게시글이 보일 때의 조건은 로그인을 한 상태에서 게시판을 클릭했을 때, 게시글들을 모두 보여주면 된다.

    즉, 위의 common폴더의 header.jsp의 내용에서 /board에서 /board/list로 변경한 이유가

    board.controller패키지의 Controller 서블릿으로 넘겨서 아래의 else if 문에서 처리를 하기 위해서이다.

    위의 조건에서는 요청한 페이지를 받고(처음 이 조건에 들어오면 requestPage_는 null이고,

    처음 들어온 경우에는 1페이지를 띄워주면 된다.)

    페이지에 해당하는 게시글들을 모두 가져오면 된다.

    이 내용들을 저장하기 위해서는 새로운 모델 객체가 하나 필요하다.

    게시글들만 저장하는 것이 아닌, 때로는 전체 게시글의 수와 마지막 페이지 등 여러 정보들을 가지고 있으면

    제공할 수 있는 정보들도 많아진다.

    이러한 정보를 담을 PageBoard 클래스를 정의하자.

    src/board.model 패키지에 PageBoard 클래스를 만든다.

    그리고 요청한 페이지에 대한 정보를 얻기 위해서는 DB에 접속해서 SQL문을 활용해서 정보를 얻어오면 된다.

    이 정보를 얻어오기 위해서는 DAO와 Service에서는 새로운 함수가 하나 필요하다.

    DAO와 Service에서 list라는 함수를 만든다.
    list함수를 통해 웹 페이지에 뿌릴 정보를 가지고 오는 것이다.

    최종적으로 이 정보가 뿌려질 곳은 WEB-INF/board/list.jsp이다.

    넘어온 데이터를 list.jsp가 받아서 보여주면 된다.

    list.jsp를 백업한다. 이름은 list2.jsp 로 한다.

    PageBoard.java

    더보기
    package board.model;
    
    import java.util.Collections;
    import java.util.List;
    
    //	board 리스트를 포함하여 페이지에 관한 정보가 있는 model class
    public class PageBoard 
    {
    	private List<Board> list;	//	리스트에 포함될 전체 리스트 목록
    	
    	//	페이지 관련 정보 사항
    	private int requestPage;	//	요청한 페이지
    	private int totalPage;		//	전체 페이지
    	private int beginPage;		//	시작 페이지
    	private int	endPage;		//	마지막 페이지
    	private int firstRow;		//	시작 글번호
    	private int endRow;			//	끝 글번호
    	private int articleCount;	//	글의 전체 개수
    	private int countPerPage;	//	페이지 당 보여줄 게시글의 수
    	
    	//	Constructor
    	public PageBoard() 
    	{
    		this(Collections.<Board> emptyList(),0,0,0,0,0,0,0,0);
    	}		
    	
    	public PageBoard(List<Board> list, int requestPage, int totalPage, 
    			int beginPage, int endPage, int firstRow,
    			int endRow, int articleCount, int countPerPage) {
    		
    		this.list = list;
    		this.requestPage = requestPage;
    		this.totalPage = totalPage;
    		this.beginPage = beginPage;
    		this.endPage = endPage;
    		this.firstRow = firstRow;
    		this.endRow = endRow;
    		this.articleCount = articleCount;
    		this.countPerPage = countPerPage;
    	}
    	
    	//	list가 비어 있는지의 여부를 확인하는 함수
    	public boolean isHasBoard() {return !list.isEmpty();}
    	
    	public List<Board> getList() {return list;}
    	public void setList(List<Board> list) {this.list = list;}
    	public int getRequestPage() {return requestPage;}
    	public void setRequestPage(int requestPage) {this.requestPage = requestPage;}
    	public int getTotalPage() {return totalPage;}
    	public void setTotalPage(int totalPage) {this.totalPage = totalPage;}
    	public int getBeginPage() {return beginPage;}
    	public void setBeginPage(int beginPage) {this.beginPage = beginPage;}
    	public int getEndPage() {return endPage;}
    	public void setEndPage(int endPage) {this.endPage = endPage;}
    	public int getFirstRow() {return firstRow;}
    	public void setFirstRow(int firstRow) {this.firstRow = firstRow;}
    	public int getEndRow() {return endRow;}
    	public void setEndRow(int endRow) {this.endRow = endRow;}
    	public int getArticleCount() {return articleCount;}
    	public void setArticleCount(int articleCount) {this.articleCount = articleCount;}
    	public int getCountPerPage() {return countPerPage;}
    	public void setCountPerPage(int countPerPage) {this.countPerPage = countPerPage;}
    }

     

    board.service패키지의 BoardService.java 파일의 내용으로 추가할 부분은 list함수이다.

    이 list함수에서는 위에서 설명했다시피, SQL문을 활용해서 정보를 얻어와야 한다.

    그러면 우선, 아래의 SQL문들을 각 각 실행하고 그 결과를 보도록 하자.

    SQL에서 groupid, depth, idx가 중요하다.

     

    아래의 sQL문을 학인해보자.
    select count(*) from board; 

    아래의 sQL문을 학인해보자.
    select * from board a order by a.groupid desc, a.depth asc, a.idx asc;

     

    아래의 SQL문을 실행하기 전에 데이터를 충분히 많이 저장하자.
    select idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from ( 
    select rownum rnum, idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from (
    select * from board a order by a.groupid desc, a.depth asc, a.idx asc) where rownum <= 10
    ) where rnum >= 2

    아래는 list함수의 sql 문장
    sql="select idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from ("; 
    sql+="select rownum rnum, idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from ("; 
    sql+="select * from board a order by a.groupid desc, a.depth asc, a.idx asc) where rownum <= ?";
    sql+=") where rnum >= ?";

     

    BoardService.java

    더보기
    package board.service;
    
    import board.dao.BoardDAO;
    import board.model.Board;
    import board.model.PageBoard;
    
    public class BoardService {
    	private static BoardService service = new BoardService();
    	public BoardDAO dao = BoardDAO.getInstance();
    	
    	private BoardService() {}
    	
    	public static BoardService getInstance(){return service;}
    	
    	//	글 입력
    	public int insert(String title, String content, String write_name) {
    		return dao.insert(title,content,write_name);
    	}
    	
    	//	글 입력
    	public int insert(Board board) {
    		return dao.insert(board);
    	}
    
    	public PageBoard list(int requestPage) {
    		return dao.list(requestPage);
    	}
    
    	public void incrementReadCount(int idx) {
    		dao.incrementReadCount(idx);
    	}
    
    	public Board selectById(int idx) {
    		return dao.selectById(idx);
    	}
    }

     

    board.dao패키지의 BoardDAO.java 파일 내용으로 list함수가 추가된다.

    BoardDAO.java

    더보기
    package board.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import board.model.Board;
    import board.model.PageBoard;
    
    public class BoardDAO {
    	private static BoardDAO dao = new BoardDAO();
    	
    	private BoardDAO() {}
    	public static BoardDAO getInstance() {
    		return dao;
    	}
    	
    	public Connection connect()
    	{
    		Connection conn = null;
    		
    		try {
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    		
    		}catch(Exception e) {}
    		
    		return conn;
    	}
    	
    	public void close(Connection conn, PreparedStatement pstmt, ResultSet rs)
    	{
    		if (rs != null) 
    		{
    			try 
    			{
    				rs.close();
    			}
    			catch (SQLException e) {e.printStackTrace();}
    		}
    		this.close(conn,pstmt);
    	}
    	
    	public void close(Connection conn, PreparedStatement pstmt)
    	{
    		try {
    		pstmt.close();
    		conn.close();
    		}
    		catch (SQLException e) {e.printStackTrace();}
    	}
    	
    	//	글 입력
    	public int insert(String title, String content, String write_name) {
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		int result = 0;
    		String sql = null;
    		
    		try {
    			conn = this.connect();
    			
    			conn.setAutoCommit(false);	//	DB 트랜잭션의 시작
    			
    			sql = "insert into board values(";
    			sql += "board_idx_seq.nextval,";
    			sql += "?,?,0,";
    			sql	+=	"board_groupid_seq.nextval,0,0,";
    			sql +=	"0,";
    			sql +=	"?,?,sysdate";
    			sql +=	")";
    			
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, title);
    			pstmt.setString(2, content);
    			pstmt.setString(3, write_name);	//	id
    			pstmt.setString(4, write_name);	//	name
    			
    			result = pstmt.executeUpdate();
    			
    			if (result > 0) {
    				System.out.println("SQL 글 입력 성공");
    				conn.commit();
    			}else {
    				System.out.println("SQL 글 입력 실패");
    				conn.rollback();
    			}
    			this.close(conn, pstmt);
    		}
    		catch(Exception e) 
    		{	
    			try {
    				conn.rollback();
    			} catch (SQLException e1) {e1.printStackTrace();}
    		}
    		return result;
    	}
    	
    	//	글 입력
    	public int insert(Board board) {
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		int result = 0;
    		String sql = null;
    		
    		try {
    			conn = this.connect();
    			
    			conn.setAutoCommit(false);	//	DB 트랜잭션의 시작
    			
    			sql = "insert into board values(";
    			sql += "board_idx_seq.nextval,";
    			sql += "?,?,0,";
    			sql	+=	"board_groupid_seq.nextval,0,0,";
    			sql +=	"0,";
    			sql +=	"?,?,sysdate";
    			sql +=	")";
    			
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, board.getTitle());
    			pstmt.setString(2, board.getContent());
    			pstmt.setString(3, board.getWrite_name());	//	id
    			pstmt.setString(4, board.getWrite_name());	//	name
    			
    			result = pstmt.executeUpdate();
    			
    			if (result > 0) {
    				System.out.println("SQL 글 입력 성공");
    				conn.commit();
    			}else {
    				System.out.println("SQL 글 입력 실패");
    				conn.rollback();
    			}
    			this.close(conn, pstmt);
    		}
    		catch(Exception e) 
    		{	
    			try {
    				conn.rollback();
    			} catch (SQLException e1) {e1.printStackTrace();}
    		}
    		return result;
    	}
    	public PageBoard list(int requestPage) 
    	{
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		String sql = null;
    		List<Board> list = new ArrayList<Board>();	//	글 번호에 대한 리스트를 담는 객체
    		PageBoard pageboard = null;					//	페이지 정보와 리스트를 담는 객체
    		
    		//	페이지 관련 정보 사항
    		//int requestPage = 0;		//	요청한 페이지
    		int totalPage = 0;			//	전체 페이지
    		int beginPage = 0;			//	시작 페이지
    		int	endPage = 0;			//	마지막 페이지
    		int firstRow = 0;			//	시작 글번호
    		int endRow = 0;				//	끝 글번호
    		int articleCount = 0;		//	글의 전체 개수
    		int countPerPage = 10;		//	페이지 당 보여줄 글의 개수
    		
    		try {
    			System.out.println("-------BoardDAO-------------");
    			conn = this.connect();					//	DB접속
    			conn.setAutoCommit(false);
    			
    			//	페이지에 대한 정보
    			//	1. 전체 게시물 수 구하기(articleCount)
    			sql = "select count(*) from board";
    			pstmt = conn.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			if (rs.next()) {
    				articleCount = rs.getInt(1);
    			}
    			else {
    				articleCount = 0;
    			}
    			//rs.close();
    			//	2. 전체 페이지 수를 구하기(totalPage)
    			//	예를 들어 총 게시글이 71개이면, 총 페이지는 8개가 되야 한다.
    			totalPage = articleCount / countPerPage;
    			if (articleCount % countPerPage > 0)
    				totalPage += 1;
    			
    			//	3. 요청한 페이지에 대한 시작 글번호와 끝 글번호 구하기
    			firstRow = (requestPage - 1) * countPerPage + 1;
    			endRow = firstRow + countPerPage - 1; 
    			System.out.printf("firstRow : %d, endRow : %d\n",firstRow, endRow);
    			//	4. 시작 페이지 번호, 끝 페이지 번호(beginPage, endPage)
    			if (totalPage > 0) {
    				beginPage = (requestPage - 1) / countPerPage * countPerPage + 1;
    				//	beginPage = requestPage - 2;
    				endPage = beginPage + 4;	//	4는 요청 페이지를 기준으로 보여줄 페이지의 간격
    				
    				if (endPage > totalPage)	endPage = totalPage;
    			}
    			
    			//	5. 페이지에 해당하는 리스트(firstRow, endRow)
    			sql = "select idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from (";
    			sql += "select rownum rnum, idx, title, content, readcount, groupid, depth, re_order, isdel, write_id, write_name, write_day from (";
    			sql += "select * from board a order by a.groupid desc, a.depth asc, a.idx asc) where rownum <= ?";
    			sql += ") where rnum >= ?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setInt(1, endRow);	//	큰 수. 40이라고 가정
    			pstmt.setInt(2, firstRow);	//	작은 수. 31이라고 가정
    			rs = pstmt.executeQuery();
    			
    			//	6. DB의 리스트를 board객체에 담아 전송
    			while (rs.next()) {
    				Board board = new Board();
    				board.setIdx(rs.getInt("idx"));
    				board.setTitle(rs.getString("title"));
    				board.setContent(rs.getString("content"));
    				board.setReadcount(rs.getInt("readcount"));
    				board.setGroupid(rs.getInt("groupid"));
    				board.setDepth(rs.getInt("depth"));
    				board.setRe_order(rs.getInt("re_order"));
    				board.setIsdel(rs.getInt("isdel"));
    				board.setWrite_id(rs.getString("write_id"));
    				board.setWrite_name(rs.getString("write_name"));
    				board.setWrite_day(rs.getDate("write_day"));
    				
    				list.add(board);
    			}
    			
    			pageboard = new PageBoard(list, requestPage,totalPage,
    					beginPage, endPage, firstRow, endRow, articleCount,countPerPage
    					);
    			
    			this.close(conn, pstmt, rs);
    			conn.commit();
    		}
    		catch(Exception e) 
    		{
    			try {conn.rollback();} 
    			catch (SQLException e1) {e1.printStackTrace();} 
    			
    			e.printStackTrace();
    		}
    		System.out.println("-----end BoardDAO-------------");
    		return pageboard;
    	}
    	public void incrementReadCount(int idx) 
    	{
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		String sql = null;
    		
    		try {
    			conn = this.connect();
    			sql = "update board set readcount=readcount+1 where idx=?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setInt(1, idx);
    			pstmt.executeUpdate();
    			
    			this.close(conn, pstmt);
    		}catch(Exception e){}
    	}
    	public Board selectById(int idx) 
    	{
    		Board board = null;
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		String sql = null;
    		
    		try {
    			conn = this.connect();
    			//conn.setAutoCommit(false);
    			sql = "select * from board where idx=?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setInt(1, idx);
    			rs = pstmt.executeQuery();
    			
    			if (rs.next())
    			{
    				board = new Board(
    						rs.getInt("idx"), 
    						rs.getString("title"), 
    						rs.getString("content"), 
    						rs.getInt("readcount"), 
    						rs.getInt("groupid"), 
    						rs.getInt("depth"), 
    						rs.getInt("re_order"), 
    						rs.getInt("isdel"), 
    						rs.getString("write_id"), 
    						rs.getString("write_name"), 
    						rs.getDate("write_day")
    						);
    			}	
    			//conn.commit();
    			this.close(conn, pstmt, rs);
    		}
    		catch(Exception e) 
    		{
    			try {conn.rollback();} 
    			catch (SQLException e1) {e1.printStackTrace();}
    		}
    		return board;
    	}
    }

     

     

    요청한 페이지에 대한 게시글들과 여러가지 정보들은 WEB-INF/board/list.jsp에서 보여주면 된다.

    우선 기존의 list.jsp파일을 백업해서 이름을 list2라고 하자.

    list2.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <script>
    function dataCheck(){
    	if(document.getElementById("search").value==""){
    		alert("검색할 단어를 입력하세요");
    		document.getElementById("search").focus();
    		return;
    	}
    	document.form.submit();
    }
    </script>
    
    <!-- 로그인이 되지 않을 경우 페이지 이동 -->
    <c:if test="${empty sessionScope.id}">
    <jsp:forward page="/index"></jsp:forward>
    </c:if>
    <!-- ----------------- -->
    
    <div class="container">
     <h2><button class="btn" onclick="location.href='/index'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
    <!-- 검색리스트 -->
    <form name=form action="/board/searchList" method=post>
     	<div class="form-group">
     	
     	<select name=field>
     	<option value=title>제목</option>
     	<option value=content>내용</option>
     	<option value=write_name>작성자</option>
     	</select>
        
        <input onmouseover="this.focus()" type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <!-- 검색리스트  -->
    
    <table class="table">
    <!-- 페이지번호 표시 -->
    <tr align="right">
    <td colspan="5">
    ${pageboard.articleCount-pageboard.firstRow+1}-${pageboard.articleCount-pageboard.endRow+1}
    [${pageboard.requestPage}/${pageboard.totalPage }]
    </td>
    </tr>
    
    <tr class="success">
    <th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th>
    </tr>
    <c:forEach var="item" items="${pageboard.list}">
    <tr onmouseover="this.style.backgroundColor='lightgray'" 
    	onmouseout="this.style.backgroundColor='white'"
    	onclick="location.href='/board/print?idx=${item.idx}'">
    <td>${item.idx}</td>
    <td>${item.title}</td>
    <td>${item.write_name}</td>
    <td>${item.write_day}</td>
    <td>${item.readcount}</td>
    </tr>
    </c:forEach>
    <!-- page list -->
    <tr>
    <td colspan=4 align=center valign="center">
    <ul class="pagination">
       
        <c:if test="${pageboard.requestPage!=1}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${pageboard.requestPage-1}">이전페이지</a></li>
        </c:if>
     
        <c:forEach var="i" begin="${pageboard.beginPage}" end="${pageboard.endPage}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${i}">${i}</a></li>
        </c:forEach>
       
        <c:if test="${pageboard.totalPage!=pageboard.requestPage}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${pageboard.requestPage+1}">다음페이지</a></li>
        </c:if>
        
      </ul>
    </td>
    <td>
    <button onclick="location.href='/board/insert'">글쓰기</button>
    </td>
    </tr>
    <!-- end page list -->
    </table>
    
    </div>

     

    WEB-INF/boad의 list.jsp파일

    list.jsp 파일

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <script>
    function dataCheck()
    {
    	if(document.getElementById("search").value == "")
    	{
    		alert("검색할 단어를 입력하세요");
    		document.getElementById("search").focus();
    		return;
    	}
    	document.form.submit();
    }
    </script>
    
    <!-- 로그인이 되지 않을 경우 페이지 이동 -->
    <c:if test="${empty sessionScope.id}">
    <jsp:forward page="/index"></jsp:forward>
    </c:if>
    <!-- ----------------- -->
    
    <div class="container">
     <h2><button class="btn" onclick="location.href='/index'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
    <!-- 검색리스트 -->
    <form name=form action="/board/searchList" method=post>
     	<div class="form-group">
     	
     	<select name=field>
     	<option value=title>제목</option>
     	<option value=content>내용</option>
     	<option value=write_name>작성자</option>
     	</select>
        
        <input onmouseover="this.focus()" type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <!-- 검색리스트  -->
    
    <table class="table">
    <!-- 페이지번호 표시 -->
    <tr align="right">
    <td colspan="5">
    ${pageboard.articleCount-pageboard.firstRow+1}-${pageboard.articleCount-pageboard.endRow+1}
    [${pageboard.requestPage}/${pageboard.totalPage }]
    </td>
    </tr>
    
    <tr class="success">
    <th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th>
    </tr>
    <c:forEach var="board" items="${pageboard.list}">
    <tr onmouseover="this.style.backgroundColor='lightgray'" 
    	onmouseout="this.style.backgroundColor='white'"
    	onclick="location.href='/board/read?idx=${board.idx}&requestPage=${pageboard.requestPage}'">
    <td>${board.idx}</td>
    <td>
    <c:if test="${board.depth>0}">
    	<c:forEach begin="1" end="${board.depth}">-</c:forEach>&gt;
    </c:if>
    ${board.title}
    
    </td>
    <td>${board.write_name}</td>
    <td>${board.write_day}</td>
    <td>${board.readcount}</td>
    </tr>
    </c:forEach>
    <!-- page list -->
    <tr>
    <td colspan=4 align=center valign="center">
    <ul class="pagination">
       
        <c:if test="${pageboard.requestPage!=1}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${pageboard.requestPage-1}">이전페이지</a></li>
        </c:if>
     
        <c:forEach var="i" begin="${pageboard.beginPage}" end="${pageboard.endPage}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${i}">${i}</a></li>
        </c:forEach>
       
        <c:if test="${pageboard.totalPage!=pageboard.requestPage}">
        <li class="page-item"><a class="page-link" href="/board/list?requestPage=${pageboard.requestPage+1}">다음페이지</a></li>
        </c:if>
        
      </ul>
    </td>
    <td>
    <button onclick="location.href='/board/insert'">글쓰기</button>
    </td>
    </tr>
    <!-- end page list -->
    </table>
    
    </div>

     

    게시글 읽기를 구현해보자.

    게시글의 읽기는 로그인 상태에서 게시판을 선택하고 보여진 게시글을 클릭했을 때 이를 처리해주면 된다.

    즉, list.jsp파일에서 발생해서 게시글이 클릭이 되면 board.controller의 Controller로 넘어가서 

    아래의 else if 문에서 처리를 하면 된다.

    list.jsp파일에서는 게시글의 idx와 요청한 페이지(requestPage)를 함께 넘겨준다. 

    Controller에서는 클릭된 게시글의 idx를 얻어와서 DB에 접속해서 이 게시글에 대한 정보를 얻어오면 된다.

    여기서는 클릭한 글의 조회 수를 하나 올려주는 것을 잊지말자.

    그 일은 incrementReadCount함수가 처리를 한다.

    그리고 게시글의 정보를 얻어오는 것은 selectById함수에서 처리한다. 

    이 함수들은 BoardDAO.java와 BoardService.java 에 이미 만들어 두었다. 위에 가서 참고하자.

    read.jsp에서는 게시글을 보여주기만 하면 된다.

    read.jsp파일은 WEB-INF/board에서 만들면 된다.

     

    WEB-INF/board폴더에 read.jsp 와 read_fail.jsp 파일 만들기

    read.jsp파일에서는 게시글의 정보를 웹 페이지에 뿌려주면 된다.

    우선 read.jsp파일을 백업을 하도록 하자. 이름은 read_backup이라고 하자.

    read.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
    <div class="container">
      <h2><button class="btn" onclick="location.href='/index.jsp'"><i class="fa fa-home"></i></button>글읽기</h2>
         
        <div class="form-group">
          글번호: [${board.idx}] 제목: ${board.title}<p>
          작성자: ${board.write_name} 작성일: ${board.write_day} 조회수: ${board.readcount}<p>
        </div>
     
        <div class="form-group">
          <label for="content">내용:</label>
          <textarea class="form-control" disabled id="content" name="content" cols="80%" rows="10" placeholder="글을 입력하세요">
          ${board.content}
          </textarea>
        </div>
        
        <div class="form-group">
    	<button onclick="location.href='/board/list?requestPage=${requestPage}'">목록으로</button>
    	<button onclick="location.href='/board/reply?idx=${board.idx}&groupid=${board.groupid}&depth=${board.depth}&re_order=${board.re_order}&title=${board.title}&requestPage=${requestPage}'">답글쓰기</button>
    	<button onclick="location.href='/board/update?idx=${board.idx}'">글 수정</button>
    	<button onclick="location.href='board/delete.do?idx=${board.idx}'">글 삭제</button>
        </div>
     
    </div>

     

    read_backup.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
    <div class="container">
      <h2><button class="btn" onclick="location.href='/index.jsp'"><i class="fa fa-home"></i></button>글읽기</h2>
         
        <div class="form-group">
          <label for="idx">글번호:</label>
          <input value="${board.idx}" disabled type="text" class="form-control" id="idx" name="idx" >
        </div>
        
        <div class="form-group">
          <label for="title">제목:</label>
          <input value="${board.title}" disabled type="text" class="form-control" id="title" name="title">
        </div>
        
        <div class="form-group">
          <label for="write_name">작성자:</label>
          <input value="${board.write_name}" disabled type="text" class="form-control" id="write_name" name="write_name">
        </div>
        
        <div class="form-group">
          <label for="write_day">작성일:</label>
          <input value="${board.write_day}" disabled type="text" class="form-control" id="write_day" name="write_day">
        </div>
        
        <div class="form-group">
          <label for="content">내용:</label>
          <textarea class="form-control" disabled id="content" name="content" cols="80%" rows="10" placeholder="글을 입력하세요">
          ${board.content}
          </textarea>
          
        </div>
        
        <div class="form-group">
    	<button onclick="location.href='/board/list?requestPage=${requestPage}'">목록으로</button>
    	<button onclick="location.href='/board/reply?idx=${board.idx}&groupid=${board.groupid}&depth=${board.depth}&re_order=${board.re_order}&title=${board.title}&requestPage=${requestPage}'">답글쓰기</button>
    	<button onclick="location.href='/board/update?idx=${board.idx}'">글 수정</button>
    	<button onclick="location.href='board/delete.do?idx=${board.idx}'">글 삭제</button>
        </div>
     
    </div>

     

    board폴더의 read_fail.jsp 파일

    read_fail.jsp는 존재하지 않는 글을 조회하려고 할 때 처리하려고 만든 것이므로, 글 읽기 실패라고 보여주고 끝내자.

    read_fail.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>글 읽기 실패</title>
    </head>
    <body>
    글 읽기 실패
    </body>
    </html>

     

    게시글 쓰기 구현을 해보자. 이미 앞에서 한 내용이지만 다시 한 번 알아보도록 하자.

    writeForm.jsp, success.jsp, fail.jsp 파일은 내용이 같다.

    이 또한 로그인 상태에서 게시판을 선택해서 (게시판으로 이동) 글쓰기 버튼을 클릭할 때 이를 처리하면 된다.

    list.jsp 파일에서 글쓰기 버튼이 클릭이 될 때 시작 된다.

    board.controller의 Controller에서 아래의 else if 문에서 처리를 하면 된다.

    웹 페이지의 폼에서 입력을 받아야 하므로 이는 writeForm.jsp에서 처리를 하자.

    writeForm.jsp에서 모든 입력이 끝나면 이를 DB에 접속해서 저장하면 된다.

    WEB-INF/board폴더에 writeForm.jsp 파일을 만들자.

    글의 입력이 모두 입력되고 입력 버튼이 눌리면, Controller의 insert.do에서 처리가 된다.

    위의 else if문에서 입력한 게시글의 정보를 넘겨받아 DB에 접속해서 저장하면 된다.

    Service와 DAO 클래스에 이 함수들을 이미 구현했으므로 이를 참고하자.

    글을 DB에 성공적으로 저장했으면 success.jsp 파일로 이동하고 그렇지 않으면 fail.jsp로 이동하자.

    writeForm.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <script>
    function dataCheck(){
    	if(document.getElementById("title").value==""){
    		alert("제목을 입력해 주세요")
    		return;
    	}
    	if(document.getElementById("content").value==""){
    		alert("내용을 입력해 주세요")
    		return;
    	}
    	document.form.submit();
    }
    </script>
    
    <div class="container">
      <h2><button class="btn" onclick="location.href='/index'"><i class="fa fa-home"></i></button>메시지 입력</h2>
      <form name=form action="/board/insert.do" method=post>
        
        <div class="form-group">
          <label for="title">제목</label>
          <input type="text" class="form-control" id="title" name="title" placeholder="제목을 입력 하세요">
        </div>
        
        <div class="form-group">
          <label for="write_name">작성자</label>
          <input type="text" class="form-control" id="write_name" name="write_name" value="${sessionScope.id}" readonly />
        </div>
        
        <div class="form-group">
          <label for="content">글내용</label>
          <textarea class="form-control" id="content" name="content" cols="80%" rows="10" placeholder="글을 입력하세요"></textarea>
        </div>
        
        <button type="button" onclick=dataCheck() class="btn btn-default">입력</button>
      </form>
    </div>

     

    WEB-INF/board에 각 각 success.jsp와 fail.jsp파일을 만들자.

    글의 입력이 성공적으로 저장되었으면, board.controller의 list로 이동해서 입력한 게시글을 포함한

    모든 게시글을 볼 수 있도록 한다.

    success.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
    <script>
    	result = alert("글입력이 성공하셨습니다.")
    	location.href = "/board/list"
    </script>

     

    fail.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <div>
    권한이 없습니다. 로그인 해주세요.
    </div>

     

     

    src/board.controller패키지의 Controller파일 내용이다.

    Controller 내용은 변경되었으므로 이를 복사하자.

    Controller.java

    더보기
    package board.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import board.model.Board;
    import board.model.PageBoard;
    import board.service.BoardService;
    
    //	member로 들어오는 모든 url에 대해서 해당 컨트로럴가 이에 대한 처리를 하겠다는 의미
    @WebServlet("/board/*")
    public class Controller extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
    	public void init(ServletConfig config) 
    			throws ServletException {}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	
    		request.setCharacterEncoding("UTF-8");		//	한글 깨짐 방지
    		//ServletContext application = request.getServletContext();	//	전역 객체
    		
    		//	페이지 페이지 마다 연결 시간 설정 가능. 전역 객체이다.
    		HttpSession session = request.getSession();					 
    		
    		//	1. 페이지를 전송하기 전에 url을 분석하고 분류해서 실행
    		String url = request.getRequestURI();
    		//System.out.println("url : " +url);
    		String contextPath = request.getContextPath();
    		//System.out.println("contextPath : " +contextPath);
    		String path = url.substring(contextPath.length());
    		//System.out.println("path : " +path);
    		String lastPath = url.substring(url.lastIndexOf('/') + 1);	//	마지막 /를 기준으로 분리
    		System.out.println("subPath : " +lastPath);
    		String command = lastPath;
    		
    		//	로그인 여부를 먼저 확인
    		if (session.getAttribute("id") != null) 
    		{
    			if (command.equals("board")) 
    			{
    				request.setAttribute("page", "list.jsp");
    			}
    			else if (command.equals("list")) 
    			{
    				//	폼에서 전송된 데이터 받기 request.getParameter()
    				String requestPage_ = request.getParameter("requestPage");
    				System.out.printf("%s\n",requestPage_);
    				int requestPage = 1;
    				if (requestPage_ != null) 
    				{
    					requestPage = Integer.parseInt(requestPage_);
    				}
    	
    				//	service-dao work
    				BoardService service = BoardService.getInstance();
    				PageBoard pageboard = new PageBoard();
    				pageboard = service.list(requestPage);
    				
    				request.setAttribute("pageboard", pageboard);
    				System.out.println(pageboard.getList().toString());
    				request.setAttribute("page", "list.jsp");
    			}
    			else if (command.equals("searchList")) 
    			{
    				String field = request.getParameter("field");
    				String search = request.getParameter("search");
    				System.out.printf("%s %s\n",field,search);
    				
    				request.setAttribute("page", "list.jsp");
    			}
    			//	글쓰기버튼이 눌리면
    			else if (command.equals("insert")) 
    			{
    				request.setAttribute("page", "writeForm.jsp");
    			}
    			else if (command.equals("insert.do")) 
    			{
    				String title = request.getParameter("title");
    				String content = request.getParameter("content");
    				String write_name = request.getParameter("write_name");
    				System.out.printf("%s %s %s\n",title,content,write_name);
    				
    				//	model을 적용하여 전송
    				Board board = new Board();
    				board.setTitle(title);
    				board.setContent(content);
    				board.setWrite_name(write_name);
    				//	model 적용 end
    				
    				BoardService service = BoardService.getInstance();
    				
    				//int result = service.insert(title,content,write_name);
    				int result = service.insert(board);
    				
    				if (result == 1)
    				{
    					System.out.println("글입력 성공");
    					
    					request.setAttribute("page", "success.jsp");
    				}
    				else 
    				{
    					System.out.println("글입력 실패");
    					
    					request.setAttribute("page", "fail.jsp");
    				}
    			}
    			else if (command.equals("read")) 
    			{
    				String idx_ = request.getParameter("idx");
    				String requestPage_ = request.getParameter("requestPage");
    				System.out.printf("%s %s\n",idx_,requestPage_);
    				
    				int requestPage = 1;
    				if (requestPage_ != null) 
    					requestPage = Integer.parseInt(requestPage_);
    				
    				int idx = 0;
    				if (idx_ != null) 
    				{
    					idx = Integer.parseInt(idx_);
    					
    					BoardService service = BoardService.getInstance();
    					//	조회수가 1증가하고 해당 글에 대해 view를 해주는 작업
    					service.incrementReadCount(idx);
    					Board board = service.selectById(idx);
    					
    					request.setAttribute("board",board);
    					request.setAttribute("requestPage",requestPage);
    					request.setAttribute("page", "read.jsp");
    				}
    				else{request.setAttribute("page", "read_fail.jsp");}
    			}
    			else
    			{
    				request.setAttribute("page", "list.jsp");
    			}
    		}
    		else{	request.setAttribute("page", "fail.jsp");	}
    		
    		//	2. 분류된 url을 선택하고 전송하는 작업
    		RequestDispatcher dispatcher = request.getRequestDispatcher(
    				"/WEB-INF/board/index.jsp"
    				);
    				
    		//	3. 페이지로 밀어주는 작업
    		dispatcher.forward(request, response);
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {}
    }

     

    index 파일을 실행해보자.

    글 쓰기, 글 보기, 조회수 증가가 잘 동작한다.

    다음에 할 것들 답글 쓰기(핵 중요) 와 리스트 검색이다.

     

     

    뒤이어 아래를 구현해보자.

    designatedroom87.tistory.com/325?category=901206

     

    게시판 만들기 - 6. 게시판의 게시글에 답글 달기

    /board/read_fail.jsp 에 약간의 수정이 발생한다. read_fail.jsp 더보기 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 글 읽기 실패 /board/read.jsp에도 수정을 하..

    designatedroom87.tistory.com

     

    댓글

Designed by Tistory.