前の記事の直後 - ページングテクノロジーの原則と、ページングの重要性と方法(i)。この記事は、ページング技術を分析し続けています。前の記事では、ページネーション技術の単純な原則と導入について説明しています。この記事では、ページネーションテクノロジーのコード実装を深く分析します。
前回の記事では、ページングの最良の実装はデータベースレイヤーでページングすることであり、さまざまなデータベースには異なるページングの実装があります。たとえば、Oracleは3層SQLネストを使用してページングを実装し、MySQLはLimitキーワードを使用して制限を実装します(前の記事で述べられています)。
この記事はJava + Oracleに基づいており、コードレイヤーの実装について説明します。
通常、ページングで見られるように、返されたクエリ結果にはクエリ結果セット(リスト)が含まれるだけでなく、ページの総数(Pagenum)、現在のページ(Pageno)、その他の情報も含まれます。したがって、クエリ結果のPageModelクラスをカプセル化します。コードは次のとおりです。
パッケージKane; Import java.util.list; public class pagemodel <e> {private list <e> list; Private Int Pageno; Private int Pagesize; Private int totalNum;プライベートINT TotalPage; public List <e> getList(){return list; } public void setList(list <e> list){this.list = list; } public int getPageno(){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?(gettotalnum() / pagesize):( gettotalnum() / pagesize + 1)); } public int getTotalPage(){return totalpage; } public void settotalpage(int totalpage){this.totalpage = totalpage; } //最初のページを取得しますpublic int getFirstPage(){return 1; } //最後のページを取得しますpublic int getLastPage(){return totalpage; } //前のページを取得しますpublic int getPrepage(){if(pageno> 1)pageno -1を返します。返品1; } //最後のページを取得しますpublic int getBackPage(){if(pageno <totalpage)pageno + 1; TotalPageを返します。 } //最後のページを取得しますpublic int getBackPage(){if(pageno <totalpage)pageno + 1; TotalPageを返します。 } //「ホームページ」と「フロントページ」が利用可能かどうかを測定します戻る ""; } //「最後のページ」と「次のページ」が利用可能かどうかを測定しますpublic string isbackable(){if(pageno == totalpage)return "disabled";戻る ""; }}ジェネリックの使用は、ページングクラスを再利用できるようにすることです。たとえば、ユーザーをクエリする場合、ユーザーオブジェクトをカプセル化することができ、ファイナンスでフロー順序を照会する場合、フローカードクラスをカプセル化できます。
クエリユーザーを例として受け取ります。ユーザーはクエリ条件を選択し、最初にサーブレットを呼び出してクエリパラメーターを取得し、次にビジネスロジックレイヤーを要求して、パジネートされたカプセル化結果クラスを取得します。ビジネスロジックは、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.http.httpservletrequet; javax.servlet.http.httpservletresponse; Import kane.userinfo; import kane.userinfamanage; import kane.pagemodel; public class userbasics earcservlet {private static final long serialversionuid = 1l; private int pagesize = 0; @Override public void init(servletconfig config)servletexception {pagesize = integer.parseint(config.getInitParameter( "Pagesize")); } @Override Protected void doget(httpservletrequest req、httpservletresponse rep)servletexception、ioexception {dopost(req、rep); } @Override Protected void dopost(httpservletrequest req、httpservletresponse rep)servletexception、ioexception {// 1。ページパラメーターを取得し、pageno = integer.parseint(req.getparameter( "pageno"); string sex = req.getParameter( "gender"); string home = req.getParameter( "newlocation"); string college = req.getParameter( "Colleage"); string来年= req.getParameter( "comingyear"); userInfo u = new userInfo(); U.SetSex(Sex); U.Seethome(自宅); U.SetColleage(Colleage); U.Setcy(ComingYear); // 2。ビジネスロジックを呼び出して結果を取得しますuseriNfamanty usersfamanage = new UserInfamanage(); pagemodel <userinfo> pagination = userinfamanage.userbasicsearch(u、pageno、pageize); List <UserinInfo> userlist = pagination.getList(); // 3。return result stringbuffer resultxml = new StringBuffer(); try {resultxml.append( "<?xml version = '1.0' encoding = 'gb18030'?>/n"); resultxml.append( "<root>/n"); for(iterator <userininfo> 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( "<pagination>/n"); resultxml.append( "/t <total>" + pagination.gettotalpage() + "</total>/n"); resultxml.append( "/t <start>" + pagination.getFirstPage() + "</start>/n"); resultxml.append( "/t <end>" + pagination.getLastPage() + "</end>/n"); resultxml.append( "/t <pageno>" + pagination.getPageno() + "</pageno>/n"); resultxml.append( "</pagination>/n"); resultxml.append( "</root>/n"); } catch(Exception e){e.printstacktrace(); } writereponse(req、resp、resultxml.toString()); } public void WriterEpsons(httpservletrequest request、httpservletResponse応答、文字列結果)IoException {respons.setContentType( "text/xml"); Response.setheader( "Cache-Control"、 "no-cache"); Response.setheader( "content-type"、 "text/xml; charset = gb18030"); printwriter pw = respons.getWriter(); pw.write(result); pw.close(); }}ユーザーオブジェクトコードは次のとおりです。
パッケージKane; Import java.util.date; public class userinfo {private int id;プライベート文字列ユーザー名;プライベート文字列パスワード。プライベートストリングトゥルーネーム;プライベートストリングセックス;プライベートデートの誕生日;プライベートストリングホーム;プライベートストリングカレッジ;プライベートストリングは来年; 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(){パスワードを返します。 } public void setPassword(string password){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; } public date getBirthday(){return Birthday; } public void setbirthday(date Birthday){this.birthday = Birthday; } public string gethome(){return home; } public void sethome(string home){this.home = home; } public string getColleage(){return college; } public void setColleage(String Colleague){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 userInfaManage {private userinfodao userininfodao = null; public userInfaMANAGE(){userInfodao = new userInfodao(); } public PageModel <UserInfo> userbasicsearch(userinfo u、int pageno、int pagesize)スロー例外{接続接続= null; pagemodel <userinfo> pagination = new pagemodel <userinfo>(); try {connection = dbutility.getConnection(); dbutility.setautocommit(connection、false); pagination.setlist(userinfodao.getuserlist(u、pageno、pageize)); pagination.setpageno(pageno); pagination.setPagesize(Pagesize); pagination.settotalnum(userinfodao.gettotalnum(u)); dbutility.commit(connection); } catch(例外e){dbutility.rollback(connection); e.printstacktrace();新しい例外をスロー(); }最後に{dbutility.closeConnection(); } paginationを返します。 }}ここで、dbutilityはデータベースの接続カプセル化クラスです。
最後に、DAOレイヤーコードの実装は次のとおりです。
パッケージケイン; java.sql.connection; import java.sql.preparedStatement; Import java.sql.Resultset; Import java.sql.sqlecception; Import java.util.arraylist; Import java.util.list; Import java.util.util.util.ustil.ustil.ustil.ustil.userinfoのインポート; userInfodao {public list <UserInfo> getUserList(userInfo userInfo、int pageno、int pagesize)スロー例外{preatedStatement pstmt = null;結果rs = null; List <UserInfo> userlist = null; try {string sql = "select * from(select rownum num、u。 * from(select * from user_info where sex =?and home like '" + userinfo.gethome() + "%" + "' ''" + userinfo.getColleage() + "%" + "'' ' + userinfo.get.get. rownum <=?)ここで、num> =? "; userlist = new ArrayList <UserInfo>();接続conn = dbutility.getConnection(); pstmt = conn.preparestatement(sql); pstmt.setString(1、userinfo.getSex()); pstmt.setint(2、pageno * pageize); 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(user); }} catch(sqlexception e){e.printstacktrace();新しい例外をスロー(e); }最後に{dbutility.closeresultset(rs); dbutility.closepreparedStatement(PSTMT); } return userlist; } public int gettotalnum(userInfo userInfo)スロー例外{preatedStatement pstmt = null;結果rs = null; int count = 0; try {string sql = "select count(*)from user_info from sex =?and home like '" + userinfo.gethome() + "%" + "'およびcollege like '" + userinfo.getColleage() + " +"' '' '"接続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); } return count; }}最後に、サーブレットは結果をJSPページに戻して表示します。
注: dbutilityコードは、次のように、データベース接続操作をカプセル化するコードです。
パッケージケイン; java.sql.connection; Import java.sql.drivermanager; Import java.sql.preparedStatement; Import java.sql.Resultset; Import java.sql.sqlexception; public class dbutility {private statrelocal <connection> swreetlocal> new swreetlocal> 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; } //カプセル化設定接続は、public static void setautocommit(connection conn、boolean flag){try {conn.setautocommit(flag); } catch(sqlexception e){e.printstacktrace(); }} // transaction commit public static void commit(connection conn){try {conn.commit(); } catch(sqlexception e){e.printstacktrace(); }} //カプセル化の設定接続ロールバックpublic static void rollback(connection conn){try {conn.rollback(); } catch(sqlexception e){e.printstacktrace(); }} //接続、準備、結果を閉じる関数をカプセル化します。 try {if(conn!= null){conn.close(); conn = null; threadlocal.remove(); }} catch(sqlexception e){e.printstacktrace(); }} public static void closeprepreadStatement(preatedstatement 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をもっとサポートすることを願っています。