مباشرة بعد المقالة السابقة - مبادئ تكنولوجيا الترحيل وأهمية وطرق الترحيل (I). تستمر هذه المقالة في تحليل تكنولوجيا الترحيل. يتحدث المقال السابق عن المبادئ البسيطة وإدخال تكنولوجيا ترقيم الصفحات. تحلل هذه المقالة بعمق تنفيذ التعليمات البرمجية لتكنولوجيا الصفحات.
في المقالة الأخيرة ، يكون أفضل تطبيق للترحيل هو التربط في طبقة قاعدة البيانات ، وقواعد البيانات المختلفة لها تطبيقات ترحيل مختلفة. على سبيل المثال ، يستخدم Oracle من ثلاث طبقات SQL Nesting لتنفيذ الترحيل ، ويستخدم MySQL الكلمة الرئيسية الحد لتنفيذ الحد (المذكور في المقالة السابقة).
تعتمد هذه المقالة على Java + Oracle وتشرح تنفيذ طبقة الكود .
كما نرى عادة في الترحيل ، فإن نتيجة الاستعلام التي تم إرجاعها لا تتضمن فقط مجموعة نتائج الاستعلام (القائمة) ، ولكن تتضمن أيضًا إجمالي عدد الصفحات (Pagenum) ، والصفحة الحالية (Pageno) ، وغيرها من المعلومات. لذلك ، نقوم بتغليف فئة pagemodel نتيجة الاستعلام ، فإن الكود كما يلي:
حزمة kane ؛ import java.util.list ؛ public pagemodel <e> {private list <e> list ؛ خاص int pageno ؛ pagesize pagesize ؛ Private Int TotalNum ؛ private 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؟ (getTotalNum () / pagesize): (getTotalNum () / pagesize + 1)) ؛ } public int getTotalPage () {return totalPage ؛ } public void settotalpage (int totalpage) {this.totalPage = TotalPage ؛ } // الحصول على الصفحة الأولى العامة int getFirstPage () {return 1 ؛ } // احصل على آخر صفحة عامة int getLastPage () {return totalPage ؛ } // احصل على الصفحة السابقة public getPrepage () {if (pageno> 1) return pageno - 1 ؛ العودة 1 ؛ } // احصل على الصفحة الأخيرة public getbackpage () {if (pageno <totalpage) return pageno + 1 ؛ إرجاع إجمالي page ؛ } // احصل على الصفحة الأخيرة public getbackpage () {if (pageno <totalpage) return pageno + 1 ؛ إرجاع إجمالي page ؛ } // قم بقياس ما إذا كانت "الصفحة الرئيسية" و "الصفحة الأولى" متاحة للسلسلة العامة غير قابلة للاتصال () {if (pageno == 1) إرجاع "تعطيل" ؛ يعود ""؛ } // قم بقياس ما إذا كانت "الصفحة الأخيرة" و "الصفحة التالية" متاحة للسلسلة العامة isBackable () {if (pageno == totalpage) إرجاع "تعطيل" ؛ يعود ""؛ }} استخدام الأدوية الجيلية هو تمكين فئة الترحيل لإعادة استخدامها. على سبيل المثال ، عند الاستعلام عن المستخدمين ، يمكن تغليف كائن المستخدم ، وعند الاستعلام عن أوامر التدفق في التمويل ، يمكن تغليف فئة بطاقة التدفق.
نأخذ مستخدم الاستعلام كمثال. يحدد المستخدم حالة الاستعلام ، واتصل أولاً إلى Servlet للحصول على معلمات الاستعلام ، ثم طلب طبقة منطق العمل للحصول على فئة نتائج التغليف المربوطة. يدعو منطق العمل طبقة DAO للحصول على مجموعة النتائج والحصول على السجلات في العملية. يتم تغليف عدد السجلات في العملية في فئة الصفحة. أخيرًا ، يقوم Servlet بتعيين النتيجة إلى صفحة JSP لعرضها.
أولاً ، دعنا نوضح servlet ، الرمز هو كما يلي:
حزمة kane ؛ استيراد java.io.*؛ استيراد java.util.*؛ استيراد javax.servlet.servletconfig ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.http.httplesterquest ؛ javax.servlet.http.httpservletresponse ؛ import kane.userinfo ؛ import kane.userinfomanage ؛ import kane.pagemodel ؛ public class userbasicservlet يمتد httpservlet {private static static fong serialversionuid = 1l ؛ pageSize pagesize = 0 ؛ Override public void init (servletconfig config) يلقي servleTexception {pagesize = integer.parseint (config.getInitParameter ("pagesize")) ؛ } override void 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 ("pageno") ؛ سلسلة الجنس = req.getParameter ("الجنس") ؛ String Home = req.getParameter ("NewLocation") ؛ String College = req.getParameter ("Compleage") ؛ السلسلة القادمة = req.getParameter ("Comeyear") ؛ userInfo u = new userInfo () ؛ U.SetSex (الجنس) ؛ U.Sethome (Home) ؛ U.SetColleage (Collage) ؛ U.Setcy (Comeyear) ؛ // 2 pageModel <UserInfo> pagination = userInfomanAge.userBasicsearch (U ، Pageno ، pagesize) ؛ قائمة <SetherInfo> userList = pagination.getList () ؛ // 3. تغليف نتائج الإرجاع stringBuffer resultxml = new StringBuffer () ؛ حاول {resultxml.append ("<؟ resultxml.append ("<rout>/n") ؛ لـ (iterator <EredInfo> iterator = userList.iterator () ؛ iterator .hasNext () ؛) {userInfo userInfo = iterator.next () ؛ resultxml.append ("<data>/n") ؛ resultxml.append ("/t <id>" + userInfo.getId () + "</id>/n") ؛ resultxml.append ("/t <TuEname>" + userInfo.getTruEname () + "</ruename>/n") ؛ resultxml.append ("/t <sex>" + userInfo.getSex () + "</sex>/n") ؛ resultxml.append ("/t <ome>" + userInfo.gethome () + "</ome>/n") ؛ resultxml.append ("/t <ome>" + userInfo.gethome () + "</ome>/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 () + "</tegeno>/n") ؛ resultxml.append ("</pagination>/n") ؛ resultxml.append ("</root>/n") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } constresponse (req ، resp ، resultxml.toString ()) ؛ } public void constresponse (httpservletrequest request ، httpservletresponse ، string result) remrows ioexception {response.setContentType ("text/xml") ؛ استجابة. استجابة. printWriter pw = response.getWriter () ؛ pw.write (نتيجة) ؛ pw.close () ؛ }} رمز كائن المستخدم كما يلي:
حزمة kane ؛ استيراد java.util.date ؛ فئة عامة userInfo {private int id ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ كلمة مرور السلسلة الخاصة ؛ سلسلة truename الخاصة ؛ جنسية سلسلة خاصة عيد ميلاد التاريخ الخاص سلسلة خاصة المنزل ؛ كلية السلسلة الخاصة ؛ سلسلة خاصة في العام القادم ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ } السلسلة العامة getTruEname () {return truEname ؛ } public void setTruEname (سلسلة truename) {this.truEname = truEname ؛ } سلسلة عامة getSex () {return sex ؛ } public void setSex (سلسلة الجنس) {this.sex = sex ؛ } التاريخ العام getBirthday () {return Birthday ؛ } public void setbirthday (Date Birthday) {this.birthday = عيد ميلاد ؛ } السلسلة العامة gethome () {return home ؛ } public void sethome (String Home) {this.home = home ؛ } السلسلة العامة getColleage () {return College ؛ } public void setColleage (زميل سلسلة) {this.colleage = college ؛ } السلسلة العامة getCy () {return comeyear ؛ } public void setcy (String cy) {this. Comeyear = cy ؛ }} التالي هو رمز طبقة منطق العمل ، الرمز كما يلي:
حزمة kane ؛ استيراد java.sql.connection ؛ استيراد kane.dbutility ؛ استيراد kane.pagemodel ؛ فئة عامة userinfomanage {private userinfodao userinfodao = null ؛ userInfomanage public () {userInfodao = جديد userInfodao () ؛ } pageModel العامة <SetherInfo> userBasicsearch (userinfo u ، int pageno ، int pagesize) يلقي الاستثناء {connection connection = null ؛ pageModel <UserInfo> pagination = new pageModel <SeterInfo> () ؛ حاول {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 (اتصال) ؛ } catch (استثناء e) {dbutility.rollback (connection) ؛ E.PrintStackTrace () ؛ رمي استثناء جديد () ؛ } أخيرًا {dbutility.closeconnection () ؛ } عودة ترقيم الصفحات ؛ }} حيث DBUTILITY هي فئة تغليف الاتصال لقاعدة البيانات.
أخيرًا ، يكون تطبيق رمز طبقة DAO كما يلي:
حزمة kane ؛ استيراد java.sql.connection ؛ استيراد java.sql.preparedstatement ؛ استيراد java.sql.resultset ؛ استيراد java.sql.sqlexception ؛ استيراد java.util.arraylist ؛ userInfodao {public list <SeterInfo> getUserList (userInfo userInfo ، int pageno ، int pagesize) يلقي الاستثناء {reparedStatement pstmt = null ؛ resultset rs = null ؛ قائمة <SetherInfo> userList = null ؛ جرب {string sql = "select * from (select rownum num ، u. * from (select * from user_info where sex =؟ and home like" " + userinfo.gethome () +" ٪ " +" "و comeenuge like" + userinfo.getCollege () + " +" and ear year " + userinfo rownum <=؟) أين num> =؟ "؛ userList = new ArrayList <UserInfo> () ؛ connect 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 = 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 () ؛ رمي استثناء جديد (هـ) ؛ } أخيرًا {dbutility.closeresultset (rs) ؛ dbutility.closepreparedStatement (PSTMT) ؛ } إرجاع قائمة المستخدمين ؛ } public int getTotalNum (userInfo userInfo) يلقي الاستثناء {reparedStatement pStmt = null ؛ resultset rs = null ؛ عدد int = 0 ؛ جرب {String sql = "SELECT COUNT (*) من user_info حيث sex =؟ و home مثل" + userInfo.gethome () + "٪" + "" و college مثل " + userInfo.getColleage () +" ٪ " +" "مثل" + userinfo.getcy () + "٪" "" "؛ connect 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 () ؛ رمي استثناء جديد (هـ) ؛ } أخيرًا {dbutility.closeresultset (rs) ؛ dbutility.closepreparedStatement (PSTMT) ؛ } عدد العائد ؛ }} أخيرًا ، يقوم Servlet بإرجاع النتيجة إلى صفحة JSP لعرضها.
ملاحظة: رمز DBUtility هو الرمز الذي يتغلف عملية اتصال قاعدة البيانات ، على النحو التالي:
حزمة kane ؛ استيراد java.sql.connection ؛ استيراد java.sql.drivermanager ؛ استيراد java.sql.prepedstatement ؛ استيراد java.sql.resultset ؛ استيراد java.sql.sqlexception ؛ فئة عامة dbutility {private static threadlocal < الاتصال الثابت العام 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 ؛ }. } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // تعيين المعاملة الالتزام بالفراغ الثابت العام (اتصال conn) {try {conn.Commit () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // set set set connection rollback public static void rollback (connection conn) {try {conn.rollback () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // تغليف الوظيفة التي تغلق الاتصال ، و reparedStatement ، و ResultSet public static void closeConnection () {connection conn = threadlocal.get () ؛ حاول {if (conn! = null) {conn.close () ؛ conn = null ؛ threadlocal.remove () ؛ }} catch (sqlexception e) {E.PrintStackTrace () ؛ }} public static void closeprepreparedStatement (preparedStatement pstmt) {try {if (pstmt! = null) {pstmt.close () ؛ PSTMT = فارغة ؛ }} catch (sqlexception e) {E.PrintStackTrace () ؛ }} public static void closeresultset (resultset rs) {try {if (rs! = null) {rs.close () ؛ rs = فارغة ؛ }} catch (sqlexception e) {E.PrintStackTrace () ؛ }}} يتم استخدام ThreadLocal لضمان اتساق المعاملات ، بحيث تستخدم جميع عمليات قاعدة البيانات في نفس الخيط نفس الاتصال.
في هذه المرحلة ، يتم الانتهاء من تطبيق رمز بسيط.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.