ทันทีหลังจากบทความก่อนหน้า - หลักการของเทคโนโลยีเพจและความสำคัญและวิธีการของการเพจ (I) บทความนี้ยังคงวิเคราะห์เทคโนโลยีการเพจ บทความก่อนหน้านี้พูดถึงหลักการง่าย ๆ และการแนะนำเทคโนโลยีการแบ่งหน้า บทความนี้วิเคราะห์การใช้งานรหัสของเทคโนโลยีการปนเปื้อนอย่างลึกซึ้ง
ในบทความล่าสุดการใช้งานที่ดีที่สุดของการเพจคือการแบ่งแยกที่ชั้นฐานข้อมูลและฐานข้อมูลที่แตกต่างกันมีการใช้งานเพจที่แตกต่างกัน ตัวอย่างเช่น Oracle ใช้การทำรัง SQL สามชั้นเพื่อใช้การเพจและ MySQL ใช้คำหลักขีด จำกัด เพื่อใช้งานขีด จำกัด (ที่กล่าวถึงในบทความก่อนหน้า)
บทความนี้ ขึ้นอยู่กับ Java + Oracle และอธิบายการใช้เลเยอร์รหัส
ดังที่เรามักจะเห็นในการเพจผลการสอบถามที่ส่งคืนไม่เพียง แต่รวมถึงชุดผลลัพธ์การสืบค้น (รายการ) แต่ยังรวมถึงจำนวนหน้าทั้งหมด (pagenum), หน้าปัจจุบัน (Pageno) และข้อมูลอื่น ๆ ดังนั้นเราจึงห่อหุ้มคลาส Pagemodel ผลลัพธ์แบบสอบถามรหัสมีดังนี้:
แพ็คเกจ Kane; นำเข้า java.util.list; Pagemodel ระดับสาธารณะ <E> {รายการส่วนตัว <E> รายการ; pageno int ส่วนตัว; หน้า int ส่วนตัว; INT รวมส่วนตัว; Private Int TotalPage; รายการสาธารณะ <E> getList () {รายการส่งคืน; } โมฆะสาธารณะ setlist (รายการ <e> รายการ) {this.list = list; } สาธารณะ int getPageno () {return pageno; } โมฆะสาธารณะ setpageno (int pageno) {this.pageno = pageno; } public int getPagesize () {กลับ pageSize; } โมฆะสาธารณะ setPagesize (int pageize) {this.page.ize = pageSize; } public int getTotalNum () {return totalNum; } โมฆะสาธารณะ settotalnum (int totalnum) {this.totalnum = totalNum; settotalpage ((getTotalNum () % หน้า) == 0? (getTotalNum () / pagesize): (getTotalNum () / pagesize + 1)); } public int getTotalPage () {return totalPage; } โมฆะสาธารณะ settotalPage (int totalPage) {this.totalPage = TotalPage; } // รับหน้าแรกสาธารณะ int getFirstPage () {return 1; } // รับหน้าสุดท้ายสาธารณะ int getLaStPage () {return totalPage; } // รับหน้าก่อนหน้า public int getPrepage () {ถ้า (pageno> 1) ส่งคืน pageno - 1; กลับ 1; } // รับหน้าสุดท้ายสาธารณะ int getBackPage () {ถ้า (pageno <totalPage) ส่งคืน pageno + 1; กลับมารวมหน้า; } // รับหน้าสุดท้ายสาธารณะ int getBackPage () {ถ้า (pageno <totalPage) ส่งคืน pageno + 1; กลับมารวมหน้า; } // วัดว่า 'หน้าแรก' และ 'หน้าแรก' เป็นสตริงสาธารณะที่มีอยู่นั้นสามารถใช้ได้ () {ถ้า (pageno == 1) ส่งคืน "ปิดใช้งาน"; กลับ ""; } // วัดว่า 'หน้าสุดท้าย' และ 'หน้าถัดไป' เป็นสตริงสาธารณะ isbackable () {ถ้า (pageno == TotalPage) คืน "ปิดใช้งาน"; กลับ ""; - การใช้ยาสามัญคือการเปิดใช้งานคลาสเพจที่จะนำกลับมาใช้ใหม่ ตัวอย่างเช่นเมื่อสอบถามผู้ใช้วัตถุผู้ใช้สามารถห่อหุ้มได้และเมื่อสอบถามคำสั่งซื้อการไหลในการเงินคลาส FlowCard สามารถห่อหุ้มได้
เรานำผู้ใช้แบบสอบถามเป็นตัวอย่าง ผู้ใช้เลือกเงื่อนไขการสืบค้นก่อนโทร Servlet เพื่อรับพารามิเตอร์การสืบค้นจากนั้นขอเลเยอร์ลอจิกทางธุรกิจเพื่อให้ได้คลาสผลลัพธ์การห่อหุ้ม paginated ตรรกะทางธุรกิจเรียกเลเยอร์ DAO เพื่อรับชุดผลลัพธ์และรับระเบียนในกระบวนการ จำนวนระเบียนในกระบวนการถูกห่อหุ้มลงในคลาสหน้า ในที่สุด Servlet จะตั้งค่าผลลัพธ์ไปยังหน้า JSP เพื่อแสดง
ก่อนอื่นให้อธิบาย servlet รหัสมีดังนี้:
แพ็คเกจ Kane; นำเข้า Java.io.*; นำเข้า Java.util.*; นำเข้า Javax.servlet.servletConfig; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletresponse; นำเข้า kane.userinfo; นำเข้า kane.userinfomanage; นำเข้า kane.pagemodel; ผู้ใช้ระดับสาธารณะผู้ใช้งาน Searchservlet ขยาย httpservlet หน้า int ส่วนตัว = 0; @Override โมฆะสาธารณะ init (servletConfig config) พ่น servletexception {pagesize = integer.parseint (config.getInitParameter ("pageSize")); } @Override Void DoGet (httpservletrequest REQ, httpservletResponse resp) โยน servletexception, ioexception {dopost (req, resp); } @Override void dopost (httpservletrequest req, httpservletResponse resp) พ่น servletexception, ioexception {// 1 รับพารามิเตอร์หน้าและสร้างพารามิเตอร์วัตถุ int pageno = integer.parseint (req.getparameter ( String sex = req.getParameter ("เพศ"); String home = req.getParameter ("newLocation"); String College = req.getParameter ("colleage"); สตริงปีที่กำลังจะมา = req.getParameter ("Comeenyear"); userInfo U = ใหม่ userInfo (); U.Setsex (เพศ); U.Sethome (บ้าน); U.SetColleage (Colleage); u.setcy (Comeenyear); // 2. การโทรตรรกะทางธุรกิจเพื่อรับชุดผลลัพธ์ userInFomanage userInfomanage = ใหม่ userInFomanage (); Pagemodel <ผู้ใช้ userinfo> pagination = userInfomanage.userbasicsearch (U, Pageno, PageSize); รายการ <userInfo> userlist = pagination.getList (); // 3. ห่อหุ้มผลลัพธ์ Return StringBuffer resultxml = new StringBuffer (); ลอง {resultxml.append ("<? xml version = '1.0' encoding = 'GB18030'?>/n"); resultxml.append ("<root>/n"); สำหรับ (iterator <userInfo> iterator = userlist.iterator (); iterator .hasnext ();) {userInfo userInfo = iterator.next (); resultxml.append ("<tata>/n"); resultxml.append ("/t <id>" + userinfo.getId () + "</id>/n"); resultxml.append ("/t <truename>" + userinfo.getTruename () + "</truename>/n"); resultxml.append ("/t <eam>" + userinfo.getsex () + "</sux>/n"); resultxml.append ("/t <ome>" + userinfo.gethome () + "</ome>/n"); resultxml.append ("/t <ome>" + userinfo.gethome () + "</ome>/n"); resultxml.append ("</ta 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 <dend>" + pagination.getLastPage () + "</dend>/n"); resultxml.append ("/t <pageno>" + pagination.getPageno () + "</pageno>/n"); resultxml.append ("</pagination>/n"); resultxml.append ("</root>/n"); } catch (exception e) {e.printstacktrace (); } writeresponse (req, resp, resultxml.toString ()); } โมฆะสาธารณะ Writeresponse (คำขอ httpservletRequest, การตอบสนอง httpservletResponse, ผลลัพธ์สตริง) พ่น IOException {response.setContContentType ("ข้อความ/xml"); Response.Setheader ("แคชควบคุม", "ไม่มีแคช"); Response.SetheAder ("ประเภทเนื้อหา", "text/xml; charset = gb18030"); PrintWriter PW = Response.getWriter (); pw.write (ผลลัพธ์); pw.close (); - รหัสวัตถุผู้ใช้มีดังนี้:
แพ็คเกจ Kane; นำเข้า java.util.date; Public Class userInfo {ID INT ส่วนตัว; ชื่อผู้ใช้สตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว สตริงส่วนตัว truename; เซ็กซ์สตริงส่วนตัว; วันเกิดส่วนตัววันเกิด; สตริงส่วนตัวบ้าน; วิทยาลัยสตริงส่วนตัว; สตริงส่วนตัวที่กำลังจะมาถึง สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } สตริงสาธารณะ getPassword () {ส่งคืนรหัสผ่าน; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน; } สตริงสาธารณะ getTruename () {return truename; } โมฆะสาธารณะ setTruename (สตริง truename) {this.truename = truename; } Public String getSex () {return sex; } โมฆะสาธารณะ setsex (String sex) {this.sex = sex; } วันที่สาธารณะ getBirthday () {ส่งคืนวันเกิด; } โมฆะสาธารณะ setBirthday (วันเกิดวันที่) {this.birthday = วันเกิด; } Public String Gethome () {กลับบ้าน; } โมฆะสาธารณะ sethome (สตริงบ้าน) {this.home = home; } Public String getColleage () {Return College; } โมฆะสาธารณะ setColleage (เพื่อนร่วมงานสตริง) {this.colleage = วิทยาลัย; } Public String getcy () {return comeenyear; } โมฆะสาธารณะ setcy (String cy) {สิ่งนี้ Comeenyear = Cy; - ถัดไปคือรหัสเลเยอร์ตรรกะทางธุรกิจรหัสมีดังนี้:
แพ็คเกจ Kane; นำเข้า Java.sql.Connection; นำเข้า kane.dbutility; นำเข้า kane.pagemodel; ผู้ใช้ระดับสาธารณะ userinfomanage {userinfodao ส่วนตัว userinfodao = null; Public UserInFomanage () {userInfodao = ใหม่ userInFodao (); } PAGEMODEL สาธารณะ <UserInfo> UserBasicSearch (UserInfo U, int pageno, หน้า int) โยนข้อยกเว้น {การเชื่อมต่อการเชื่อมต่อ = null; Pagemodel <ผู้ใช้ userinfo> pagination = ใหม่ pagemodel <userInfo> (); ลอง {connection = dButility.getConnection (); dbutility.setautocommit (การเชื่อมต่อ, เท็จ); Pagination.setList (userinfodao.getUserList (U, Pageno, PageSize)); pagination.setpageno (pageno); pagination.setPagesize (หน้า); Pagination.settotalnum (userinfodao.getTotalnum (u)); dbutility.commit (การเชื่อมต่อ); } catch (exception e) {dButility.rollback (การเชื่อมต่อ); E.PrintStackTrace (); โยนข้อยกเว้นใหม่ (); } ในที่สุด {dButility.closeconnection (); } return pagination; - โดยที่ dbutility คือคลาสการห่อหุ้มการเชื่อมต่อของฐานข้อมูล
ในที่สุดการใช้งานรหัสเลเยอร์ DAO มีดังนี้:
แพ็คเกจ Kane; นำเข้า Java.sql.Connection; นำเข้า Java.sql.preparedStatement; นำเข้า Java.sql.resultset; นำเข้า java.sql.sqlexception; นำเข้า Java.util.arraylist; นำเข้า Java.util.list; userinfodao {รายการสาธารณะ <userInfo> getUserList (userInfo userInfo, int pageno, int pagesize) โยนข้อยกเว้น {PreparedStatement PSTMT = NULL; ผลลัพธ์ RS = NULL; รายการ <userInfo> userlist = null; ลอง {string sql = "select * จาก (เลือก rownum num, u. * จาก (เลือก * จาก user_info ที่ sex =? และบ้านเช่น '" + userinfo.gethome () + "%" + "และเพื่อนร่วมงานเช่น'" userinfo.getColleage () + "%" + " rownum <=?) ที่ไหน num> =? "; userlist = 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 (); ในขณะที่ (rs.next ()) {userInfo user = ใหม่ userInfo (); user.setId (rs.getInt ("id")); user.setTruename (rs.getString ("truename")); user.setsex (rs.getString ("เพศ")); 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) โยนข้อยกเว้น {PreparedStatement PSTMT = NULL; ผลลัพธ์ RS = NULL; จำนวน int = 0; ลอง {string sql = "select count (*) จาก user_info โดยที่ sex =? และบ้านเช่น '" + userinfo.gethome () + "%" + "และวิทยาลัยเช่น'" + 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); } นับคืน; - ในที่สุด Servlet จะส่งคืนผลลัพธ์ไปยังหน้า JSP เพื่อแสดง
หมายเหตุ: รหัส DBUTILITY เป็นรหัสที่ห่อหุ้มการดำเนินการเชื่อมต่อฐานข้อมูลดังนี้:
แพ็คเกจ Kane; นำเข้า Java.sql.Connection; นำเข้า Java.sql.DriverManager นำเข้า Java.sql.preparedStatement; นำเข้า java.sql.resultset; นำเข้า java.sql.sqlexception; การเชื่อมต่อแบบคงที่สาธารณะ getConnection () {การเชื่อมต่อ conn = null; conn = threadlocal.get (); if (conn == null) {ลอง {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; } // encapsulation การตั้งค่าการเชื่อมต่อส่งโมฆะคงที่สาธารณะ setautocommit โดยอัตโนมัติ (การเชื่อมต่อ Conn, ธงบูลีน) {ลอง {conn.setautocommit (Flag); } catch (sqlexception e) {e.printstacktrace (); }} // การตั้งค่าการทำธุรกรรมส่งมอบโมฆะคงที่สาธารณะ commit (Connection Conn) {ลอง {conn.commit (); } catch (sqlexception e) {e.printstacktrace (); }} // encapsulation set การเชื่อมต่อย้อนกลับโมฆะสาธารณะคงที่การย้อนกลับ (Connection Conn) {ลอง {conn.rollback (); } catch (sqlexception e) {e.printstacktrace (); }} // ห่อหุ้มฟังก์ชั่นที่ปิดการเชื่อมต่อ, PreparedStatement และ Resultset void closeconnection () {Connection conn = threadlocal.get (); ลอง {ถ้า (conn! = null) {conn.close (); conn = null; Threadlocal.remove (); }} catch (sqlexception e) {e.printstacktrace (); }} โมฆะสาธารณะคงที่ closePreparedStatement (PreparedStatement pstmt) {ลอง {ถ้า (pstmt! = null) {pstmt.close (); pstmt = null; }} catch (sqlexception e) {e.printstacktrace (); }} โมฆะคงที่สาธารณะใกล้ชิด (Resultset Rs) {ลอง {ถ้า (rs! = null) {rs.close (); rs = null; }} catch (sqlexception e) {e.printstacktrace (); - ThreadLocal ใช้เพื่อให้แน่ใจว่าการทำธุรกรรมสม่ำเสมอเพื่อให้การดำเนินการฐานข้อมูลทั้งหมดของเธรดเดียวกันใช้การเชื่อมต่อเดียวกัน
ณ จุดนี้การใช้งานรหัสอย่างง่ายจะเสร็จสมบูรณ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น