Segera setelah artikel sebelumnya - prinsip -prinsip teknologi paging dan signifikansi dan metode paging (i). Artikel ini terus menganalisis teknologi paging. Artikel sebelumnya berbicara tentang prinsip -prinsip sederhana dan pengenalan teknologi pagination. Artikel ini sangat menganalisis implementasi kode teknologi pagination.
Dalam artikel terakhir, implementasi paging terbaik adalah memberi paginat pada lapisan database, dan database yang berbeda memiliki implementasi paging yang berbeda. Misalnya, Oracle menggunakan sning sql tiga lapis untuk mengimplementasikan paging, dan MySQL menggunakan kata kunci batas untuk mengimplementasikan batas (disebutkan dalam artikel sebelumnya).
Artikel ini didasarkan pada Java + Oracle dan menjelaskan implementasi lapisan kode .
Seperti yang biasanya kita lihat dalam paging, hasil kueri yang dikembalikan tidak hanya mencakup set hasil kueri (daftar), tetapi juga mencakup jumlah total halaman (pagenum), halaman saat ini (pageno), dan informasi lainnya. Oleh karena itu, kami merangkum kelas pagemodel hasil kueri, kodenya adalah sebagai berikut:
Paket Kane; import java.util.list; kelas publik pagemodel <e> {daftar private <e>; private int pageno; halaman int private; TotalNum int pribadi; Totalpage int pribadi; Daftar Publik <E> getList () {daftar kembali; } public void setList (Daftar <E> Daftar) {this.list = daftar; } 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 () % halaman) == 0? (getTotalNum () / pageSize): (getTotalNum () / pagesze + 1)); } public int getTotalPage () {return TotalPage; } public void setTotalPage (int totalPage) {this.totalPage = totalPage; } // Dapatkan halaman pertama int int getFirstPage () {return 1; } // Dapatkan halaman terakhir int getLastPage publik () {return totalPage; } // Dapatkan halaman sebelumnya int getPrepage publik () {if (pageno> 1) return pageno - 1; kembali 1; } // Dapatkan halaman terakhir int getBackPage publik () {if (pageno <totalpage) return pageno + 1; pengembalian totalpage; } // Dapatkan halaman terakhir int getBackPage publik () {if (pageno <totalpage) return pageno + 1; pengembalian totalpage; } // Ukur apakah 'Halaman Beranda' dan 'Halaman Depan' tersedia Public String ISPREABLE () {if (pageno == 1) return "dinonaktifkan"; kembali ""; } // Ukur apakah 'halaman terakhir' dan 'halaman berikutnya' tersedia public string isbackable () {if (pageno == totalpage) return "dinonaktifkan"; kembali ""; }} Penggunaan obat generik adalah untuk memungkinkan kelas paging digunakan kembali. Misalnya, saat meminta pengguna, objek pengguna dapat dienkapsulasi, dan ketika menanyakan pesanan aliran di keuangan, kelas kartu aliran dapat dienkapsulasi.
Kami menganggap pengguna kueri sebagai contoh. Pengguna memilih kondisi kueri, hubungi terlebih dahulu servlet untuk mendapatkan parameter kueri, dan kemudian minta lapisan logika bisnis untuk mendapatkan kelas hasil enkapsulasi paginated. Logika bisnis memanggil lapisan DAO untuk mendapatkan set hasil dan mendapatkan catatan dalam proses. Jumlah catatan dalam proses dienkapsulasi ke dalam kelas halaman. Akhirnya, Servlet menetapkan hasilnya ke halaman JSP untuk ditampilkan.
Pertama, mari kita jelaskan servlet, kodenya adalah sebagai berikut:
Paket Kane; import java.io.*; import java.util.*; import javax.servlet.servletconfig; import javax.servlet.servletException; import javax.servlet.http.httpservlet; impor javax.servlet.http.httpservet; javax.servlet.http.httpservletResponse; impor kane.userinfo; impor Kane.userinfomanage; impor Kane.pagemodel; Public Class UserBasicsearchSerVlet meluas httpservlet {private static final SerialVersionuid final final static long serialVersionuid = 1L; private int pageSize = 0; @Override public void init (servletConfig config) melempar servletException {pagesize = integer.parseint (config.getInitparameter ("pageSize")); } @Override Protected void doGet (httpservletRequest req, httpservletResponse resp) melempar servletException, ioException {dopost (req, resp); } @Override Protected void dopost (httpservletRequest req, httpservletresponse resp) melempar servletException, ioException {// 1. Dapatkan parameter halaman dan buat parameter objek int pageno = integer.parseint (req.getparameter ("pageno (" pageno ("pageno"); String sex = req.getParameter ("gender"); Home home = req.getParameter ("newlocation"); String college = req.getParameter ("colleage"); String Coming Year = Req.GetParameter ("ComingYear"); UserInfo u = UserInfo baru (); u.ssex (seks); u.sethome (rumah); u.setColleAge (colleage); u.setcy (comingyear); // 2. Call Business Logic untuk mendapatkan hasil yang ditetapkan UserInfomanage userInfomanage = new userInfomanage (); Pagemodel <UserInfo> pagination = userInfomanage.userbasicsearch (u, pageno, halaman); Daftar <UserInfo> userList = pagination.getList (); // 3. coba {resultxml.append ("<? Xml Version = '1.0' encoding = 'GB18030'?>/n"); resultxml.append ("<soot>/n"); untuk (iterator <UserInfo> iterator = userList.iterator (); iterator .hasnext ();) {userInfo userInfo = iterator.next (); resultxml.append ("<data>/n"); resultxml.append ("/t <d>" + userInfo.getId () + "</d>/n"); resultxml.append ("/t <truename>" + userInfo.gettrueName () + "</truename>/n"); resultxml.append ("/t <sex>" + userInfo.getSex () + "</selens>/n"); resultxml.append ("/t <home>" + userInfo.getHome () + "</tome>/n"); resultxml.append ("/t <home>" + userInfo.getHome () + "</tome>/n"); resultxml.append ("</data>/n"); } resultxml.append ("<pagination>/n"); resultxml.append ("/t <t total>" + pagination.gettotalpage () + "</ttttle>/n"); resultxml.append ("/t <darin>" + pagination.getFirstPage () + "</etting>/n"); resultxml.append ("/t <det>" + pagination.getLastPage () + "</deng>/n"); resultxml.append ("/t <pageno>" + pagination.getPageno () + "</pageno>/n"); resultxml.append ("</pagination>/n"); resultxml.append ("</soot>/n"); } catch (Exception e) {E.PrintStackTrace (); } writer response (req, resp, resultxml.toString ()); } public void writerSponse (permintaan httpservletRequest, respons httpservletResponse, hasil string) melempar ioException {response.setContentType ("Text/XML"); response.setheader ("cache-control", "no-cache"); response.setHeader ("tipe konten", "teks/xml; charset = GB18030"); Printwriter pw = response.getWriter (); pw.write (hasil); pw.close (); }} Kode objek pengguna adalah sebagai berikut:
Paket Kane; import java.util.date; kelas publik userInfo {private int id; nama pengguna string pribadi; kata sandi string pribadi; Private String Truename; seks string pribadi; ulang tahun kencan pribadi; rumah string pribadi; perguruan tinggi string pribadi; tahun mendatang string pribadi; publik int getId () {return id; } public void setid (int id) {this.id = id; } string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; } 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; } tanggal publik getBirthday () {kembali ulang tahun; } public void setBirthday (tanggal ulang tahun) {this.birthday = ulang tahun; } public String getHome () {return home; } public void setHome (string home) {this.home = home; } public string getColleAge () {return college; } public void setColleAge (kolega string) {this.colleAge = college; } public string getCy () {return comingyear; } public void setcy (string cy) {this. ComingYear = cy; }} Berikutnya adalah kode lapisan Logika Bisnis, kodenya adalah sebagai berikut:
Paket Kane; import java.sql.connection; impor Kane.dbutility; impor Kane.pagemodel; kelas publik UserInfomanage {private userinfodao userinfodao = null; Public UserInfomanage () {userInfodao = UserInfodao baru (); } pagemodel publik <UserInfo> userbasicsearch (userInfo u, int pageno, int pageSize) melempar pengecualian {koneksi koneksi = null; Pagemodel <UserInfo> pagination = pagemodel baru <UserInfo> (); coba {connection = dbutility.getConnection (); Dbutility.setAutocommit (koneksi, false); pagination.setList (userInfodao.getUserList (u, pageno, halaman)); pagination.setpageno (pageno); pagination.setPagesze (halaman); pagination.setTotalNum (userinfodao.gettotalnum (u)); Dbutility.commit (koneksi); } catch (Exception e) {dbutility.rollback (koneksi); e.printstacktrace (); Lempar pengecualian baru (); } akhirnya {dbutility.closeConnection (); } mengembalikan pagination; }} Di mana dbutilitas adalah kelas enkapsulasi koneksi dari database.
Akhirnya, implementasi kode lapisan DAO adalah sebagai berikut:
Paket Kane; impor java.sql.connection; impor java.sql.preparedstatement; impor java.sql.Resultset; impor java.sql.sqlexception; impor java.util.raylist; impor java.util.list; impor java.utillist; UserInfodao {Daftar Publik <UserInfo> getUserList (userInfo userInfo, int pageno, int pageSize) melempar Exception {preparedStatement pstmt = null; Hasil rs = null; Daftar <UserInfo> userList = null; try { String sql = "select * from(select rownum num,u.* from(select * from user_info where sex = ? and home like '" + userInfo.getHome() + "%" + "' and colleague like '" + userInfo.getColleage() + "%" + "' and coming year like '" + userInfo.getCy() + "%" + "' order by id) u where rownum <=?) Di mana num> =? "; UserList = new ArrayList <SererInfo> (); Koneksi conn = dbutility.getConnection (); PSTMT = Conn.PrepareStatement (SQL); pstmt.setstring (1, userInfo.getsex ()); pstmt.setint (2, pageno * halaman); pstmt.setint (3, (pageno - 1) * halaman + 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 (pengguna); }} catch (sqlexception e) {e.printstacktrace (); Lempar pengecualian baru (e); } akhirnya {dbutility.closeresultset (rs); Dbutility.closepreparedStatement (PSTMT); } kembalikan daftar pengguna; } public int getTotalNum (userInfo userInfo) melempar Exception {disiapkan pstmt = null; Hasil rs = null; Int Count = 0; coba {string sql = "Pilih hitungan (*) dari user_info di mana seks =? dan rumah seperti '" + userInfo.getHome () + "%" + "' dan kuliah seperti '" + userInfo.getColleAge () + "%" + "dan tahun yang akan datang seperti'" + userInfo.getcy () " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" " +" + "" "" "" " +" + " +" + " +" + " +" " +" " +" "" "" "" " +" + " +" + " +" " +" "" "" "" + " +" + " +" " +" " +" "" "" "" ""; Koneksi 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 (); Lempar pengecualian baru (e); } akhirnya {dbutility.closeresultset (rs); Dbutility.closepreparedStatement (PSTMT); } jumlah pengembalian; }} Akhirnya, servlet mengembalikan hasilnya ke halaman JSP untuk ditampilkan.
Catatan: Kode dbutilitas adalah kode yang merangkum operasi koneksi basis data, sebagai berikut:
Paket Kane; import java.sql.connection; impor java.sql.driverManager; impor java.sql.preparedstatement; impor java.sql.resultset; import java.sql.sqlexception; Klasi Publik < public static Connection getConnection () {connection conn = null; conn = threadlocal.get (); if (conn == null) {coba {class.forname ("oracle.jdbc.driver.oracledRiver"); conn = driverManager.getConnection ("jdbc: oracle: tipis: @localhost: 1521: oracle", "admin", "admin"); threadlocal.set (Conn); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (sqlexception e) {e.printstacktrace (); }} return conn; } // Pengaturan Encapsulation Koneksi secara otomatis mengirimkan public static void setAutocommit (koneksi Conn, boolean flag) {coba {conn.setautocommit (flag); } catch (sqlexception e) {e.printstacktrace (); }} // atur transaksi komit public static void commit (connection conn) {try {conn.Commit (); } catch (sqlexception e) {e.printstacktrace (); }} // enkapsulasi mengatur koneksi rollback public static void rollback (koneksi conn) {coba {conn.rollback (); } catch (sqlexception e) {e.printstacktrace (); }} // Encapsulate fungsi yang menutup koneksi, disiapkan, dan hasilkan public static void closeConnection () {connection conn = threadLocal.get (); coba {if (conn! = null) {conn.close (); Conn = null; threadlocal.remove (); }} catch (sqlexception e) {e.printstacktrace (); }} public static void closePrEparedStatement (disiapkan pstmt) {coba {if (pstmt! = null) {pstmt.close (); PSTMT = NULL; }} catch (sqlexception e) {e.printstacktrace (); }} public static void ClosereSultSet (hasil rsetet) {coba {if (rs! = null) {rs.close (); rs = null; }} catch (sqlexception e) {e.printstacktrace (); }}} Threadlocal digunakan untuk memastikan konsistensi transaksi, sehingga semua operasi basis data dari utas yang sama menggunakan koneksi yang sama.
Pada titik ini, implementasi kode sederhana selesai.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.