본문 바로가기

Java/JSP

7/11 서버에 커넥션 풀 등록, 페이징 처리 (7/10 실습 풀이), 모델 2(MVC)

forward 방식으로 index페이지에서 guestbook 폴더 안에 있는 경로로

<jsp:forward page="/guestbook/guestbook_list.jsp"/>

이렇게 전달하는 경우

URL 위치는 contextPath가 됨. 

 

redirect 방식인 경우

<% response.sendRedirect("guestbook/guestbook_list.jsp"); %>

URL은 http://localhost:8080/18_guest_book_answer/guestbook/guestbook_list.jsp

가 된다.

 

guestbook/guestbook_list.jsp 에서 

<form action="" method="post">

작성시 경로 주소는 전달 방식에 따라 바뀔 수 있음.

 


Class.forName("com.mysql.cj.jdbc.Driver");

Connection conn = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/digital_jsp",

"digital",

"12345"

);

웹프로그램에서는 드라이버 등록하기 위해서  Class.forName제외하면 안됨.

 


서버에 커넥션 풀 구현하는 경우 주의점!!


톰캣 서버 폴더에 lib 폴더에(C:\workspace\jsp\tomcat\lib) 드라이버 등록 해주어야함.(mysql-connector-j-8.0.33.jar)

이렇게 하면 프로젝트에 따로 lib 등록해줄 필요 x

 

servers 프로젝트 > tomcat > context.xml에 커넥션 풀 등록

 

<!-- Connection Pool = dataSource -->

<Resource

name="java/MySqlDB"

auth="container"

type="javax.sql.DataSource"

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

driverClassName="com.mysql.cj.jdbc.Driver"

url="jdbc:mysql://localhost:3306/digital_jsp"

username="digital"

password="12345"

initialSize="10"

/>

 

 

</Context>

실제 프로젝트에 사용 시 

 

DataSource ds = (DataSource)new InitialContext().lookup(

"java:comp/env/java/MySqlDB"

);

 

Connection conn = ds.getConnection();

System.out.println(conn);

if(conn != null){

conn.close();

}


paging block

 

쿼리문

 

-- limit 시작인덱스 번호, 한번에 보여줄 게시물 개수

SELECT * FROM test_guestbook ORDER BY id DESC

limit 10,10;

 

//요청이 들어온 페이지 1은 첫번째 페이지 그다음 페이지는 1씩 증가

int currentPage = 1;

// 한 페이지에 보여줄 게시물 개수

int pageCount = 10;

// 테이블에 pageCount 만큼 검색할 시작 인덱스 번호

int startRow = 0;

 

String paramPage = request.getParameter("page");

if(paramPage != null){

currentPage = Integer.parseInt(paramPage);

}

 

out.println("현재 요청 페이지 : " + currentPage);

 

// 1 page = (1-1)* 10 = 0;

// 2 page = (2-1)* 10 = 10;

startRow = (currentPage -1) * pageCount;

 

PreparedStatement pstmt = conn.prepareStatement(

"SELECT * FROM test_guestbook ORDER BY id DESC limit ?, ?"

);

// 검색 시작 인덱스 번호

pstmt.setInt(1,startRow);

// 읽어올 게시물 개수

pstmt.setInt(2,pageCount);

 

ResultSet rs = pstmt.executeQuery();

<!-- 방명록 정보에 따른 paging block 화면 출력 작성 -->

<%

Context context = new InitialContext();

DataSource ds = (DataSource)context.lookup("java:comp/env/java/MySqlDB");

 

conn = ds.getConnection();

// test_guestbook table에 저장된 전체 행의 개수

String sql = "SELECT count(*) FROM test_guestbook";

 

pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();

// 전체 게시물 개수

int totalCount = 0;

if(rs.next()){

totalCount = rs.getInt(1);

}

 

// 이동할 수 있는 최대 페이지 번호

// 130 : 130 / 10 = 13page

// 129 : 129 / 10 = 12.9 == 12 - 나머지 9개의 게시물을 보여줄 페이지가 없음

// 129 : 129 / 10 = 12.9 == 12+1 = 13page

// 130 : 130 / 10 = 13page+1 == 14page

// 130 : (130-1) / 10 = 12+1 == 13page

// 131 : (131-1) / 10 = 13+1 == 14page

int maxPage = (totalCount-1) / pageCount + 1 ;

 

if(rs != null){

rs.close();

}

if(pstmt != null){

pstmt.close();

}

if(conn != null){

conn.close();

}

 

// 페이지 번호 출력

for(int i = 1; i <= maxPage; i++){

%>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=<%=i%>">[<%=i%>]</a>

<%

}

%>

<!-- 방명록 정보에 따른 paging block 화면 출력 end-->


페이지 번호도 페이징 처리를 해보자!


// 현재 요청페이지에서 보여줄 시작 페이지 번호

int startPage = 0;

// 현재 요청페이지에서 보여줄 마지막 페이지 번호

int endPage = 0;

// 한번에 보여줄 페이지 번호 개수

int displayPageNum = 5;

 

// [1][2][3][4][5] 1~5페이지는 동일한 페이지 번호 출력

// [6][7][8][9][10] 6~10 페이지는 동일한 번호 출력

// 시작페이지 번호

// 1page : (1-1) / 5 * 5 + 1 == 1;

// 5page : (5-1) / 5 * 5 + 1 == 1;

// 6page : (6-1) / 5 * 5 + 1 == 6;

// 10page : (10-1) / 5 ==1.8 == 1 * 5 ==5 + 1 == 6;(자바int연산은 소수점 버림)

startPage = (currentPage -1 ) / displayPageNum * displayPageNum + 1;

//출력된 마지막 페이지 번호

endPage = startPage + (displayPageNum -1);

System.out.println("maxPage : "+maxPage);

System.out.println("endPage : "+endPage);

// endPage가 maxPage를 벗어나면 endPage를 maxPage로 변경

if(endPage > maxPage){

endPage = maxPage;

}

 

if(startPage != 1){

%>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=1">[처음]</a>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=<%=startPage-1%>">[이전]</a>

 

<%

}

 

// 페이지 번호 출력

for(int i = startPage; i <= endPage; i++){

%>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=<%=i%>">[<%=i%>]</a>

<%

}

if(endPage < maxPage){

%>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=<%=endPage+1%>">[다음]</a>

<a href="<%=path%>/guestbook/guestbook_list.jsp?page=<%=maxPage%>">[마지막]</a>

<%

}

%>

<!-- 방명록 정보에 따른 paging block 화면 출력 end-->


MVC로 구현해보자


 

// 내부에서만 사용하는 계산메소드

private void calcPaging() {

// paging 정보 출력에 필요한 필드 연산

// 1 / 5.0 == 0.2(올림=1) * 5 = 5

// 5 / 5.0 == 1.0(올림=1) * 5 = 5

// 6 / 5.0 == 1.2(올림=2) * 5 = 10

endPage = (int)Math.ceil(cri.getPage() / (double)displayPageNum)*displayPageNum;

startPage = (endPage - displayPageNum) + 1;

// 140 / 10 = 14.0(14) == 14page

// 141 / 10 = 14.1(15) == 15page

maxPage = (int)Math.ceil(totalCount / (double)cri.getPerPageNum());

if(endPage > maxPage) {

endPage = maxPage;

}

 

prev = (startPage != 1) ? true : false;

next = (endPage == maxPage) ? false : true;

 

}