자바 웹 필기 페이지 기능 구현

현재 많은 유행 하 는 프레임 워 크 는 페이지 효 과 를 빠르게 만 들 수 있 지만 프로그래머 로 서 손 으로 페이지 를 나 누 는 절 차 를 알 아야 합 니 다.
필드 효과:

1.페이지 별 사고
먼저 우 리 는 페이지 코드 를 쓰 는 사고방식 을 알 고 사고방식 을 명확 하 게 유지 해야만 흐 르 는 물 처럼 코드 를 쓸 수 있다.사실은 어떤 코드 를 쓰 든 사고방식,사상 이 특히 중요 하 다.먼저 잘 생각 한 다음 에 착수 하면 적은 노력 으로 큰 효 과 를 거 둘 수 있다.
먼저 SQL 문 구 를 분석 하여 실현 합 니 다.

Select * from product limit 0 ,5
Select * from product limit 5 ,5
Select * from product limit 10 ,5
Select * from product limit 15 ,5
\#현재 페이지 시작 값 페이지 당 데이터 크기
1 0 5
2 5 5
3 10 5
4 15 5
결론:
(1)(현재 페이지-1)*(페이지 당 수량)=시작 값
(2)페이지 를 나 누 려 면 서버 에 요청 할 때 현재 페이지 를 전달 해 야 합 니 다.
2.PageBean 저장 데이터 만 들 기
이때 우 리 는 우리 의 페이지 데 이 터 를 포장 하기 위해 포장 류 를 포장 해 야 한다.

package cn.itcast.store.domain;
import java.util.List;
/**
 *          
 *
 * @author yechengchao
 */
public class PageModel {
 //    
 /**    ,      */
 private int currentPageNum;
 /**       ,              */
 private int pageSize =5;
 /**     ,        */
 private int totalRecords;
 /**   ,      */
 private int totalPageNum;
 /**         ,      (   -1)*(    )=    */
 private int startIndex;
 /**    */
 private int prePageNum;
 /**    */
 private int nextPageNum;
 /**         ,           */
 private List list;
 
 /**    
       9     */
 /**    */
 private int startPage;
 /**    */
 private int endPage;
 
 /**    */
 private String url;
 

 /**        ,        。        ,         */
 public PageModel(int currentPageNum,int totalRecords,int pageSize){
 this.currentPageNum = currentPageNum;
 this.totalRecords = totalRecords;
 this.pageSize=pageSize;
 
 //           
 startIndex = (currentPageNum-1)*pageSize;
 //     
 totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);
 
 //5
 startPage = currentPageNum - 4;
 //    
 endPage = currentPageNum + 4;
 //        9 
 if(totalPageNum>9){
 //   9 
 if(startPage < 1){
 startPage = 1;
 endPage = startPage+8;
 }
 if(endPage>totalPageNum){
 endPage = totalPageNum;
 startPage = endPage-8;
 }
 }else{
 //  9 
 startPage = 1;
 endPage = totalPageNum;
 }
 }

 public String getUrl() {
 return url;
 }

 public void setUrl(String url) {
 this.url = url;
 }
 
 public int getStartPage() {
 return startPage;
 }

 public void setStartPage(int startPage) {
 this.startPage = startPage;
 }

 public int getEndPage() {
 return endPage;
 }
 public void setEndPage(int endPage) {
 this.endPage = endPage;
 }
 public int getPrePageNum() {
 prePageNum = currentPageNum-1;
 if(prePageNum<1){
 prePageNum = 1;
 }
 return prePageNum;
 }
 public int getNextPageNum() {
 nextPageNum = currentPageNum+1;
 if(nextPageNum>totalPageNum){
 nextPageNum = totalPageNum;
 }
 return nextPageNum;
 }
 public int getCurrentPageNum() {
 return currentPageNum;
 }
 public void setCurrentPageNum(int currentPageNum) {
 this.currentPageNum = currentPageNum;
 }
 public int getPageSize() {
 return pageSize;
 }
 public void setPageSize(int pageSize) {
 this.pageSize = pageSize;
 }
 public int getTotalRecords() {
 return totalRecords;
 }
 public void setTotalRecords(int totalRecords) {
 this.totalRecords = totalRecords;
 }
 public int getTotalPageNum() {
 return totalPageNum;
 }
 public void setTotalPageNum(int totalPageNum) {
 this.totalPageNum = totalPageNum;
 }
 public int getStartIndex() {
 return startIndex;
 }
 public void setStartIndex(int startIndex) {
 this.startIndex = startIndex;
 }
 public void setPrePageNum(int prePageNum) {
 this.prePageNum = prePageNum;
 }
 public void setNextPageNum(int nextPageNum) {
 this.nextPageNum = nextPageNum;
 }
 public List getList() {
 return list;
 }
 public void setList(List list) {
 this.list = list;
 }
}
3.servlet 에서 제어 코드 를 작성 합 니 다.
먼저 사용자 가 요청 을 보 내 고 현재 페이지 수 를 가 져 옵 니 다.이 표 에서 업무 층 의 코드 를 호출 하여 페이지 별로 상품 을 조회 한 다음 에 상품 을 조회 한 후에 우리 가 만 든 pageModel 대상 에 게 값 을 부여 합 니 다.이때 이 대상 을 전단 페이지 로 전송 하면 값 을 꺼 내 페이지 를 나 눌 수 있 습 니 다.

public String findProductByCidWithPage(HttpServletRequest request, HttpServletResponse response) throws Exception {
 //  cid,num
 String cid=request.getParameter("cid");
 int curNum=Integer.parseInt(request.getParameter("num"));
 //        :                  
 //  PageModel  (1       2  3 url)
 ProductService productService=new ProductServiceImp();
 PageModel pm=productService.findProductByCidWithPage(cid,curNum);
 // PageModel    request
 request.setAttribute("page", pm);
 //   /jsp/product_list.jsp
 return "/jsp/product_list.jsp";
 }
4.비 즈 니스 계층 service 는 비 즈 니스 논리 코드 를 작성 합 니 다.
업무 층 의 업무 논 리 를 호출 할 때 여기 서 우 리 는 Dao 층 을 통 해 우리 가 조회 하고 자 하 는 상품 을 조회 하여 하나의 list 로 받 은 다음 에 pageModel 의 속성 list 에 전달 합 니 다.이때 전체 pageModel 대상 을 전송 합 니 다.여 기 는 주로 Dao 층 조회 와 관련 집합,관련 URL 을 호출 합 니 다.

public PageModel findProductByCidWithPage(String cid, int curNum) throws Exception {
 //1   pageModel     :      
 
 //             select count(*) from product where cid=?
 int totalRecords=productDao.findtotalRecords(cid);
 PageModel pageModel=new PageModel(curNum, totalRecords, 12);
 //2.     select * form product where cid=? limit ?,?
 List list=productDao.findProductByCidWithPage(cid,pageModel.getStartIndex(),pageModel.getPageSize());
 pageModel.setList(list);
 //3.  url
 pageModel.setUrl("ProductServlet?method=findProductByCidWithPage&cid="+cid);
 return pageModel;
 }
5.Dao 층 작업 데이터베이스
왜 우 리 는 처음에 sql 문 구 를 분석 해 야 합 니까?가장 근원 은 바로 여기 서 데이터 베 이 스 를 조회 하 는 것 입 니 다.우 리 는 시작 페이지 와 페이지 크기 를 전송 해 야 합 니 다.

public List findProductByCidWithPage(String cid, int startIndex, int pageSize) throws Exception {
 String sql="select * from product where cid=? limit ?,?";
 QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
 return qr.query(sql, new BeanListHandler<Product>(Product.class),cid,startIndex,pageSize);
 }
6.전단 페이지,페이지 표시

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 <%--        --%>
 <div style="text-align:center">
  ${page.totalPageNum} / ${page.currentPageNum} 
 
 <a href="${pageContext.request.contextPath}/${page.url}&num=1" rel="external nofollow" >  </a>
 <a href="${pageContext.request.contextPath}/${page.url}&num=${page.prePageNum}" rel="external nofollow" >   </a>
 <%--     ,  forEach        --%>
 <c:forEach begin="${page.startPage}" end="${page.endPage}" var="pagenum">
 <a href="${pageContext.request.contextPath}/${page.url}&num=${pagenum}" rel="external nofollow" >${pagenum}</a>
 </c:forEach>
 
 <a href="${pageContext.request.contextPath}/${page.url}&num=${page.nextPageNum}" rel="external nofollow" >   </a>
 <a href="${pageContext.request.contextPath}/${page.url}&num=${page.totalPageNum}" rel="external nofollow" >  </a>
 <input type="text" id="pagenum" name="pagenum" size="1"/><input type="button" value="  " onclick="jump()" />
 <script type="text/javascript">
 function jump(){
 var totalpage = ${page.totalPageNum};
 var pagenum = document.getElementById("pagenum").value;
 //          
 var reg =/^[1-9][0-9]{0,1}$/;
 if(!reg.test(pagenum)){
 //        
 alert("          ");
 return ;
 }
 //              
 if(parseInt(pagenum)>parseInt(totalpage)){
 //      
 alert("       ");
 return;
 }
 //       Servlet
 window.location.href="${pageContext.request.contextPath}/${page.url}&num=" rel="external nofollow" +pagenum;
 }
 </script>
 </div>
 <%--       --%>
우리 가 필요 로 하 는 모든 데 이 터 를 pageModel 에 봉 인 했 기 때문에 pageModel 대상 은 request 필드 에 있 습 니 다.그래서 jsp 페이지 에서 우 리 는 우리 가 필요 로 하 는 데 이 터 를 받 아서 표시 하면 됩 니 다.구조 내 비게 이 션 도 는 주의해 야 할 점 이 있 습 니 다.논 리 는 무엇 을 표시 하고 싶 지 않 은 지,전체 화면 이 스스로 제어 하고 한 가지 만 기억 해 야 합 니 다.Servlet 을 요청 할 때 요청 한 페이지 를 서버 에 넘 겨 야 합 니 다.그렇지 않 으 면 서버 는 네가 몇 페이지 의 데 이 터 를 얻 으 려 고 하 는 지 모른다.
총결산
사실 페이지 를 나 누 는 것 도 어렵 지 않 습 니 다.어 려 운 점 은 자바 빈 의 구축 입 니 다.pageModel 에 어떤 속성 이 필요 한 지,각종 속성의 역할 이 무엇 인지 알 면 분명 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기