Immédiatement après l'article précédent - Les principes de la technologie de pagination et la signification et les méthodes de pagination (I). Cet article continue d'analyser la technologie de pagination. L'article précédent parle des principes simples et de l'introduction de la technologie de pagination. Cet article analyse profondément la mise en œuvre du code de la technologie de pagination.
Dans le dernier article, la meilleure implémentation de la pagination est de paginer à la couche de base de données, et différentes bases de données ont des implémentations de pagination différentes. Par exemple, Oracle utilise une nidification SQL à trois couches pour implémenter la pagination, et MySQL utilise le mot-clé limite pour implémenter Limit (mentionné dans l'article précédent).
Cet article est basé sur Java + Oracle et explique l'implémentation de la couche de code .
Comme nous le voyons habituellement dans la pagination, le résultat de la requête renvoyée inclut non seulement l'ensemble de résultats de requête (liste), mais comprend également le nombre total de pages (pagenum), la page actuelle (pageno) et d'autres informations. Par conséquent, nous encapsulons une classe de pagemodel de résultat de requête, le code est le suivant:
package kane; import java.util.list; classe publique PageModel <e> {Liste privée <e> liste; Int privé Pageno; Private int pagesize; privé int totalnum; Private int totalpage; Liste publique <e> getList () {return list; } 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; } // Obtenez la première page public int getFirstPage () {return 1; } // Obtenez la dernière page public int getlastPage () {return totalPage; } // Obtenez la page précédente publique int getPrepage () {if (pageno> 1) return pageno - 1; retour 1; } // Obtenez la dernière page publique int gakpage () {if (pageno <totalPage) return pageno + 1; retour totalpage; } // Obtenez la dernière page publique int gakpage () {if (pageno <totalPage) return pageno + 1; retour totalpage; } // Mesurez si la «page d'accueil» et la «première page» sont disponibles publiques ISPRECY () {if (pageno == 1) return «Disabled»; retour ""; } // Mesurez si 'Last Page' et 'Next Page' sont disponibles publiques ISBACKable () {if (pageno == TotalPage) renvoie "Disabled"; retour ""; }} L'utilisation des génériques est de permettre la réutilisation de la classe de pagination. Par exemple, lors de l'interrogation des utilisateurs, l'objet utilisateur peut être encapsulé et lors de l'interrogation des ordres de flux en finance, la classe FlowCard peut être encapsulée.
Nous prenons l'exemple de l'utilisateur de la requête. L'utilisateur sélectionne la condition de requête, appelez d'abord le servlet pour obtenir les paramètres de requête, puis demandez la couche logique métier pour obtenir la classe de résultats d'encapsulation paginée. La logique métier appelle la couche DAO pour obtenir l'ensemble de résultats et obtenir les enregistrements dans le processus. Le nombre d'enregistrements dans le processus est encapsulé dans la classe de page. Enfin, le servlet définit le résultat sur la page JSP à afficher.
Tout d'abord, expliquons le servlet, le code est le suivant:
package kane; import java.io. *; import java.util. *; importer javax.servlet.servletconfig; import javax.servlet.servletException; import javax.servlet.httpservletservlet; import javax.servlet.http.httpservlet javax.servlet.http.httpservletResponse; import kane.userinfo; import kane.userinfomanage; import kane.pageModel; classe publique userbasicsearchServlet étend httpservlet {private static final Serialversionuid = 1l; private int pagesize = 0; @Override public void init (ServletConfig config) lève Servlexception {pagesize = Integer.ParseInt (config.getInitParameter ("PageSize")); } @Override Protected void doGet (httpServletRequest req, httpservletResponse resp) lève ServletException, ioException {doPost (req, resp); } @Override Protected vid doPost (httpServletRequest req, httpServletResponse resp) lève ServletException, ioException {// 1. Obtenez des paramètres de page et construisez l'objet paramètre int pageno = Integer.Parseint (req.getParamètre ("Pageno")); String Sex = req.getParameter ("Gender"); String home = req.getParameter ("NewLocation"); String College = req.getParameter ("collège"); Chaîne à venir l'année = req.getParameter ("Comenyear"); UserInfo u = new UserInfo (); U.Setsex (sexe); U.Sethome (maison); U.Set Collogeage (collège); U.Setcy (venant); // 2. Appelez la logique métier pour obtenir le résultat de résultat userInfomage userInFomanage = new UserInfomanage (); PageModel <UserInfo> pagination = userInfomage.UserBasicSearch (u, pageno, pagesize); List <userInfo> userList = pagination.getList (); // 3. Encapsulez le résultat de retour stringbuffer resultXml = new StringBuffer (); essayez {resultXml.append ("<? xml version = '1.0' Encoding = 'gb18030'?> / n"); resultXml.append ("<hoot> / n"); for (iterator <userInfo> iterator = userList.iterator (); iterator .hasnext ();) {userInfo userInfo = iterator.next (); resultXml.append ("<sata> / n"); resultXml.append ("/ t <id>" + userInfo.getId () + "</id> / n"); resultXml.append ("/ t <Truename>" + userInfo.gettruename () + "</trueName> / n"); resultXml.append ("/ t <Sex>" + userInfo.getSex () + "</XEX> / n"); resultXml.append ("/ t <home>" + userInfo.Gethome () + "</ home> / n"); resultXml.append ("/ t <home>" + userInfo.Gethome () + "</ home> / n"); resultXml.append ("</sata> / n"); } resultXml.append ("<pagination> / n"); resultXml.append ("/ t <tacal>" + pagination.getTotalPage () + "</stal> / n"); resultXml.append ("/ t <start>" + pagination.getFirstPage () + "</dart> / n"); resultXml.append ("/ t <end>" + pagination.getlastPage () + "</den> / n"); resultXml.append ("/ t <pageno>" + pagination.getpageno () + "</pageno> / n"); resultXml.append ("</pagination> / n"); resultXml.append ("</ root> / n"); } catch (exception e) {e.printStackTrace (); } writerSponse (req, resp, resultXml.toString ()); } public void writerSponse (HttpServLetRequest Request, HttpServletResponse Response, String Result) lève ioException {Response.SetContentType ("Text / Xml"); Response.sethEader ("Cache-Control", "No-cache"); Response.sethEader ("Content-Type", "Text / Xml; charSet = GB18030"); Printwriter pw = réponse.getWriter (); pw.write (résultat); pw.close (); }} Le code d'objet utilisateur est le suivant:
package kane; import java.util.date; public class userInfo {private int id; Nom d'utilisateur de chaîne privée; mot de passe de chaîne privé; String privé Truename; Sexe à cordes privées; anniversaire de rendez-vous privé; maison de chaîne privée; collège de cordes privées; chaîne privée à venir l'année; 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 mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; } public String getTruename () {return truename; } public void setTruename (String truename) {this.truename = truename; } public String getSEX () {return sexe; } public void setSex (String Sex) {this.sex = sexe; } Public Date getBirthday () {retour anniversaire; } public void SetBirthday (date d'anniversaire) {this.birthday = anniversaire; } public String Gethome () {retour à la maison; } public void Sethome (String home) {this.home = home; } public String getcolleage () {return College; } public void setcolleage (collègue de chaîne) {this.colleage = collège; } public String getCy () {return wakeyear; } public void setcy (String cy) {this. Comingyear = cy; }} Ensuite, le code de couche Logic Business, le code est le suivant:
package kane; import java.sql.connection; import kane.dbutility; import kane.pagemodel; public class userInfomanage {private userInfodao userInfodao = null; public userInfomage () {userInfodao = new UserInfodao (); } public pageModel <UserInfo> UserBasicSearch (userInfo u, int pageno, int pagesize) lève exception {connexion connexion = null; PageModel <UserInfo> pagination = new PageModel <UserInfo> (); try {connection = dbutility.getConnection (); Dbutility.setAutoCommit (connexion, false); pagination.setList (userInfodao.getUserList (u, pageno, pagesize)); pagination.setpageno (pageno); pagination.setPageSize (pagesize); pagination.setTotalnum (userInfodao.getTotalnum (u)); Dbutility.commit (connexion); } catch (exception e) {dbutility.rollback (connexion); e.printStackTrace (); lancer une nouvelle exception (); } enfin {dbutility.closeConnection (); } Retour pagination; }} Où la dbutilité est la classe d'encapsulation de connexion de la base de données.
Enfin, l'implémentation du code de couche DAO est la suivante:
Package Kane; Import Java.Sql.Connection; Importer Java.Sql.PreparedStatement; Importer Java.Sql.ResultSet; Importer Java.Sql.Sqlexception; Importer Java.util.arrayList; Importer Java.util.List; Importer Java.util.List; Import Kane.Userinfo; Import Kane.Dba.Lis UserInfodao {public list <UserInfo> getUserList (userInfo userInfo, int pageno, int pageSize) lève une exception {préparé Pstmt = null; ResultSet rs = null; List <userInfo> userList = null; essayez {String sql = "select * from (select rownum num, u. * From (select * from user_info where sex =? and home like '" + userInfo.gethome () + "%" + "' et collègue comme '" + userInfo.getcolleage () + "%" + "' '. Rownum <=?) Où num> =? "; userList = new ArrayList <UserInfo> (); Connexion conn = dbutility.getConnection (); PSTMT = Conn.Preparestatement (SQL); PSTMT.SETSTRING (1, userInfo.getSex ()); pstmt.sentInt (2, pageno * pagesize); pstmt.sentInt (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 (utilisateur); }} catch (sqlexception e) {e.printStackTrace (); lancer une nouvelle exception (e); } enfin {dbutility.closeResultSet (rs); Dbutility.closepreparedstatement (PSTMT); } return userList; } public int getTotalnum (userInfo userInfo) lève une exception {préparé Pstmt = null; ResultSet rs = null; int count = 0; essayez {string sql = "select count (*) from user_info where sex =? and home like '" + userInfo.gethome () + "%" + "' et collège comme '" + userInfo.getcolleage () + "%" + "' et à venir l'année comme '" + userInfo.getcy () + "%" + "" "; Connexion 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 (); lancer une nouvelle exception (e); } enfin {dbutility.closeResultSet (rs); Dbutility.closepreparedstatement (PSTMT); } Return Count; }} Enfin, le servlet renvoie le résultat à la page JSP à afficher.
Remarque: Le code DBUtility est le code qui résume l'opération de connexion de la base de données, comme suit:
package kane; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultSet; import java.sql.sqlexception; public class dbutility {private static threadlocal <connection> threadlocal = new ThreadLocal <connection>;); Connexion statique publique getConnection () {connexion conn = null; Conn = ThreadLocal.get (); if (conn == null) {try {class.forname ("oracle.jdbc.driver.oracledriver"); Conn = driverManager.getConnection ("jdbc: oracle: mince: @localhost: 1521: oracle", "admin", "admin"); threadLocal.set (Conn); } catch (classNotFoundException e) {e.printStackTrace (); } catch (sqlexception e) {e.printStackTrace (); }} return conn; } // Paramètres d'encapsulation La connexion soumet automatiquement SetAutoMit (connexion Conn, booléen Flag) {try {Conn.SetAutoCommit (Flag); } catch (sqlexception e) {e.printStackTrace (); }} // Définir la transaction commit public static void commit (connexion Conn) {try {Conn.Commit (); } catch (sqlexception e) {e.printStackTrace (); }} // Encapsulation SET Connexion Rollback public STATIC VOID Rollback (Connection Conn) {try {Conn.rollback (); } catch (sqlexception e) {e.printStackTrace (); }} // encapsuler la fonction qui ferme la connexion, la mise en scène de préparation et le résultat static void closeconnection () {connexion conn = threadLocal.get (); essayez {if (conn! = null) {conn.close (); Conn = null; ThreadLocal.Remove (); }} catch (sqlexception e) {e.printStackTrace (); }} public static void reposPreparedStatement (préparé Pstmt) {try {if (pstmt! = null) {pstmt.close (); pstmt = null; }} catch (sqlexception e) {e.printStackTrace (); }} public static void CloserReResultSet (resultSet rs) {try {if (rs! = null) {Rs.close (); rs = null; }} catch (sqlexception e) {e.printStackTrace (); }}} ThreadLocal est utilisé pour garantir la cohérence des transactions, de sorte que toutes les opérations de base de données du même thread utilisent la même connexion.
À ce stade, une simple implémentation de code est terminée.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.