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;
}
'Java > JSP' 카테고리의 다른 글
7.14 JSTL() (0) | 2023.07.14 |
---|---|
7.13 웹 MVC, EL, 스탠다드 태그 라이브러리 (0) | 2023.07.13 |
07.10 connection pool (7.7 실습문제 풀이) (0) | 2023.07.10 |
07.07 JDBC와 JSP연동 (0) | 2023.07.07 |
07.06 JSP 실습문제 풀이, 에러페이지 , 간단한 양방향 암호화 (0) | 2023.07.06 |