JSP_8강_1_게시글_Paging

열라뽕따히·2024년 3월 26일

JSP

목록 보기
37/43

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 클래스로 가서 작성

Properties 클래스

  • java.util 패키지에 존재하는 클래스
  • Properties 클래스는 HashTable의 하위(자식) 클래스임
  • 보통은 환경변수 및 속성 값을 Properties 파일에 저장하여 쉽게 접근할 수 있는 장점이 있음
  • Properties 파일은 일련의 키(key) - 값(value)의 한 쌍으로 이루어져 있음
  • 보통은 파일에 저장을 하여 사용함. 파일 이름은 *.properties 라는 이름으로 끝나게 함
  • FileInputStream 클래스에 properties 파일을 인자로 넣어서 그 스트림으로부터 파일을 가져올 때 많이 사용함. 인자로 들어온 properties 파일을 읽게 됨
  • 읽어 들일 때 사용하는 메서드는 load() 라는 메서드를 이용하여 파일을 읽어 들이게 됨

=============================코드=============================

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>

=============================실행=============================

맨 뒤로 클릭!

0개의 댓글