MVC 모델1로 게시판 만들기
데이터베이스 세팅
Num은 자동증가가 될거고, 자동증가 INT 는 Auto implement라고 하는데 오라클에서는 시퀀스라고 한다.
Ref, Re_step, Re_level
Ref 는 글그룹이다.
Re_step은 글 스텝이다. 답변의 답변이냐, 답변의 답변의 답변이냐,
만약 부모를 1로 잡으면 리플은 2, 거기서 또 리플은 3으로 잡는다. 부모의 리플이면 2가 계속 생성되겠지
Re_level 글레벨은 글 순서이다. 어떤 순서로 보여줘야할지. 글 생성시, 부모글을 제외한 나머지 글을 1씩 증가시킨다.
Ref는 글그룹이니까, 리플포함 다 같은 숫자이다.
Re_step은 계층이라고 생각하면된다. 리플같은경우 글제목의 리플이면 동일한 스텝을 가진다.
Re_level은 같은 글그룹에서 부모글을 제외한 나머지 큰애들을 다 1씩 증가시킨다.
화면에 뿌리면, Ref 의 제일 최신을 뿌려준다. 숫자가 큰순(내림차순)으로 정렬되겠네..
Re_step은 오름차순으로 정렬되겠네..
다음 Re_level 글레벨의 순서(오름차순)로 뿌려준다.
화면에 뿌릴 때는, Re_step과 Re_level이 1인 베스킨라빈스가 제일 먼저 오고,
그다음, Re_step 이 2인 것들 중에 Re_level이 앞선 베스킨좋아가 다음으로 오고,
그다음, Re_step이 2고, Re_level이 3인 난 나뚜르가 다음,
그다음 Re_step이 3고, Re_level이 4인 나뚜르 나도가 마지막 순으로 화면에 출력된다.
오라클은 DBMS가 Toad라는 이름이다.
오라클은 데이터를 자동증가 시켜주는게 시퀀스 인데, 이걸 만들어줘야한다.
오라클에서 테이블을 만들어 준다.
오라클에서 INT형은 NUMBER을 쓴다.
select * from board 로 테이블을 확인한다.
이클립스에서 Board라는 Dynamic Web Project를 만들어준다.
커넥션풀을 사용하기로 했다. 서버에 커넥션풀을 사용할 수 있도록 선언하자.
WebContent폴더에 jsp 파일을 하나 만들고, BoardWrite.jsp를 하나 만들어준다.
아무것도 안적은 상태에서 서버를 실행한다. 이렇게 해야, server에 Board라는 context가 등록된다. 그래야 커넥션풀을 사용할 수 있다.
Servers 폴더의 server.xml로 가보면 맨 아래에 <context docBase~ 가 있는 것을 확인할 수 있다.
그리고 <context 태그안에 <Resource 태그를 넣어준다.
지금까지
1. 데이터베이스의 테이블 설정했다.
2. 서버에다가 커넥션 풀을 사용할 수 있도록 선언했다.
다음 default로 작성전에 bean클래스와 dao클래스를 만들자.
bean클래스 설정
Java Resources 폴더의 src폴더안에 pacakage를 만들어서 이름을 model이라고 한다.
model안에 클래스를 만들고 이름은 BoardBean이라고 해주자.
BoardBean.java
reg date는 Data 타입으로 받아와서 화면에 출력할 때는 String으로 해야한다. bean은 뺄 때만 쓰니까..
넣을 때는 오라클에 어차피 SysDate로 들어가는거고, 뺄 때는 데이터 타입으로 그것을 toString을 해서 화면에 String 타입으로 뿌려준다.
package Model;
public class BoardBean{
private int num;
private String writer;
private String email;
private String subject;
private String password;
private String reg_date;
private int ref;
private int re_step;
private int re_level;
private int readcount;
private String content;
// 게터와 세터 사용한다.
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getReg_date() {
return reg_date;
}
public void setReg_date(String reg_date) {
this.reg_date = reg_date;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_stop() {
return re_stop;
}
public void setRe_stop(int re_stop) {
this.re_stop = re_stop;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
DAO 클래스 설정
Java Resources 폴더의 src 폴더의 model패키지에 BoardDAO라는 클래스를 만들어준다.
BoardDAO.java
package Model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BoardDAO{
ResultSet rs; //데이터 베이스의 테이블의 결과를 리턴 받아 자바에 저장해 주는 객체
Connection conn;//데이터베이스에 접근할수 있도록 설정
PreparedStatement pstmt;//데이터 베이스에서 쿼리를 실행시켜주는 객체
//데이터 베이스의 커넥션풀을 사용하도록 설정하는 메소드
public void getcon() {
try {
String dbURL = "jdbc:oracle:thin:@DESKTOP-OHJGL9K:1522:xe";
String dbID = "c##BBC";
String dbPassword = "1234";
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
//하나의 새로운 게시글이 넘어와서 저장되는 메소드
public void insertBoard(BoardBean bean){
getcon(); //데이터베이스 연결해준다.
//빈 클래스에 넘어오지 않았던 데이터들을 초기화 해주어야 합니다.
// 글 그룹을 의미 = ref는 제일처음 새글을 써서 넘어왔으니까,
// 쿼리를 실행시켜 가장큰 ref 값을 가져온후 +1을 더해주면 된다
// ref 최초에는 글 아무것도 안썼으니까 0이다.
int ref = 0;
int re_step = 1;//새글이기에 = 부모 글이기에
int re_level = 1;//새글이기에
//쿼리를 날려주기 위해 try~catch문을 써준다.
try {
//가장큰 ref값을 읽어오는 쿼리 준비
String refSQL = "SELECT max(ref) FROM BOARD";
//쿼리실행 객체
pstmt = conn.prepareStatement(refSQL);
//쿼리를 실행후 결과를 리턴
rs = pstmt.executeQuery();
if(rs.next()){//결과 값이 있다면
//최대 값(컬럼1번에서 숫자를가져옴)에 +1을 더해서 글 그룹을 설정
ref = rs.getInt(1)+1;
}
//실제로 게시글 전체값을 테이블에 저장
//board_seq.NEXTVAL라고 써주면, 시퀀스에 이미 들어가 있는 값에 다음값 다음값 다음값을 자동으로 맵핑해서 리턴해줌
String SQL = "INSERT INTO BOARD VALUES(board_seq.NEXTVAL,?,?,?,?,sysdate,?,?,?,0,?)";
pstmt = conn.prepareStatement(SQL);
//?의 값을 맵핑
pstmt.setString(1, bean.getWriter());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);
pstmt.setInt(6, re_step);
pstmt.setInt(7, re_level);
pstmt.setString(8, bean.getContent());
//쿼리를 실행하시오
pstmt.executeUpdate();
//자원 반납
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//모든 게시글을 리턴해 주는 리소스, 카운터링은 게시판을 다만들고나서 마지막에 진행.
//기존 public Vector<BoardBean> getAllBoard(){
public Vector<BoardBean> getAllBoard(int start , int end){
//리턴할 객체 선언
Vector<BoardBean> v = new Vector<>();
getcon();
try {
//쿼리 준비
//제일먼저 ref를 desc 해준다
//re_step을 asc 해준다. 만약에 안되면 re_level을 asc해준다.
//기존 String sql="select * from board order by ref desc, re_step asc ";
// 내부쿼리로 검색을 아예해서 가져온다.
// Rownum은 오라클에만 있는 개념이다.
//A.*은 A의 모든 것을 보여주고 Rownum을 추가하라는 뜻
String SQL = "select * from (select A.* ,Rownum Rnum from (select *from board order by ref desc ,re_stop asc)A)"
+ "where Rnum >= ? and Rnum <= ?";
//쿼리실행 객체
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1,start);
pstmt.setInt(2,end);
//쿼리를 실행후 결과를 저장
rs = pstmt.executeQuery();
//데이터 개수가 몇개인지 모르기에 반복문을 이용하여 데이터를 추출
//데이터베이스에서 가져온 rs값을 가방 bean에 넣는다.
while(rs.next()){
//데이터를 패키징(가방 = Boardbean클래스를 이용)해줌
BoardBean bean = new BoardBean(); //가방을 새로만든다.
bean.setNum(rs.getInt(1)); //컬럼인데스 1번 값 넣고
bean.setWriter(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
//패키징한 데이터를 벡터에 저장 . 박스에 담는다.
v.add(bean);
}
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return v;
}
//BoardInfo 하나의 게시글 리턴하는 메소드
public BoardBean getOneBoard(int num){
//리턴 타입 선언
BoardBean bean = new BoardBean();
getcon();
try {
//조회수 증가 쿼리
String readsql = "update board set readcount = readcount+1 where num=?";
pstmt = conn.prepareStatement(readsql);
pstmt.setInt(1,num);
pstmt.executeUpdate();
//쿼리준비
String SQL = "select * from board where num=?";
//쿼리실행객체
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1,num);
//쿼리 실행후 결과를 리턴
rs= pstmt.executeQuery();
//레코드가 한개뿐이 안 넘어오기 때문에 반복문이 아니라 if
if(rs.next()) {
bean.setNum(rs.getInt(1));
bean.setWrite(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return bean;
}
//답변글이 저장되는 메소드
// 답변형 게시글은 reg 만드는거와, re_step과 re_level을 수정해줘야한다.
public void reWriteBoard(BoardBean bean){
//부모글 그룹과 글레벨 글 스텝을 읽어드림 , 왜? 증가시켜주기 위해서
int ref =bean.getRef();
int re_stop = bean.getRe_step();
int re_level = bean.getRe_level();
getcon();
try {
/////////////////////핵심 코드 ////////////////////////
//부모글 보다 큰 re_level의 값을 전부 1씩 증가시켜줌
//ref=? 는 ref가 같은 그룹이고,
//re_level > ? 는 현재 re_level보다 큰 애들 만 1씩 증가시키시오.
String levelsql = "update board set re_level=re_level+1 where ref=? and re_level > ?";
//쿼리 삽입 객체 선언
pstmt = conn.prepareStatement(levelsql);
pstmt.setInt(1 , ref);
pstmt.setInt(2 , re_level);
//쿼리 실행
pstmt.executeUpdate();
//답변글 데이터를 저장
String sql ="insert into board values(board_seq.NEXTVAL,?,?,?,?,sysdate,?,?,?,0,?)";
pstmt = conn.prepareStatement(sql);
//?에 값을 대입
pstmt.setString(1, bean.getWrite());
pstmt.setString(2, bean.getEmail());
pstmt.setString(3, bean.getSubject());
pstmt.setString(4, bean.getPassword());
pstmt.setInt(5, ref);//부모의 ref 값을 넣어줌
pstmt.setInt(6, re_step+1);//답글이기에 부모글 re_step에 1을 더해줌
pstmt.setInt(7, re_level + 1);
pstmt.setString(8, bean.getContent());
//쿼리를 실행하시오
pstmt.executeUpdate();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
//Boardupdate용 Delete시 하나의 게시글을 리턴
public BoardBean getOneUpdateBoard(int num){
//리턴 타입 선언
BoardBean bean = new BoardBean();
getcon();
try {
//쿼리준비
String SQL = "select * from board where num=?";
//쿼리실행객체
//쿼리실행 객체
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1,num);
//쿼리 실행후 결과를 리턴
rs= pstmt.executeQuery();
if(rs.next()) {
bean.setNum(rs.getInt(1));
bean.setWrite(rs.getString(2));
bean.setEmail(rs.getString(3));
bean.setSubject(rs.getString(4));
bean.setPassword(rs.getString(5));
bean.setReg_date(rs.getDate(6).toString());
bean.setRef(rs.getInt(7));
bean.setRe_stop(rs.getInt(8));
bean.setRe_level(rs.getInt(9));
bean.setReadcount(rs.getInt(10));
bean.setContent(rs.getString(11));
}
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return bean;
}
//update 와 delete시 필요한 기존의 패스워드 값을 리턴해 주는 메소드
public String getPass(int num) {
//리턴할 변수 객체 선언
String pass = "";
getcon();
try {
//쿼리 준비
String sql = "select password from board where num=?";
//쿼리 실행할 객체 선언
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,num);
//쿼리 실행후 결과를 리턴
rs= pstmt.executeQuery();
//패스워드 값을 저장
if(rs.next()) {
pass = rs.getString(1);
}
//자원 반납
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return pass;
}
//하나의 게시글을 수정하는 메소드
public void updateBoard(BoardBean bean){
getcon();
try {
//쿼리 준비
String sql = "update board set subject=? , content= ? where num = ?";
//쿼리 실행할 객체 선언
pstmt = conn.prepareStatement(sql);
//?에 값을 대입
pstmt.setString(1,bean.getSubject());
pstmt.setString(2,bean.getContent());
pstmt.setInt(3,bean.getNum());
//쿼리 실행후 결과를 리턴
pstmt.executeUpdate();
//자원 반납
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//하나의 게시글을 삭제하는 매소드
public void deleteBoard(int num) {
getcon();
try {
//쿼리 준비
String sql = "delete from board where num=?";
//쿼리 실행할 객체 선언
pstmt = conn.prepareStatement(sql);
//?
pstmt.setInt(1,num);
//쿼리 실행
pstmt.executeUpdate();
//자원 반납
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
//전체 글의 갯수를 리턴하는 메소드 작성
public int getAllCount(){
getcon();
//게시글 전체수를 저장하는 변수
//초기값은 0으로 준다.
int count = 0;
try {
//쿼리 준비
String sql = "select count(*) from board";
//쿼리 실행할 객체 선언
pstmt = conn.prepareStatement(sql);
//쿼리 실행후 결과를 리턴
rs = pstmt.executeQuery();
if(rs.next()){
count = rs.getInt(1); //전체 게시글 수
}
//자원 반납
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return count;
}
}
webContent파일에 BoardWriteForm.jsp를 만들어준다.
BoardWirteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> 게시글 쓰기 </h2>
<form action = "BoardWriteProc.jsp" method = "post"> //숨기기 위해 post방식을 쓴다.
<table width ="600" border = "1" bordercolor = "gray" bgcolor = "skyblue" >
<tr height="40">
<td align = "center" width ="150">작성자</td>
<td width="450"><input type= "text" name = "writer" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">제목</td>
<td width="450"><input type= "text" name = "subject" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">이메일</td>
<td width="450"><input type= "email" name = "email" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">비밀 번호</td>
<td width="450"><input type= "password" name = "password" size = "60"></td>
</tr>
<tr height="40">
<td align = "center" width ="150">글 내용</td>
<td width="450"><textarea rows= "10" cols = "60" name = "content"></textarea></td>
</tr>
<tr height="40">
<td align = "center" colspan = "2">
<input type= "submit" value="글쓰기">
<input type= "reset" value="다시 작성">
<button onclick="location.href='BoardList.jsp'">전체 게시글 보기</button>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
WebContent 파일에 BoardWriteProc.jsp 파일을 만들어준다.
BoardWriteProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8"); //한글처리
%>
<!-- 게시글 작성한 데이터를 한번에 읽어 드림 -->
<!-- id는 Bean클래스를 지칭하는 레퍼런스 변수명이 된다.
Boardbean이라고 클래스를 만들었기에, boardbean이라고 이름을 짓는다.
class는 어디있느냐 -->
<!-- name은 어느 bean클래스를 쓰는지 bean클래스 이름을 써준다. -->
<!-- property는 데이터를 1대1씩 맵핑시킨다. -->
<!-- reg 등 없는 것들은 null로 들어온다.-->
<jsp:useBean id = "boardbean" class= "Model.BoardBean">
<jsp:setProperty name="boardbean" property = "*" />
</jsp:useBean>
<%
//데이터 베이스 쪽으로 빈 클래스를 넘겨줌
BoardDAO bdao = new BoardDAO();
//데이터 저장 메소드를 호출, BoardDAO.java로 가서 insertBoard메소드 만들어준다.
bdao.insertBoard(boardbean);
//게시글 저장후 전체 게시글 보기
response.sendRedirect("BoardList.jsp");
%>
</body>
</html>
BoardDAO.java로 가서 insertBoard 메소드를 만들어준다. 오라클에서 Board 테이블의 스키마를 확인해보자
WebContent 폴더에서 BoardList.jsp를 만들자.
BoardList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>전체 게시글 보기</h2>
<!--게시글 보기에 카운터링을 설정하기 위한 변수들을 선언-->
<%
//화면에 보여질 게시글의 개수를 지정
int pageSize=10;
//현재 카운터를 클릭한 번호 값을 읽어 옴
String pageNum = request.getParameter("pageNum");
//만약 처음 boardlist.jsp를 클릭하거나 수정 삭제 등 다른 게시글에서
//이 페이지로 넘어오면 pageNum값이 없기에 null값 처리
if(pageNum==null){
pageNum="1";
}
int count = 0; // 전체 글의 갯수를 저장하는 변수
int number = 0;//페이지 넘버링 변수
//현재 보고자 하는 페이지 숫자를 지정
int currentPage = Integer.parseInt(pageNum);
//1. 전체 게시글의 내용을 BoardDAO에 접근해서 jsp쪽으로 가져와야함
BoardDAO bdao = new BoardDAO();
//전체 게시글의 갯수를 읽어드린 메소드 호출
count = bdao.getAllCount();
//현재 페이지에 보여줄 시작 번호를 설정 =데이터 베이스에서 불러올 시작 번호
int startRow = (currentPage-1)*pageSize + 1;
int endRow = currentPage * pageSize;
// 2. 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출
// 사용자가 많이 들어오면 게시글의 총 갯수가 몇개인지 모른다.
// 가변길이인 벡터로 받아야 한다. 가방은 빈클래스, 박스는 벡터라고 생각해라.
//<BoardBean>은 BoardBean타입으로 받겠다.
// getAllBoard 메소드를 하나 만들고, 이 메소드를 호출하면 리턴타입이 Vector로 되어있고,
// 그안에 패키징은 BoardBean타입으로 패키징 되어있고 그것을 리턴받는다.
//BoardDAO.java로 가서 getAllBoard 메소드를 만들어준다.
Vector<BoardBean> vec = bdao.getAllBoard(startRow , endRow);
//테이블에 표시할 번호 지정
number = count - (currentPage-1)*pageSize;
%>
<table width = "700" border = "1" bgcolor="skyblue">
<tr height = "40">
<td align ="right" colspan = "5">
<input type="button" value="글쓰기" onclick="location.href='BoardWriteForm.jsp'">
</td>
</tr>
<tr height = "40">
<td width = "50" align ="center">번호 </td>
<td width = "320" align ="center">제목</td>
<td width = "100" align ="center">작성자 </td>
<td width = "150" align ="center">작성일 </td>
<td width = "80" align ="center">조회수</td>
</tr>
<%
for(int i=0;i < vec.size();i++){
BoardBean bean = vec.get(i);// 벡터에 저장되어있는 빈 클래스 하나씩 추출
%>
<tr height = "40">
<td width = "50" align ="center"><%=number--%></td>
<td width = "320" align ="left">
//제목을 누르면 글읽기인 BoardInfo.jsp로 넘어간다.
//Num를 넘겨서 pk를 기준으로 BoarInfo에서 정보를 얻어갖고 와야하니까
//<%=bean.getNum()%>를 쓴다.
//<a>안에 이제 제목은 <%=bean.getSubject() %>를 쓴다.
//글 내용은 left 정렬해야 한다. 나중에 댓글생기면 들여쓰기 되니까.
<a href= "BoardInfo.jsp?num=<%=bean.getNum()%>" style ="text-decoration:none;">
<%
if(bean.getRe_step() > 1){
//공백을 for문 만큼 뿌려줘야하니까
for(int j = 0 ;j<(bean.getRe_step()-1)*5;j++){
%>
<% }
}
%>
<%=bean.getSubject()%>
</a>
</td>
<td width = "100" align ="center"><%=bean.getWrite()%></td>
<td width = "150" align ="center"><%=bean.getReg_date()%></td>
<td width = "80" align ="center"><%=bean.getReadcount()%></td>
</tr>
<%}%>
</table>
<p>
<!-- 페이지 카운터링 소스를 -->
<%
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;
}
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 i=startPage;i<=endPage;i++){
%>
<a href="BoardList.jsp?pageNum=<%=i%>">[<%=i %>]</a>
<%
}
//다음이라는 링크를 만들건지 파악
if(endPage < pageCount){
%>
<a href="BoardList.jsp?pageNum=<%=startPage+10%>">[다음]</a>
<%
}
}
%>
</p>
</center>
</body>
</html>
BoardList.jsp에서 제목을 누르면 글의 대한 내용을 읽어와야하니까, DAO클래스에 가서 getOneBoard 메소드를 이용해서 글 하나를 가지고 나온 후, 그것을 다시 하나의 게시글을 보여주는 BoardInfo.jsp에 붙여준다.
WebContent폴더에 BoardInfo.jsp파일을 만든다.
BoardInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
//BoardList.jsp에서 여기 BoardInfo.jsp로 파라미터 num값을 넘겼다.
<%
//공백 제거후 정수형으로 바뀜
int num = Integer.parseInt(request.getParameter("num").trim());
//데이터 베이스 접근
BoardDAO bdao = new BoardDAO();
//boardbean타입으로 하나의 게시글을 리턴
//BoardDAO.java로 가서 getOneBoard 메소드 생성한다.
BoardBean bean = bdao.getOneBoard(num);
%>
<center>
<h2>게시글 보기</h2>
<table width = "600" border = "1" bgcolor="skyblue">
<tr height = "40">
<td width = "100" align ="center">글번호 </td>
<td width = "180" align ="left"><%=bean.getNum()%></td>
<td width = "120" align ="center">조회수 </td>
<td width = "180" align ="center"><%=bean.getReadcount()%> </td>
</tr>
<tr height = "40">
<td width = "100" align ="center">작성자 </td>
<td width = "180" align ="left"><%=bean.getWriter()%></td>
<td width = "120" align ="center">작성일 </td>
<td width = "180" align ="center"><%=bean.getReg_date()%> </td>
</tr>
<tr height = "40">
<td width = "120" align ="center">이메일 </td>
<td colspan = "3" align ="center"><%=bean.getEmail()%></td>
</tr>
<tr height = "40">
<td width = "120" align ="center">제목 </td>
<td colspan = "3" align ="center"><%=bean.getSubject()%></td>
</tr>
<tr height = "80">
<td width = "120" align ="center">글 내용 </td>
<td colspan = "3" align ="center"><%=bean.getContent()%></td>
</tr>
<tr height = "40">
<td align ="center" colspan = "4">
//답글쓸 때는, 부모글의 ref, re_step, re_level을 모두 알고 넘어가야하고,
//num값도 넘겨야한다.
//아니면 num만 넘겨서 저쪽편에서 받아와도 된다. ref, re_step, re_level모두 넘기는거 이렇게도 해본거임
<input type="button" value="답글쓰기"
onclick="location.href='BoardReWriteForm.jsp?num=<%=bean.getNum()%>&ref=<%=bean.getRef()%>&re_step=<%=bean.getRe_step()%>&re_level=<%=bean.getRe_level()%>'">
//수정하기는 num만 넘기자
<input type="button" value="수정하기" onclick="location.href='BoardUpdateForm.jsp?num=<%=bean.getNum()%>'">
//삭제하기도 num만 넘기자
<input type="button" value="삭제하기" onclick="location.href='BoardDeleteForm.jsp?num=<%=bean.getNum()%>'">
<input type="button" value="목록보기" onclick="location.href='BoardList.jsp'">
</td>
</tr>
</table>
</center>
</body>
</html>
이제 답글쓰기를 하자
WebContent 폴더에 BoardReWriteForm.jsp를 만들자
BoardReWriteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>답변글 입력하기</h2>
<%
//게시글 읽기에서 답변글쓰기를 클릭하면 넘겨주는 데이터들을 받아줌
int num = Integer.parseInt(request.getParameter("num"));
int ref = Integer.parseInt(request.getParameter("ref"));
int re_step = Integer.parseInt(request.getParameter("re_step"));
int re_level = Integer.parseInt(request.getParameter("re_level"));
%>
<form action="BoardReWriteProc.jsp" method="post">
<table width="600" border="1" bordercolor="gray" bgcolor="skyblue">
<tr height = "40">
<td width="150" align="center"> 작성자</td>
<td width="450"><input type ="text" name="write" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">제목</td>
<td width="450"><input type ="text" name="subject" value ="[답변]" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">이메일</td>
<td width="450"><input type ="email" name="email" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">비밀 번호</td>
<td width="450"><input type ="password" name="password" size ="60"></td>
</tr>
<tr height = "40">
<td width="150" align="center">글 내용</td>
<td width="450"><textarea rows="10" cols="60" name="content"></textarea></td>
</tr>
<!--ref, re_step, re_level을 받은 이유가 뭘까? -->
<!-- 데이터베이스쪽으로 나는 게시글이 아니고 답변 글이야를 알려주기 위해서 -->
<!--form에서 사용자로부터 입력받지 않고 데이터를 넘김 -->
<tr height ="40">
<td align ="center" colspan="2">
<input type="hidden" name ="ref" value="<%=ref%>">
<input type="hidden" name ="re_step" value="<%=re_step%>">
<input type="hidden" name ="re_level" value="<%=re_level%>">
<input type="submit" value="답글 쓰기 완료">
<input type="reset" value="취소">
<input type="button" onclick="location.href='BoardList.jsp'" value="전체글보기">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
WebContent폴더에서 BoardReWriteProc.jsp를 만들어 주자.
BoardReWriteProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<!--데이터를 한번에 받아오는 빈클래스를 사용하도록 -->
<jsp:useBean id = "boardbean" class= "Model.BoardBean">
<jsp:setProperty name="boardbean" property = "*" />
</jsp:useBean>
<%
// 이제, 데이터베이스 호출해서 데이터를 저장하자
//데이터 베이스 객체 생성
BoardDAO bdao = new BoardDAO();
//BoardDAO.java로 가서 reWriteBoard메소드를 만들어주자.
bdao.reWriteBoard(boardbean);
//답변 데이터를 모두 저장 후 전체 게시글 보기를 설정
response.sendRedirect("BoardList.jsp");
%>
</body>
</html>
글 수정을 누르면, 누구 글을 수정할 것인지에 대한 정보를 알아야한다.
BoardUpdateForm.jsp로 해당 글의 PK번호인 num값을 넘겨줄 것이다.
num기준으로 작정자, 제목, 글내용을 뿌려주고 그걸 거시서 수정하면 다시 업데이트 되도록 해줄것이기에
num값이 반드시 필요하다.
패스워드도 받아와서 일치하지 않는지 확인해야한다.
WebContent 폴더에서 BoardUpdateForm.jsp를 만들어준다.
BoardUpdateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<center>
<h2> 게시글 수정</h2>
<%
//num을 제일 먼저 받아왔다.
//해당 게시글 번호(num)를 통하여 게시글을 수정
int num = Integer.parseInt(request.getParameter("num").trim());
//하나의 게시글의 대한 정보를 리턴
BoardDAO bdao = new BoardDAO();
BoardBean bean = bdao.getOneUpdateBoard(num);
%>
<form action="BoardUpdateProc.jsp" method ="post">
<table width = "600" border = "1" bgcolor="skyblue">
<tr height= "40">
<td width="120" align="center">작성자</td>
<td width="180" align="center"><%=bean.getWriter()%></td>
<td width="120" align="center">작성일</td>
<td width="180" align="center"><%=bean.getReg_date()%></td>
</tr>
<tr height= "40">
<td width="120" align="center">제목</td>
<td width="480" colspan="3"> <input type="text" name="subject" value="<%=bean.getSubject()%>" size="60"></td>
</tr>
<tr height= "40">
<td width="120" align="center">패스워드</td>
<td width="480" colspan="3"> <input type="password" name="password" size="60"></td>
</tr>
<tr height= "40">
<td width="120" align="center">글내용</td>
<td width="480" colspan="3"><textarea rows="10" cols="60" name="content" align="left"><%=bean.getContent()%></textarea></td>
</tr>
<tr height= "40">
<td colspan="4" align="center">
// 기존글의 password와 여기 password 맞히려면 num 값을 넘겨줘야한다.
<input type="hidden" name="num" value="<%=bean.getNum() %>">
<input type="submit" value="글수정">
<input type="button" onclick = "location.href='BoardList.jsp'" value="전체 글 보기">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
WebContent폴더에서 BoardUpdateProc.jsp를 만들자.
4개를 읽어들이면 되는데, request를 쓰는 것보다 usebean쓰는게 편하다.
문제는, 데이터베이스에 가서 해당 글의 패스번호를 얻어 올거다. 그 비밀번호와 내가 쓴 비밀번호가 같은지 확인해준다.
BoardUpdateProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<!--사용자데이터를 한번에 받아오는 빈클래스를 사용하도록 -->
<jsp:useBean id = "boardbean" class= "Model.BoardBean">
<jsp:setProperty name="boardbean" property = "*" />
</jsp:useBean>
<%
//데이터 베이스에 연결
BoardDAO bdao = new BoardDAO();
//해당 게시글의 패스워드 값을 얻어옴
//BoardBean.java에 가서 getPass메소드를 작성한다.
// pass는 기존의 password이다.
String pass = bdao.getPass(boardbean.getNum());
//기존 패스워드 값과 update시 작성했던 password값이 같은지 비교
if(pass.equals(boardbean.getPassword())){
//데이터 수정하는 메소드 호출
//BoardDAO에 updateBoard메소드 생성하자
bdao.updateBoard(boardbean);
//수정이 완료되면 전체 게시글 보기
response.sendRedirect("BoardList.jsp");
}else{//패스워드가 틀리다면
%>
<script type="text/javascript">
alert("패스워드가 일치하지 않습니다. 다시 확인후 수정해 주세요 ");
history.go(-1);
</script>
<%
}
%>
</body>
</html>
이제 글 삭제를 하자.
WebContent 폴더에서 BoardDeleteForm.jsp 를 만들자.
BoardDeleteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
BoardDAO bdao = new BoardDAO();
int num = Integer.parseInt(request.getParameter("num"));
//하나의 게시글을 리턴
BoardBean bean = bdao.getOneUpdateBoard(num);
%>
<center>
<form action = "BoardDeleteProc.jsp" method="post">
<table width="600" border ="1" bgcolor="skyblue">
<tr height="40">
<td width="120" align ="center">작성자</td>
<td width="180" align ="center"><%=bean.getWriter() %></td>
<td width="120" align ="center">작성일</td>
<td width="180" align ="center"><%=bean.getReg_date() %></td>
</tr>
<tr height="40">
<td width="120" align ="center">제목</td>
<td align ="left" colspan="3"><%=bean.getSubject() %></td>
</tr>
<tr height="40">
<td width="120" align ="center">패스워드</td>
<td align ="left" colspan="3"><input type ="password" name="password"></td>
</tr>
<tr height="40">
<td align ="center" colspan="4">
<input type ="hidden" name ="num" value="<%=num %>">
<input type ="submit" value="글삭제">
<input type ="button" onclick="location.href='BoardList.jsp'"value="목록보기 ">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
password와 num 이 넘어간다.
WebContent폴더에 BoardDeleteProc.jsp를 만들어준다.
BoardDeleteProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
//usebean으로 받아도 되는데, 2개니까 string 타입으로 그냥 받자.
<%
String pass = request.getParameter("password");
int num = Integer.parseInt(request.getParameter("num"));
//데이터 베이스 연결
BoardDAO bdao = new BoardDAO();
//getPass 메소드를 BoardDAO.java에 만들어놨다.
String password = bdao.getPass(num);
//기존 패스워드 값과 delete form에서 작성한 패스워드를 비교
if(pass.equals(password)){
//패스워드가 둘다 같다면
// BoardDAO.java에서 deleteBoard 메소드를 만들어준다.
bdao.deleteBoard(num);
response.sendRedirect("BoardList.jsp");
}else{
%>
<script>
alert("패스워드가 틀려서 삭제할수 없습니다. 패스워드를 확인해 주세요");
history.go(-1);
</script>
<%
}
%>
</body>
</html>
이제 카운터링 빼고는 다 끝났다.
카운터
Boardlist.jsp를 열어서, 카운터링을 고치자.
BoardList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="Model.BoardDAO"%>
<%@ page import="Model.BoardBean"%>
<%@ page import ="java.util.Vector"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>전체 게시글 보기</h2>
<!--3. 게시글 보기에 카운터링을 설정하기 위한 변수들을 선언-->
<%
//4. 화면에 보여질 게시글의 개수(pageSize)를 지정
int pageSize=10;
//5. 현재 보고있는 카운터를 클릭한 번호 값을 읽어 옴
String pageNum = request.getParameter("pageNum");
//6. 만약 처음 boardlist.jsp를 클릭하거나 수정 삭제 등 다른 게시글에서
//이 페이지로 넘어오면 pageNum값이 없기에 null값 처리
//pageNum이 안들어왔다는 거는 다른 페이지에서 넘어왔기 때문에
//최신목록을 보여주라는 말과 똑같은 뜻이다.
if(pageNum==null){
pageNum="1";
}
int count = 0; //7. 전체 글의 갯수를 저장하는 변수
int number = 0;//8. 테이블에 표시할 글 번호이다.
//9. 현재 보고자 하는 페이지 숫자를 저장
int currentPage = Integer.parseInt(pageNum);
//1. 전체 게시글의 내용을 BoardDAO에 접근해서 jsp쪽으로 가져와야함
BoardDAO bdao = new BoardDAO();
//10 . 전체 게시글의 갯수를 읽어드린 메소드 호출
// BoardDAO.java로 가서 getAllCount() 메소드 생성한다.
count = bdao.getAllCount();
//11. 현재 페이지에 보여줄 시작 번호를 설정 =데이터 베이스에서 불러올 시작 번호
//공식이다.
int startRow = (currentPage-1)*pageSize + 1;
int endRow = currentPage * pageSize;
// 2. 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출
// 사용자가 많이 들어오면 게시글의 총 갯수가 몇개인지 모른다.
// 가변길이인 벡터로 받아야 한다. 가방은 빈클래스, 박스는 벡터라고 생각해라.
//<BoardBean>은 BoardBean타입으로 받겠다.
// getAllBoard 메소드를 하나 만들고, 이 메소드를 호출하면 리턴타입이 Vector로 되어있고,
// 그안에 패키징은 BoardBean타입으로 패키징 되어있고 그것을 리턴받는다.
//BoardDAO.java로 가서 getAllBoard 메소드를 만들어준다.
//12. startRow부터 시작해서, endRow까지 호출
Vector<BoardBean> vec = bdao.getAllBoard(startRow , endRow);
//테이블에 표시할 글 번호를 지정
number = count - (currentPage-1)*pageSize;
%>
<table width = "700" border = "1" bgcolor="skyblue">
<tr height = "40">
<td align ="right" colspan = "5">
<input type="button" value="글쓰기" onclick="location.href='BoardWriteForm.jsp'">
</td>
</tr>
<tr height = "40">
<td width = "50" align ="center">번호 </td>
<td width = "320" align ="center">제목</td>
<td width = "100" align ="center">작성자 </td>
<td width = "150" align ="center">작성일 </td>
<td width = "80" align ="center">조회수</td>
</tr>
<%
for(int i=0;i < vec.size();i++){
BoardBean bean = vec.get(i);// 벡터에 저장되어있는 빈 클래스 하나씩 추출
%>
<tr height = "40">
<td width = "50" align ="center"><%=number--%></td>
<td width = "320" align ="left">
//제목을 누르면 글읽기인 BoardInfo.jsp로 넘어간다.
//Num를 넘겨서 pk를 기준으로 BoarInfo에서 정보를 얻어갖고 와야하니까
//<%=bean.getNum()%>를 쓴다.
//<a>안에 이제 제목은 <%=bean.getSubject() %>를 쓴다.
//글 내용은 left 정렬해야 한다. 나중에 댓글생기면 들여쓰기 되니까.
<a href= "BoardInfo.jsp?num=<%=bean.getNum()%>" style ="text-decoration:none;">
<%
if(bean.getRe_step() > 1){
//공백을 for문 만큼 뿌려줘야하니까
for(int j = 0 ;j<(bean.getRe_step()-1)*5;j++){
%>
<% }
}
%>
<%=bean.getSubject()%>
</a>
</td>
<td width = "100" align ="center"><%=bean.getWrite()%></td>
<td width = "150" align ="center"><%=bean.getReg_date()%></td>
<td width = "80" align ="center"><%=bean.getReadcount()%></td>
</tr>
<%}%>
</table>
<p>
<!-- 페이지 카운터링 소스를 작성 , 카운터링 알고리즘이다. -->
<%
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;
}
int pageBlock=10;//카운터링 처리 숫자
int endPage = startPage+pageBlock-1;//화면에 보여질 페이지의 마지막 숫자
if(endPage > pageCount) endPage = pageCount;
//이전이라는 링크를 만들건지 파악
// 10보다 크면 이전이 생긴다.
if(startPage > 10){
%>
<a href="BoardList.jsp?pageNum=<%=startPage-10%>">[이전]</a>
<%
}
//페이징 처리
for(int i=startPage;i<=endPage;i++){
%>
<a href="BoardList.jsp?pageNum=<%=i%>">[<%=i %>]</a>
<%
}
//다음이라는 링크를 만들건지 파악
if(endPage < pageCount){
%>
<a href="BoardList.jsp?pageNum=<%=startPage+10%>">[다음]</a>
<%
}
}
%>
</p>
</center>
</body>
</html>
카운터링 알고리즘을 통해 전체를 이해하자.
예를 들어 총게시글이 184개이다.
int pageSize=10; //화면에 보여질 게시글의 수는 10개로 지정하였다.
//pageNum은 클릭한 페이지 넘버라고 생각하자.
// 현재 페이지 넘버를 기준으로 넘어오고, 처음에는 클릭한 값이 없으므로 null이 넘어온다.
String pageNum = request.getParameter("pageNum");
//처음에는 클릭한 값이 없으므로 pageNum=1 가 된다.
if(pageNum==null){
pageNum="1";
}
//전체 글의 갯수를 저장하는 변수
int count = 0;
//테이블에 표기할 글 번호이다.
int number = 0;
//현재 보고자 하는 페이지 숫자를 저장
// pageNum이 1이므로, currentPage = 1 이 된다.
int current Page = Interger.parseInt(pageNum);
//다음 데이터베이스에 접근해서 getAllCount()를 하였다.
// 전체 게시글의 갯수를 읽어드린 메소드를 호출하면 count = 184 가 된다.
BoardDAO bdao = new BoardDAO();
count = bdao.getAllCount();
//현재 페이지에 보여줄 시작 번호를 설정 = 데이터베이스에서 불러올 시작번호
// currentPage가 1이므로, startRow = 1 이 된다.
int startRow = (currentPage-1)*pageSize+1;
// currentPage가 1이므로, endRow = 10이 된다.
int endRow = currentPage*pageSize;
//테이블에 표시할 글번호를 지정
// count는 184개 , currentPage는 1이므로, number = 184 이다.
number = count - (currentPage -1) * pageSize;
if(count > 0)
//카운터링 숫자를 얼마까지 보여줄건지 결정
//pageCount는 총 페이지의 갯수가 몇개인가 라고 생각하면 된다.
//count가 184이고 pageSize는 10이므로 18개이고, 나머지가 0이 아니므로, 1을 더한다.
// pageCount = 19 가 된다.
int pageCount = count / pageSize + (count%pageSize == 0 ? 0 : 1 );
//시작 페이지 숫자를 설정
int startPage = 1;
//currentPage가 현재 1이고 10을 나눈게 0 이 아니므로, startPage=1이 된다.
if(currentPage %10 != 0) {
startPage=(int)(currentPage/10)*10+1;
}else{
startPage=((int)(currentPage/10)-1)*10+1;
}
//카운터링 처리숫자 설정
int pageBlock=10;
//화면에 보여질 페이지의 마지막 숫자
// startPage가 1이므로 endPage=10 이 된다.
int endPage = startPage + pageBlock -1;
//endPage는 10이고, pageCount는 19이므로 실행되지 않는다.
if(endPage > pageCount) endPage = pageCount;
//startPage가 1이므로 [이전]이라는 글씨가 출력되지 않는다.
if(startPage > 10){
<a href="BoardList.jsp?pageNum=<%=startPage-10%>"> [이전] </a>
}
//페이징 처리
//startPage 1부터 endPage 10까지 [1] [2] [3] ....[10] 을 적는다.
for(int i = startPage; i <= endPage ; i++) {
<a href = "BoardList.jsp?pageNum=<%=i%>">[<%=i%>]</a>
}
//[다음] 이라는 링크를 만들건지 파악
//endPage는 10이고, pageCount는 19이므로, [다음]이 만들어진다.
//[1] [2] [3] .....[10] [다음] 이 된다.
if(endPage < pageCount){
<a href="BoardList.jsp?pageNum=<%=startPage+10%>">[다음] </a>
}
//[다음]을 누르면
//<a href="BoardList.jsp?pageNum=<%=startPage+10%>">에서
// startPage는 1이므로, pageNum=11이 된다.
//다시 위에서부터 시작하면 총게시글이 184개이다.
int pageSize=10; //화면에 보여질 게시글의 수는 10개로 지정하였다.
//pageNum은 클릭한 페이지 넘버라고 생각하자.
// 현재 페이지 넘버를 기준으로 넘어오고, 처음에는 클릭한 값이 없으므로 null이 넘어온다.
// 지금은 pageNum=11이 넘어왔다.
String pageNum = request.getParameter("pageNum");
//현재 보고자 하는 페이지 숫자를 저장
// 이제 pageNum이 11이므로, currentPage = 11 이 된다.
int current Page = Interger.parseInt(pageNum);
//다음 데이터베이스에 접근해서 getAllCount()를 하였다.
// 전체 게시글의 갯수를 읽어드린 메소드를 호출하면 count = 184 가 된다.
BoardDAO bdao = new BoardDAO();
count = bdao.getAllCount();
//현재 페이지에 보여줄 시작 번호를 설정 = 데이터베이스에서 불러올 시작번호
// currentPage가 11이므로, startRow = 101 이 된다.
int startRow = (currentPage-1)*pageSize+1;
// currentPage가 11이므로, endRow = 110 이 된다.
int endRow = currentPage*pageSize;
//테이블에 표시할 글번호를 지정
// count는 184개 , currentPage는 11이므로, number = 84 이다.
number = count - (currentPage -1) * pageSize;
if(count > 0)
//카운터링 숫자를 얼마까지 보여줄건지 결정
//pageCount는 총 페이지의 갯수가 몇개인가 라고 생각하면 된다.
//count가 184이고 pageSize는 10이므로 18개이고, 나머지가 0이 아니므로, 1을 더한다.
// pageCount = 19 가 된다.
int pageCount = count / pageSize + (count%pageSize == 0 ? 0 : 1 );
//시작 페이지 숫자를 설정
int startPage = 1;
//currentPage가 현재 11이고 10을 나눈게 0 이 아니므로, startPage=11이 된다.
if(currentPage %10 != 0) {
startPage=(int)(currentPage/10)*10+1;
}else{
startPage=((int)(currentPage/10)-1)*10+1;
}
//카운터링 처리숫자 설정
int pageBlock=10;
//화면에 보여질 페이지의 마지막 숫자
// startPage가 11이므로 endPage=20 이 된다.
int endPage = startPage + pageBlock -1;
//endPage는 20이고, pageCount는 19이므로 실행되서
// endPage =19 가 된다.
if(endPage > pageCount) endPage = pageCount;
//startPage가 11이므로 [이전]이라는 글씨가 출력된다.
if(startPage > 10){
<a href="BoardList.jsp?pageNum=<%=startPage-10%>"> [이전] </a>
}
//페이징 처리
//startPage 11부터 endPage 19까지 [11] [12] [13] ....[19] 을 적는다.
for(int i = startPage; i <= endPage ; i++) {
<a href = "BoardList.jsp?pageNum=<%=i%>">[<%=i%>]</a>
}
//[다음] 이라는 링크를 만들건지 파악
//endPage는 19이고, pageCount는 19이므로, [다음]은 사라진다.
//[이전] [11] [12] [13] .....[19]이 된다.
if(endPage < pageCount){
<a href="BoardList.jsp?pageNum=<%=startPage+10%>">[다음] </a>
}
'백엔드 > JSP' 카테고리의 다른 글
JSP에서 커넥션풀 사용하기 (0) | 2021.05.05 |
---|---|
jsp 로 alert창 띄우고 페이지 이동시키기 (2) | 2021.05.03 |
MVC 모델2로 게시판 만들기 (0) | 2021.04.28 |
MVC 패턴 연습> 회원 가입과 회원 보기를 모델2로 고치기 (0) | 2021.04.27 |
인프런 JSP MVC 모델2 ① (0) | 2021.04.26 |