참고 : 나는 온라인으로 다양한 페이징을 보았습니다. 그 중 다수는 일반적인 것으로 주장하지만 종종 만족스럽지 않습니다. 일부는 페이징 클래스에 URL 주소 정보를 추가하고 일부는 페이징 클래스에서 페이징 작업을 수행합니다 (이 작업은 전적으로 데이터베이스 운영 문제입니다). 이제 요약과 정제 후 :
수동으로 자신을 페이징하거나 프레임 워크의 도움을 사용하는지 여부. 이 도구 클래스는 안정적인 페이징 효과 (탐색 페이지 번호 매기기 함수 포함)를 달성하는 데 도움이 될 수 있으며 사용 방법은 비교적 간단합니다. OK, 덜 말도 안되는 코드는 다음과 같습니다.
패키지 테스트 .DAO; Java.util.list 가져 오기; / *** Pagination 용 도구 클래스* @Author Not Name*/ Public Class Pager <T> {Private List <T> 목록; // 객체 레코드 결과 세트 개인 int total = 0; // 총 레코드 개인 int 한도 = 20; // 페이지 당 표시되는 레코드 수 개인 int 페이지 = 1; // 총 페이지 프라이빗 int pagenumber = 1; // 현재 페이지 개인 부울 ISFIRSTPAGE = FALSE; // 첫 번째 페이지이든 개인 부울 islastpage = false; // 마지막 페이지이든 개인 부울 haspreviouspage = false; // 이전 페이지가 있습니까? 개인 부울 hasnextpage = false; // 다음 페이지가 있습니까? 비공개 int navigationPages = 8; // 탐색 페이지 번호 개인 int [] NavigationPagenumbers; // 모든 탐색 페이지 번호 공개 호출기 (int total, int pagenumber, limit); } public Pager (int total, int pagenumber, int limit) {init (Total, pagenumber, Limit); } private void init (int total, int pagenumber, int limit) {init (Total, pagenumber, Limit); } private void init (int total, int pagenumber, int limit) {// 기본 매개 변수를 설정 this.total = total; this.limit = 한계; this.pages = (this.total-1)/this.limit+1; // (pagenumber <1) {this.pagenumber = 1; } else if (pagenumber> this.pages) {this.pagenumber = this.pages; } else {this.pagenumber = pagenumber; } // 기본 매개 변수를 설정 한 후 내비게이션 페이지를 계산하십시오. compnavigatePagenumbers (); // 페이지 경계의 결정뿐만 아니라 judgepageBoudary (); } /*** 탐색 페이지를 계산* /개인 void calcnavigatePagenumbers () {// 총 페이지 수가 내비게이션 페이지 수와 같거나 동일 할 때 (pages <= aviGatePages) {navigatePagEnumbers = new int [pages]; for (int i = 0; i <pages; i ++) {avigatePagenumbers [i] = i+1; }} else {// 총 페이지 수가 탐색 페이지 수보다 큰 경우 avigatePagEnumbers = new int [avigatePages]; int startnum = pagenumber-navigatePages/2; int endnum = pagenumber+avigatePages/2; if (startnum <1) {startnum = 1; // (int i = 0; i <navigatePages; i ++) {avigatePagEnumbers [i] = startnum ++;}} else if (endnum> pages) {endnum = pages; // 마지막 avigatePages 페이지 (int i = aviGatePages-1; i> = 0;) {avigatePagenumbers [i] re. } else {int i = 0; i <avigatePages; i ++) {avigatePagEnumbers [i] = startnum ++; haspreviouspage = pageNxtpage = pagenumber <pages} public void setlist (this.list = list); getTotal () {return total} / *** 페이지 당 얼마나 많은 레코드가 표시됩니다. @return {reture getLimit () {return}; Pagenumbe; {haspreviouspage; .Append ( ", pagenumber ="). Append (pagenumber) .Append ( ", limit ="). Append (lempend (leme) . ", hasnextpage ="). Append (hasnextPage). "+avigatePagenumbers [i]);} sb.append (", list.size = "+list.size ()); sb.append ("] "); return sb.toString ();}} 사용법 : 단계는 다음과 같습니다.
1). 조건부 쿼리가 사용되는지 여부에 관계없이 먼저 해당 총 항목 수를 계산하십시오.
2). 호출기 클래스 구성 (한계 매개 변수는 자체 전경에 따라 만들 수 있습니다).
3). 구성된 호출기 클래스에 따라 자동으로 수정 된 Pagenumber 매개 변수를 얻고 -1을 곱하고 제한하여 쿼리 할 첫 번째 레코드의 위치로 사용됩니다.
4). 모든 레코드를 시작 위치에서 한도까지 확인하도록 설정하십시오. (수동으로 페이징을하는 경우 두 번째 매개 변수는 데이터베이스에 따라 최종 레코드의 위치 오프셋 일 수도 있습니다).
5). [조건]에 의해 쿼리 된 목록을 호출기 개체로 설정하고 반환하십시오.
6). 프레젠테이션 레이어에서는 서블릿 또는 동작을 통해이 페이지 객체를 사용하거나 호출기 개체를 직접 가져올 수 있습니다. URL을 접합시키는 특정 문제도 프레젠테이션 계층에 맡겨야합니다.
int totalcount = integer.valueof (QueryCount.uniqueresult (). toString ()); Pager Pager = New Pager (TotalCount, Pagenumber, Limit); QueryList.setFirstresult ((Pager.GetPagenumber () -1)*한계); // 결함-방해 처리 QueryList.SetMaxResults (Limit); Pager.setList (QueryList.List ()); 리턴 호출기;
위의 코드는 최대 절전 모드를 사용하는 간단한 예입니다. 수동 페이지를 사용하는 경우 사용하려면 단계를 따라야합니다.
물론, 페이지 매김은 DAO 계층 또는 서비스 계층에서 완료 될 수 있습니다. 서블릿 또는 조치는 서비스 계층 코드를 호출합니다. 개인적으로, 나는 다음과 같이 생각합니다. 페이징은 실제로 비즈니스 요구이므로 비즈니스 수준에 배치 할 수 있습니다. DAO 계층은 해당 [조건 쿼리] 목록 및 [조건] 통계 카운트를 제공하기 때문에 비즈니스 계층은 자체 요구에 따라 메소드 호출을 할 수 있습니다 (물론 비즈니스는 프로세스 단계를 설정했습니다).
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.