Board 테이블을 활용해서 paging을 해보자
web.xml에서 서블릿 매핑을 해주자
=============================코드=============================
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>10_Board_Paging</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 서블릿 매핑(N:1) -->
<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>com.board.controller.FrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>*.go</url-pattern>
</servlet-mapping>
</web-app>
복사해서 lib 폴더에 붙여넣기!

패키지 3개 생성

model 패키지에 BoardDTO 클래스 생성
=============================코드=============================
package com.board.model;
public class BoardDTO {
private int board_no;
private String board_writer;
private String board_title;
private String board_cont;
private String board_pwd;
private int board_hit;
private String board_date;
private String board_update;
public int getBoard_no() {
return board_no;
}
public void setBoard_no(int board_no) {
this.board_no = board_no;
}
public String getBoard_writer() {
return board_writer;
}
public void setBoard_writer(String board_writer) {
this.board_writer = board_writer;
}
public String getBoard_title() {
return board_title;
}
public void setBoard_title(String board_title) {
this.board_title = board_title;
}
public String getBoard_cont() {
return board_cont;
}
public void setBoard_cont(String board_cont) {
this.board_cont = board_cont;
}
public String getBoard_pwd() {
return board_pwd;
}
public void setBoard_pwd(String board_pwd) {
this.board_pwd = board_pwd;
}
public int getBoard_hit() {
return board_hit;
}
public void setBoard_hit(int board_hit) {
this.board_hit = board_hit;
}
public String getBoard_date() {
return board_date;
}
public void setBoard_date(String board_date) {
this.board_date = board_date;
}
public String getBoard_update() {
return board_update;
}
public void setBoard_update(String board_update) {
this.board_update = board_update;
}
}
BoardDAO 클래스 생성
=============================코드=============================
package com.board.model;
import java.sql.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BoardDAO {
// DB와 연결하는 객체
Connection con = null;
// DB에 SQL문을 전송하는 객체
PreparedStatement pstmt = null;
// SQL문을 실행한 후에 결과값을 가지고 있는 객체
ResultSet rs = null;
// SQL문을 저장할 객체
String sql = null;
// BoardDAO 객체를 싱글턴 방식으로 만들어보자
// 1단계 : BoardDAO 객체를 정적(static) 멤버로 선언을 해주어야 함
private static BoardDAO instance = null; // instance 는 참조변수
// 2단계 : 싱글턴 방식으로 객체를 만들기 위해서는
// 우선적으로 기본생성자의 접근지정자를 public이 아닌 private으로 변경해주어야 함
// 즉, 외부에서 직접적으로 기본생성자에 접근하여 호출하지 못하도록 하는 방법
private BoardDAO() { } // 기본 생성자
// 3단계 : 기본 생성자 대신에 싱글턴 객체를 return 해주는 getInstance() 메서드를 만들어서
// 해당 getInstance() 메서드를 외부에서 접근이 가능하도록 해주면 됨
public static BoardDAO getInstance() {
if(instance == null) {
instance = new BoardDAO();
}
return instance;
} // getInstance() 메서드 end
// DB 연동 작업을 하는 메서드 - JDBC 방식으로 DB와 연결
// JDBC 방식이 아닌 DBCP 방식으로 DB와 연동 작업 진행
public void openConn() {
try {
// 1단계 ; JNDI 서버 객체 생성
Context initCtx = new InitialContext();
// 2단계 : Context 객체를 얻어와야 함
Context ctx = (Context)initCtx.lookup("java:comp/env"); // env는 접두어
// 3단계 : lookup() 메서드를 이용하여 매칭되는 커넥션을 찾아옴
DataSource ds = (DataSource)ctx.lookup("jdbc/myoracle");
// 4단계 : DataSource 객체를 이용하여 커넥션을 하나 가져오면 됨
con = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
// DB에 연결되어 있던 자원을 종료하는 메서드
public void closeConn(ResultSet rs, PreparedStatement pstmt, Connection con) {
try {
if(rs != null) { rs.close(); }
if(pstmt != null) { pstmt.close(); }
if(con != null) { con.close(); }
} catch (SQLException e) {
e.printStackTrace();
}
}
// DB에 연결되어 있던 자원을 종료하는 메서드
public void closeConn(PreparedStatement pstmt, Connection con) {
try {
if(pstmt != null) { pstmt.close(); }
if(con != null) { con.close(); }
} catch (SQLException e) {
e.printStackTrace();
}
}
}
controller 패키지에 FrontController 클래스, mapping.properties 파일(File) 생성
=============================코드=============================
package com.board.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글 깨짐 방지 설정 작업 진행
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
// getRequestURI() : "/프로젝트명/파일명(*.go)" 라는 문자열을 반환해주는 메서드
String uri = request.getRequestURI();
System.out.println("URI >>> " + uri);
// getContextPath() : 현재 프로젝트명을 문자열로 반환해주는 메서드
String path = request.getContextPath();
System.out.println("Path >>> " + path);
String command = uri.substring(path.length() + 1); // 09_Member_MVC2/select.go =>16자리 이후를 뽑아냄(select.go 로 이동!)
System.out.println("Command >>> " + command);
}
}
mapping properties
파일 클릭 후 UTF-8로 변경

=============================코드=============================
select.go = execute|com.board.action.BoardListAction
action 패키지에 Action 인터페이스 생성
=============================코드=============================
package com.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public ActionForward execute(HttpServletRequest request, HttpServletResponse response);
}
ActionForward 클래스 생성
=============================코드=============================
package com.board.action;
/*
* ActionForward 클래스
*
* 1. Action 인터페이스에서 리턴타입(반환형)으로 사용될 클래스
* 2. 클래스 구성 요소
* 1) isRedirect 멤버 - 반환형은 boolean 타입
* - true : *.go 페이지
* - false : *.jsp 페이지
*
* 2) path 멤버 - 반환형은 String 타입
* - 파일 경로 설정(지정)
*/
public class ActionForward {
private boolean isRedirect;
private String path;
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
main.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>
<div align = "center">
<hr width = "30%" color = blue>
<h3>BOARD 테이블 메인 페이지</h3>
<hr width = "30%" color = blue>
<br/> <br/>
<%-- request.getContextPath() : 현재 프로젝트명을 문자열로 반환해주는 메서드 --%>
<%-- select는 별칭 --%>
<a href = "<%=request.getContextPath() %>/select.go">[전체 회원 목록]</a>
</div>
</body>
</html>
다시 FrontController 클래스로 가서 작성
=============================코드=============================
package com.board.controller;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.action.Action;
import com.board.action.ActionForward;
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글 깨짐 방지 설정 작업 진행
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
// getRequestURI() : "/프로젝트명/파일명(*.go)" 라는 문자열을 반환해주는 메서드
String uri = request.getRequestURI();
System.out.println("URI >>> " + uri);
// getContextPath() : 현재 프로젝트명을 문자열로 반환해주는 메서드
String path = request.getContextPath();
System.out.println("Path >>> " + path);
String command = uri.substring(path.length() + 1); // 10_Board_Paging/select.go =>(select.go 로 이동!)
System.out.println("Command >>> " + command);
Action action = null;
ActionForward forward = null;
// Properties 클래스
Properties prop = new Properties();
FileInputStream fis =
new FileInputStream("C:\\NCS\\workspace(jsp)\\10_Board_Paging\\src\\main\\java\\com\\board\\controller\\mapping.properties");
prop.load(fis);
String value = prop.getProperty(command); // command는 key(select.go) / value 값을 가져옴
System.out.println("Value >>> " + value);
if(value.substring(0, 7).equals("execute")) {
StringTokenizer st = new StringTokenizer(value, "|"); // | 기준으로 잘라냄
String url_1 = st.nextToken(); // "execute"
String url_2 = st.nextToken(); // "패키지명.클래스명"
try {
Class<?> url = Class.forName(url_2);
//url.newInstance(); // 프로그램을 실행하면서 필요한 객체들을 생성해주는 역할
/*
* 동적 객체 생성 : newInstance()
* - Class 객체를 이용하면 new 연산자의 사용 없이 동적으로
* 객체 생성이 가능함.
* - 코드 작성 시에 클래스의 이름을 결정할 수 없고, 런타임(실행)
* 시에 클래스의 이름이 결정되는 경우에 유용하게 사용이 됨.
*
* - newInstance() 메서드는 기본생성자를 통하여 객체를 생성하기
* 때문에 반드시 클래스에 기본생성자가 존재하여야 함.
* 예외가 발생할 수 있는데 해당 클래스가 추상클래스이거나 인터페이스일
* 경우 발생하고, 또 하나의 예외는 클래스의 생성자가 접근제한자로 인해
* 접근할 수 없는 경우에 발생을 함. 따라서 예외 처리를 해 주어야 함.
*
* - 반환 타입은 Object 타입이므로 맞게 형변환을 해 주면 되지만,
* 클래스의 타입을 모르는 상태이므로 형변환을 해 줄 수가 없음.
* 이러한 문제를 해결하기 위해서 인터페이스를 사용하는 것임.
*
* - Class.forName(class 이름)은 파라미터로 받은 class 이름에
* 해당하는 클래스를 로딩한 후에 그 클래스에 해당하는 인스턴스를
* 리턴을 해 줌.
* newInstance() 메서드는 로딩한 클래스의 객체를 생성하는
* 메서드이고, 이렇게 생성된 객체를 동적 객체 생성이라고 함.
*/
// 동적으로 로딩된 클래스(객체)의 생성자(기본생성자)를 가져오는 메서드
Constructor<?> constructor = url.getConstructor(); // BoardListAction의 기본 생성자를 가져옴
// 가져온 기본생성자를 이용하여 newInstance() 메서드를 호출해
// 객체를 생성하는 메서드
action = (Action)constructor.newInstance();
// 비지니스 로직을 실행하는 메서드 호출
action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
action 패키지에 BoardListAction 클래스 생성
=============================코드=============================
package com.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.model.BoardDAO;
public class BoardListAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
// 요청 : 게시물 전체 목록을 보여달라고 요청
// 응답 : board 테이블의 전체 게시물 목록을 조회하여 view page로 이동시키는 비지니스 로직
// 이때 비지니스 로직 작업 시 페이징 처리 작업도 같이 진행
// 페이징 작업 진행
int rowsize = 3; // 한 페이지당 보여질 게시물의 수
int block = 3; // 아래에 보여질 페이지의 최대 블럭 수 ex) [1][2][3] / [4][5][6]
// board 테이블 상의 게시물의 전체 수
int totalRecord = 0;
// 전체 페이지 수
int allPage = 0;
// 현재 페이지 변수
int page = 0;
if(request.getParameter("page") != null) {
page = Integer.parseInt(request.getParameter("page").trim());
}else {
// 처음으로 main 페이지에서 "게시물 전체 목록" a 태그를 클릭한 경우
page = 1;
}
// 해당 페이지에서 시작 번호
int startNo = (page * rowsize) - (rowsize - 1);
// 해당 페이지에서 끝 번호
int endNo = (page * rowsize);
// 해당 페이지에서 시작 블럭
int startBlock = (((page - 1) / block) * block) + 1;
// 해당 페이지에서 끝 블럭
int endBlock = (((page - 1) / block) * block) + block;
BoardDAO dao = BoardDAO.getInstance();
// 전체 게시물 수를 확인하는 메서드 호출
dao.getBoardCount();
return null;
}
}
BoardDAO에 가서 BoardCount 메서드 생성
=============================코드=============================
// board 테이블의 전체 게시물 수를 확인하는 메서드
public int getBoardCount() {
int count = 0;
try {
openConn();
sql = "select count(*) from board";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConn(rs, pstmt, con);
}
return count;
}
BoardListAction 클래스로 가서 다시 작성
=============================코드=============================
package com.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.model.BoardDAO;
public class BoardListAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
// 요청 : 게시물 전체 목록을 보여달라고 요청
// 응답 : board 테이블의 전체 게시물 목록을 조회하여 view page로 이동시키는 비지니스 로직
// 이때 비지니스 로직 작업 시 페이징 처리 작업도 같이 진행
// 페이징 작업 진행
int rowsize = 3; // 한 페이지당 보여질 게시물의 수
int block = 3; // 아래에 보여질 페이지의 최대 블럭 수 ex) [1][2][3] / [4][5][6]
// board 테이블 상의 게시물의 전체 수
int totalRecord = 0;
// 전체 페이지 수
int allPage = 0;
// 현재 페이지 변수
int page = 0;
if(request.getParameter("page") != null) {
page = Integer.parseInt(request.getParameter("page").trim());
}else {
// 처음으로 main 페이지에서 "게시물 전체 목록" a 태그를 클릭한 경우
page = 1;
}
// 해당 페이지에서 시작 번호
int startNo = (page * rowsize) - (rowsize - 1);
// 해당 페이지에서 끝 번호
int endNo = (page * rowsize);
// 해당 페이지에서 시작 블럭
int startBlock = (((page - 1) / block) * block) + 1;
// 해당 페이지에서 끝 블럭
int endBlock = (((page - 1) / block) * block) + block;
BoardDAO dao = BoardDAO.getInstance();
// --------------------------여기서부터 작성 --------------------------
// 전체 게시물 수를 확인하는 메서드 호출
totalRecord = dao.getBoardCount();
// 전체 게시물 수를 한 페이지당 보여질 게시물의 수로 나누어 주면
// 전체 페이지 수가 나옴
allPage = (int)Math.ceil(totalRecord / (double)rowsize); // 둘다 int이기 때문에 한 쪽은 double로 형변환
if(endBlock > allPage) {
endBlock = allPage;
}
// 현재 페이지에 해당하는 게시물을 가져오는 메서드 호출
dao.getBoardList(page, rowsize);
return null;
}
}
BoardDAO 클래스에서 getBoardList 메서드 생성
=============================코드=============================
// board 테이블에서 현재 페이지에 해당하는 게시물을 조회하는 메서드
public List<BoardDTO> getBoardList(int page, int rowsize) {
List<BoardDTO> list = new ArrayList<BoardDTO>();
// 해당 페이지에서 시작 번호
int startNo = (page * rowsize) - (rowsize - 1);
// 해당 페이지에서 끝 번호
int endNo = (page * rowsize);
try {
openConn();
sql = "select * from"
+ "(select row_number() over(order by board_no desc) as rnum, b.* from board b)"
+ "where rnum >= ? and rnum <= ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, startNo);
pstmt.setInt(2, endNo);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardDTO dto = new BoardDTO();
dto.setBoard_no(rs.getInt("board_no"));
dto.setBoard_writer(rs.getString("board_writer"));
dto.setBoard_title(rs.getString("board_title"));
dto.setBoard_cont(rs.getString("board_cont"));
dto.setBoard_pwd(rs.getString("board_pwd"));
dto.setBoard_hit(rs.getInt("board_hit"));
dto.setBoard_date(rs.getString("board_date"));
dto.setBoard_update(rs.getString("board_update"));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConn(rs, pstmt, con);
}
return list;
}
*sql에서 최신순으로 번호 나열 하는 방법


1 ~ 3까지만 가져옴


다시 BoardListAction으로 가자
=============================코드=============================
package com.board.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.model.BoardDAO;
import com.board.model.BoardDTO;
public class BoardListAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
// 요청 : 게시물 전체 목록을 보여달라고 요청
// 응답 : board 테이블의 전체 게시물 목록을 조회하여 view page로 이동시키는 비지니스 로직
// 이때 비지니스 로직 작업 시 페이징 처리 작업도 같이 진행
// 페이징 작업 진행
int rowsize = 3; // 한 페이지당 보여질 게시물의 수
int block = 3; // 아래에 보여질 페이지의 최대 블럭 수 ex) [1][2][3] / [4][5][6]
// board 테이블 상의 게시물의 전체 수
int totalRecord = 0;
// 전체 페이지 수
int allPage = 0;
// 현재 페이지 변수
int page = 0;
if(request.getParameter("page") != null) {
page = Integer.parseInt(request.getParameter("page").trim());
}else {
// 처음으로 main 페이지에서 "게시물 전체 목록" a 태그를 클릭한 경우
page = 1;
}
// 해당 페이지에서 시작 번호
int startNo = (page * rowsize) - (rowsize - 1);
// 해당 페이지에서 끝 번호
int endNo = (page * rowsize);
// 해당 페이지에서 시작 블럭
int startBlock = (((page - 1) / block) * block) + 1;
// 해당 페이지에서 끝 블럭
int endBlock = (((page - 1) / block) * block) + block;
BoardDAO dao = BoardDAO.getInstance();
// 전체 게시물 수를 확인하는 메서드 호출
totalRecord = dao.getBoardCount();
// 전체 게시물 수를 한 페이지당 보여질 게시물의 수로 나누어 주면
// 전체 페이지 수가 나옴
allPage = (int)Math.ceil(totalRecord / (double)rowsize); // 둘다 int이기 때문에 한 쪽은 double로 형변환
if(endBlock > allPage) {
endBlock = allPage;
}
// ------------------------여기서부터 작성------------------------
// 현재 페이지에 해당하는 게시물을 가져오는 메서드 호출
List<BoardDTO> boardList = dao.getBoardList(page, rowsize);
// 페이징 작업 후에는 지금까지 페이징 처리 시 작업했던 모든 정보들을
// view page로 바인딩 시켜주어야 함
request.setAttribute("page", page);
request.setAttribute("rowsize", rowsize);
request.setAttribute("block", block);
request.setAttribute("totalRecord", totalRecord);
request.setAttribute("allPage", allPage);
request.setAttribute("startNo", startNo);
request.setAttribute("endNo", endNo);
request.setAttribute("startNo", startNo);
request.setAttribute("endBlock", endBlock);
request.setAttribute("List", boardList);
ActionForward forward = new ActionForward();
forward.setRedirect(false); // false일 경우 jsp로 이동 (*.jsp 페이지로 이동)
forward.setPath("view/board_list.jsp"); // 이동할 페이지 주소
return forward;
}
}
FrontController 로 가자
=============================코드=============================
package com.board.controller;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.action.Action;
import com.board.action.ActionForward;
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글 깨짐 방지 설정 작업 진행
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
// getRequestURI() : "/프로젝트명/파일명(*.go)" 라는 문자열을 반환해주는 메서드
String uri = request.getRequestURI();
System.out.println("URI >>> " + uri);
// getContextPath() : 현재 프로젝트명을 문자열로 반환해주는 메서드
String path = request.getContextPath();
System.out.println("Path >>> " + path);
String command = uri.substring(path.length() + 1); // 09_Member_MVC2/select.go =>16자리 이후를 뽑아냄(select.go 로 이동!)
System.out.println("Command >>> " + command);
Action action = null;
ActionForward forward = null;
Properties prop = new Properties();
FileInputStream fis =
new FileInputStream("C:\\NCS\\workspace(jsp)\\10_Board_Paging\\src\\main\\java\\com\\board\\controller\\mapping.properties");
prop.load(fis);
String value = prop.getProperty(command); // command는 key(select.go) / value 값을 가져옴
System.out.println("Value >>> " + value);
if(value.substring(0, 7).equals("execute")) {
StringTokenizer st = new StringTokenizer(value, "|"); // | 기준으로 잘라냄
String url_1 = st.nextToken(); // "execute"
String url_2 = st.nextToken(); // "패키지명.클래스명"
try {
Class<?> url = Class.forName(url_2);
//url.newInstance(); // 프로그램을 실행하면서 필요한 객체들을 생성해주는 역할
// 동적으로 로딩된 클래스(객체)의 생성자(기본생성자)를 가져오는 메서드
Constructor<?> constructor = url.getConstructor(); // BoardListAction의 기본 생성자를 가져옴
// 가져온 기본생성자를 이용하여 newInstance() 메서드를 호출해
// 객체를 생성하는 메서드
action = (Action)constructor.newInstance();
// 비지니스 로직을 실행하는 메서드 호출
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
// --------------------------여기서부터 작성--------------------------
}else {
// value에 들어온 값이 "execute|..."가 아닌 경우
forward = new ActionForward();
forward.setRedirect(false);
forward.setPath(value);
}
if(forward != null) {
if(forward.isRedirect()) { // true 인 경우
response.sendRedirect(forward.getPath());
}else { // false인 경우
// view page로 이동
request.getRequestDispatcher(forward.getPath()).forward(request, response);
}
}
}
}
view -> board_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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align = "center">
<hr width = "30%" color = "red">
<h3>BOARD 테이블 게시물 전체 리스트 페이지</h3>
<hr width = "30%" color = "red">
<br/><br/>
<table border = "1" width = "700">
<tr>
<td colspan = "4" align = "right">
전체 게시물 수 : ${totalRecord } 개
</td>
</tr>
<tr>
<th>게시글 No.</th> <th>게시글 제목</th> <th>게시글 조회수</th> <th>작성일자</th>
</tr>
<c:set var = "list" value = "${List }" />
<c:if test="${!empty list }">
<c:forEach items = "${list }" var = "dto">
<tr>
<td> ${dto.getBoard_no() } </td>
<td> ${dto.getBoard_title() } </td>
<td> ${dto.getBoard_hit() } </td>
<td> ${dto.getBoard_date().substring(0,10) } </td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty list }">
<tr>
<td colspan = "4" align = "center">
<h3>전체 게시물 리스트가 없습니다...</h3>
</td>
</tr>
</c:if>
</table>
</div>
</body>
</html>

전체 회원 목록 클릭

이제 페이징 처리를 해보자!
board_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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align = "center">
<hr width = "30%" color = "red">
<h3>BOARD 테이블 게시물 전체 리스트 페이지</h3>
<hr width = "30%" color = "red">
<br/><br/>
<table border = "1" width = "700">
<tr>
<td colspan = "4" align = "right">
전체 게시물 수 : ${totalRecord } 개
</td>
</tr>
<tr>
<th>게시글 No.</th> <th>게시글 제목</th> <th>게시글 조회수</th> <th>작성일자</th>
</tr>
<c:set var = "list" value = "${List }" />
<c:if test="${!empty list }">
<c:forEach items = "${list }" var = "dto">
<tr>
<td> ${dto.getBoard_no() } </td>
<td> ${dto.getBoard_title() } </td>
<td> ${dto.getBoard_hit() } </td>
<td> ${dto.getBoard_date().substring(0,10) } </td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty list }">
<tr>
<td colspan = "4" align = "center">
<h3>전체 게시물 리스트가 없습니다...</h3>
</td>
</tr>
</c:if>
</table>
<br/>
<input type = "button" value = "글쓰기" onclick = "location.href='insert.go'">
<br/><br/>
<%-- 페이징 처리 --%>
<c:if test="${page > block }">
<a href = "select.go?page=1">[처음으로]</a>
<a href = "select.go?page=${startBlock - 1 }">◀</a>
</c:if>
<c:forEach begin = "${startBlock }" end = "${endBlock }" var = "i">
<c:if test="${i == page }">
<b> <a href = "select.go?page=${i }" >[${i }]</a> </b>
</c:if>
<c:if test="${i != page }">
<a href = "select.go?page=${i }" >[${i }]</a>
</c:if>
</c:forEach>
<c:if test="${endBlock < allPage }">
<a href = "select.go?page=${endBlock + 1 }">▶</a>
<a href = "select.go?page=${allPage }">[맨 뒤로]</a>
</c:if>
</div>
</body>
</html>

맨 뒤로 클릭!
