이전 기사 직후 - 페이징 기술의 원칙과 페이징의 중요성과 방법 (i). 이 기사는 페이징 기술을 계속 분석합니다. 이전 기사는 간단한 원칙과 페이지 매김 기술의 소개에 대해 이야기합니다. 이 기사는 Pagination 기술의 코드 구현을 깊이 분석합니다.
마지막 기사에서 페이징의 가장 좋은 구현은 데이터베이스 계층에서 페이지를 페이지에 빠뜨리는 것이며 다른 데이터베이스마다 페이징 구현이 다릅니다. 예를 들어, Oracle은 3 층 SQL 중첩을 사용하여 페이징을 구현하고 MySQL은 한계 키워드를 사용하여 한계를 구현합니다 (이전 기사에서 언급).
이 기사는 Java + Oracle을 기반으로하며 코드 계층의 구현을 설명합니다 .
일반적으로 페이징에서 볼 수 있듯이 반환 된 쿼리 결과에는 쿼리 결과 세트 (목록)뿐만 아니라 총 페이지 수 (pagenum), 현재 페이지 (pageno) 및 기타 정보도 포함됩니다. 따라서 쿼리 결과 PageModel 클래스를 캡슐화하면 코드는 다음과 같습니다.
패키지 Kane; import java.util.list; public class pagemodel <e> {private list <e> 목록; 개인 intageno; Private int Pagesize; 개인 int totalnum; 개인 int totalpage; 공개 목록 <E> getList () {반환 목록; } public void setList (list <e> list) {this.list = list; } public int getPageno () {return pageno; } public void setpageno (int pageno) {this.pageno = pageno; } public int getPagesize () {return pagesize; } public void setPagesize (int pagesize) {this.pagesize = pagesize; } public int getTotalnum () {return totalnum; } public void settotalnum (int totalnum) {this.totalnum = totalnum; settoTalPage ((getTotalNum () % pagesize) == 0? } public int getTotalPage () {return totalpage; } public void settotalpage (int totalpage) {this.totalpage = TotalPage; } // 첫 페이지 가져 오기 공개 int getFirstPage () {return 1; } // 마지막 페이지 가져 오기 공개 int getLastPage () {return totalpage; } // 이전 페이지 가져 오기 public int getprepage () {if (pageno> 1) return pageno -1; 반환 1; } // 마지막 페이지 가져 오기 공개 int getbackpage () {if (pageno <TotalPage) return pageno + 1; 전체 페이지를 반환합니다. } // 마지막 페이지 가져 오기 공개 int getbackpage () {if (pageno <TotalPage) return pageno + 1; 전체 페이지를 반환합니다. } // '홈페이지'및 '첫 페이지'가 사용 가능 여부를 측정 공개 문자열 isprepable () {if (pageno == 1) return "disabled"; 반품 ""; } // '마지막 페이지'및 '다음 페이지'가 사용 가능 여부를 측정 공개 문자열 isbackable () {if (pageno == TotalPage) return "disabled"; 반품 ""; }} 제네릭의 사용은 페이징 클래스를 재사용 할 수 있도록하는 것입니다. 예를 들어, 사용자를 쿼리 할 때 사용자 객체를 캡슐화 할 수 있고 금융의 흐름 주문을 쿼리 할 때 Floward 클래스를 캡슐화 할 수 있습니다.
쿼리 사용자를 예로 들어갑니다. 사용자는 쿼리 조건을 선택하고 먼저 서블릿을 호출하여 쿼리 매개 변수를 얻은 다음 비즈니스 로직 계층을 요청하여 Paginated Accapsulation 결과 클래스를 얻습니다. 비즈니스 로직은 DAO 계층을 호출하여 결과 세트를 얻고 프로세스에서 레코드를 얻습니다. 프로세스의 레코드 수는 페이지 클래스에 캡슐화됩니다. 마지막으로 서블릿은 결과를 JSP 페이지로 표시하도록 설정합니다.
먼저 서틀을 설명해 보겠습니다. 코드는 다음과 같습니다.
패키지 Kane; import java.io.*; import java.util.*; import javax.servlet.servletconfig; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.httpervletrequest; import; Javax.servlet.http.http.httpervletresponse; import kane.userinfo; import kane.userinfomanage; import kane.pagemodel; public class userbasicsearchservlet httpservlet {private static final long serialversionuid = 1L; 개인 int pagesize = 0; @override public void init (servletconfig config) servletexception {pagesize = integer.parseint (config.getInitParameter ( "pagesize")); } @override protected void doget (httpservletrequest req, httpservletresponse resp) servletexception, ioexception {dopost (req, resp); } @override protected void dopost (httpservletrequest req, httpservletrepsonse resp) servletexception, ioexception {// 1. 페이지 매개 변수를 얻고 매개 변수 객체 int pageno = integer.parseint ( "pageno"); 문자열 sex = req.getParameter ( "성별"); 문자열 home = req.getParameter ( "Newlocation"); String College = Req.GetParameter ( "Colleage"); 문자열 다일 연도 = req.getParameter ( "Comingyear"); userInfo u = new userInfo (); U.setsex (섹스); U.Sethome (홈); U.SetColleage (동료); U.Setcy (Comingyear); // 2. 비즈니스 로직을 호출하여 결과 세트 userInfOmanage userInfOmanage = new userInfomanage (); pagemodel <userinfo> pagination = userInfomanage.userbasicsearch (u, pageno, pagesize); 목록 <userInfo> userList = pagination.getList (); // 3. RETURN RESTER result accaptulate StringBuffer resultxml = new StringBuffer (); try {resultxml.append ( "<? xml version = '1.0'encoding = 'gb18030'?>/n"); resultxml.append ( "<root>/n"); for (iterator <userInfo> iterator = userList.ITerator (); iterator .hasNext ();) {userInfo userInfo = iterator.next (); resultxml.append ( "<data>/n"); resultxml.append ( "/t <id>" + userInfo.getId () + "</id>/n"); resultxml.append ( "/t <truename>" + userInfo.getTruEname () + "</truename>/n"); resultxml.append ( "/t <sex>" + userInfo.getSex () + "</sex>/n"); resultxml.append ( "/t <home>" + userInfo.gethome () + "</home>/n"); resultxml.append ( "/t <home>" + userInfo.gethome () + "</home>/n"); resultxml.append ( "</data>/n"); } resultxml.append ( "<aperination>/n"); resultxml.append ( "/t <tant>" + pagination.getTotalPage () + "</total>/n"); resultxml.append ( "/t <start>" + pagination.getFirstPage () + "</start>/n"); resultxml.append ( "/t <end>" + pagination.getLastPage () + "</end>/n"); resultxml.append ( "/t <ageeno>" + Pagination.getPageno () + "</pageno>/n"); resultxml.append ( "</pagination>/n"); resultxml.append ( "</root>/n"); } catch (예외 e) {e.printstacktrace (); } writerSponse (req, resp, resultxml.toString ()); } public void writeresponse (httpservletrequest request, httpservletResponse 응답, 문자열 결과) IoException {response.setContentType ( "text/xml"); Response.SetHeader ( "Cache-Control", "No-Cache"); response.setheader ( "Content-Type", "text/xml; charset = gb18030"); printwriter pw = response.getwriter (); pw.write (결과); pw.close (); }} 사용자 객체 코드는 다음과 같습니다.
패키지 Kane; import java.util.date; public class userInfo {private int id; 개인 문자열 사용자 이름; 개인 문자열 비밀번호; 개인 문자열 truename; 개인 문자열 섹스; 개인 데이트 생일; 개인 문자열 집; 개인 문자열 대학; 올해 개인 문자열; public int getid () {return id; } public void setid (int id) {this.id = id; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; } public String getTrueName () {return truename; } public void settrueName (String truename) {this.truename = truename; } public String getSex () {return sex; } public void setsex (String sex) {this.sex = sex; } 공개 날짜 getBirthday () {return birthday; } public void setbirthday (날짜 생일) {this.birthday = 생일; } public String gethome () {return home; } public void sethome (String Home) {this.home = home; } public String getColleage () {return College; } public void setcolleage (문자열 동료) {this.colleage = College; } public String getcy () {return comingyear; } public void setcy (String Cy) {this. comingyear = cy; }} 다음은 비즈니스 로직 계층 코드이며 코드는 다음과 같습니다.
패키지 Kane; import java.sql.connection; import kane.dbutility; import kane.pagemodel; public class userInfoManage {private userInfodao userInfodao = null; public userInfOmanage () {userInfodao = new userInfodao (); } public pageModel <userInfo> userBasicSearch (userInfo u, int pageno, int pagesize) 예외 {connection connection = null; pagemodel <usterinfo> Pagination = 새로운 pagemodel <userInfo> (); try {connection = dbutility.getConnection (); dbutility.setAutocommit (연결, 거짓); Pagination.setList (userInfodao.getUserList (u, pageno, pagesize)); Pagination.setpageno (pageno); Pagination.setPagesize (pagesize); Pagination.settotalnum (userinfodao.gettotalnum (u)); dbutility.commit (Connection); } catch (예외 e) {dbutility.rollback (Connection); e.printstacktrace (); 새로운 예외 ()를 던지십시오. } 마침내 {dbutility.closeConnection (); } 반환 페이지 매김; }} 여기서 dbutility는 데이터베이스의 연결 캡슐화 클래스입니다.
마지막으로 DAO 계층 코드 구현은 다음과 같습니다.
패키지 Kane; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.arraylist; import java.util.list; import java.util.list; import kane.userin.userin.useerin.useerin.useerin.useerin.supo; userInfodao {public list <userInfo> getUserList (userInfo userInfo, int pageno, int pagesize)는 예외 {proadstatement pstmt = null; resultSet rs = null; List <UserInfo> userList = null; {string sql = "select * from (select rownum num, u. rownum <=?) 여기서 num> =? "; userList = new ArrayList <UserInfo> (); 연결 conn = dbutility.getConnection (); PSTMT = CONN.PREPARESTATEMENT (SQL); pstmt.setString (1, userInfo.getSex ()); pstmt.setint (2, pageno * pagesize); pstmt.setint (3, (pageno -1) * pagesize + 1); rs = pstmt.executeQuery (); while (rs.next ()) {userInfo user = new userInfo (); user.setid (rs.getint ( "id")); user.settrueName (rs.getString ( "truename")); user.setsex (rs.getstring ( "sex")); user.sethome (rs.getstring ( "home")); userList.Add (사용자); }} catch (sqlexception e) {e.printstacktrace (); 새로운 예외 (e)를 던지십시오. } 마침내 {dbutility.closeresultset (rs); dbutility.closepreparedStatement (PSTMT); } return userList; } public int getTotalnum (userInfo userInfo)은 예외 {proadstatement pstmt = null; resultSet rs = null; int count = 0; {string sql = "seel select count (*) where sex =? and home where 'and userinfo.gethome () +"%" +"'및 ' + userInfo.getCoLeage () + "%" + "'및 ' + userInfo.getcy () +" + "' '; 연결 conn = dbutility.getConnection (); PSTMT = CONN.PREPARESTATEMENT (SQL); pstmt.setString (1, userInfo.getSex ()); rs = pstmt.executeQuery (); if (rs.next ()) {count = rs.getint (1); }} catch (sqlexception e) {e.printstacktrace (); 새로운 예외 (e)를 던지십시오. } 마침내 {dbutility.closeresultset (rs); dbutility.closepreparedStatement (PSTMT); } 반환 수; }} 마지막으로 서블릿은 결과를 JSP 페이지에 표시하여 표시합니다.
참고 : dbutility 코드는 다음과 같이 데이터베이스 연결 작업을 캡슐화하는 코드입니다.
패키지 Kane; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexection; public static stride <con public static connection getConnection () {Connection conn = null; conn = threadlocal.get (); if (conn == null) {try {class.forname ( "oracle.jdbc.driver.oracledriver"); conn = drivermanager.getConnection ( "jdbc : oracle : thin : @localhost : 1521 : oracle", "admin", "admin"); ThreadLocal.set (Conn); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); }} return conn; } // 캡슐화 설정 연결을 자동으로 공개 정적 void setAutocommit (Connection Conn, boolean flag) {try {conn.setAutocommit (flag); } catch (sqlexception e) {e.printstacktrace (); }} // 트랜잭션 설정 커밋 공개 정적 무효 커밋 (Connection Conn) {try {conn.commit (); } catch (sqlexception e) {e.printstacktrace (); }} // 캡슐화 세트 연결 롤백 공개 정적 무효 롤백 (Connection Conn) {try {conn.rollback (); } catch (sqlexception e) {e.printstacktrace (); }} // 연결, prepartStatement 및 resultSet을 닫는 함수를 캡슐화 공개 static void closeConnection () {Connection Conn = ThreadLocal.get (); try {if conn! = null) {conn.close (); conn = null; ThreadLocal.remove (); }} catch (sqlexception e) {e.printstacktrace (); }} public static void closepreprepedstatement (proadestatement pstmt) {try {if (pstmt! = null) {pstmt.close (); pstmt = null; }} catch (sqlexception e) {e.printstacktrace (); }} public static void closeResultset (resultSet rs) {try {if (rs! = null) {rs.close (); rs = null; }} catch (sqlexception e) {e.printstacktrace (); }}} ThreadLocal은 트랜잭션의 일관성을 보장하는 데 사용되므로 동일한 스레드의 모든 데이터베이스 작업이 동일한 연결을 사용하도록합니다.
이 시점에서 간단한 코드 구현이 완료됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.