Inmediatamente después del artículo anterior, los principios de la tecnología de paginación y la importancia y los métodos de paginación (I). Este artículo continúa analizando la tecnología de paginación. El artículo anterior habla sobre los principios simples y la introducción de la tecnología de paginación. Este artículo analiza profundamente la implementación del código de la tecnología de paginación.
En el último artículo, la mejor implementación de la paginación es paginar en la capa de base de datos, y diferentes bases de datos tienen diferentes implementaciones de paginación. Por ejemplo, Oracle utiliza la anidación SQL de tres capas para implementar la paginación, y MySQL usa la palabra clave límite para implementar el límite (mencionado en el artículo anterior).
Este artículo se basa en Java + Oracle y explica la implementación de la capa de código .
Como normalmente vemos en la paginación, el resultado de la consulta devuelto no solo incluye el conjunto de resultados de la consulta (lista), sino que también incluye el número total de páginas (pageno), la página actual (pageno) y otra información. Por lo tanto, encapsulamos una clase de pagemodelo de resultados de consulta, el código es el siguiente:
paquete kane; import java.util.list; public class Pagemodel <E> {Lista privada <E> LIST; privado int pageno; Página privada int; privado int totalnum; Private int TotalPage; Lista pública <E> getList () {Lista de retorno; } 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 págsagesize) {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; } // Obtenga la primera página public int getFirstPage () {return 1; } // Obtenga la última página public int getLastPage () {return totalPage; } // Obtenga la página anterior public int getPrepage () {if (pageno> 1) return Pageno - 1; regresar 1; } // Obtenga la última página public int getBackPage () {if (pageno <totalPage) return Pageno + 1; devolver total Page; } // Obtenga la última página public int getBackPage () {if (pageno <totalPage) return Pageno + 1; devolver total Page; } // Medir si 'Página de inicio' y 'Página principal' están disponibles public String IsPrable () {if (Pageno == 1) return "DiSeded"; devolver ""; } // Medir si 'Última página' y 'página siguiente' están disponibles public string isbackable () {if (pageno == totalpage) return "desactivado"; devolver ""; }} El uso de genéricos es permitir que la clase de paginación se reutilice. Por ejemplo, al consultar a los usuarios, el objeto de usuario se puede encapsular y al consultar las órdenes de flujo en finanzas, la clase de tapa de flujo se puede encapsular.
Tomamos al usuario de la consulta como ejemplo. El usuario selecciona la condición de consulta, primero llame al servlet para obtener los parámetros de consulta y luego solicite la capa lógica de negocios para obtener la clase de resultados de encapsulación paginada. La lógica comercial llama a la capa DAO para obtener el conjunto de resultados y obtener los registros en el proceso. El número de registros en el proceso se encapsula en la clase de página. Finalmente, el servlet establece el resultado en la página JSP para mostrar.
Primero, expliquemos el servlet, el código es el siguiente:
paquete kane; import java.io.*; import java.util.*; import javax.servlet.servletConfig; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import kane.userinfo; import kane.userinfomanage; import kane.pagemodel; pública clase userbasicSearchServlet extiende httpservlet {private estático final estática larga larga varía = 1l; Private int pageSize = 0; @Override public void init (ServletConfig config) lanza ServletException {pageSize = Integer.ParseInt (config.getInitParameter ("PageSize")); } @Override protegido void doget (httpservletRequest req, httpservletResponse resp) lanza ServletException, ioexception {dopost (req, resp); } @Override protegido void dopost (httpservletRequest req, httpservletResponse resp) lanza ServletException, ioexception {// 1. Obtener parámetros de página y construir el objeto de parámetro int pageno = Integer.Parseint (req.getparameter ("Pageno"); String sex = req.getParameter ("género"); String home = req.getParameter ("NewLocation"); String College = req.getParameter ("colegio"); String que viene = req.getParameter ("Comingyear"); UserInfo u = new UserInfo (); U.SetSex (sexo); U.Sethome (hogar); U.SetColleage (colegio); U.Setcy (Comingyear); // 2. Llame a la lógica de negocios para obtener el conjunto de resultados UserInfomanage UserInfomanage = new UserInfomanage (); PageModel <SererInfo> Pagination = UserInfomanage.UserBasicSearch (U, Pageno, PageSize); List <SererInfo> UserList = Pagination.getList (); // 3. Encapsular el resultado de retorno StringBuffer dentexml = new StringBuffer (); Pruebe {resultxml.append ("<? xml versión = '1.0' encoding = 'gb18030'?>/n"); resultadoxml.append ("<Root>/n"); for (iterator <Usaminfo> iterator = userList.iterator (); iterator .hasNext ();) {userInfo userInfo = iterator.next (); resultadoxml.append ("<sats>/n"); resultadoxml.append ("/t <id>" + userInfo.getID () + "</id>/n"); resultadoxml.append ("/t <trUename>" + userInfo.getTrUename () + "</trueName>/n"); resultadoxml.append ("/t <Ex>" + userInfo.getSEx () + "</sexo>/n"); resultadoxml.append ("/t <HOME>" + userInfo.gethome () + "</ hogar>/n"); resultadoxml.append ("/t <HOME>" + userInfo.gethome () + "</ hogar>/n"); resultadoxml.append ("</sates>/n"); } resultxml.append ("<gagination>/n"); resultadoxml.append ("/t <otal>" + pagination.getToTalPage () + "</total>/n"); resultadoxml.append ("/t <stour>" + pagination.getFirstPage () + "</sent>/n"); resultadoxml.append ("/t <En End>" + pagination.getLastPage () + "</end>/n"); resultadoxml.append ("/t <pageno>" + pagination.getpageno () + "</pageno>/n"); resultadoxml.append ("</gagination>/n"); resultadoxml.append ("</root>/n"); } catch (Exception e) {E.PrintStackTrace (); } WriterSponse (req, resp, dentexml.ToString ()); } public void WriterSponse (HttpServletRequest Solicitud, respuesta httpservletResponse, resultado de cadena) lanza IOException {Response.SetContentType ("Text/xml"); Respuesta.setheader ("Cache-Control", "No-Cache"); Response.setheader ("Content-type", "Text/xml; charset = gb18030"); PrintWriter pw = respuesta.getWriter (); pw.write (resultado); pw.close (); }} El código de objeto de usuario es el siguiente:
paquete kane; import java.util.date; public class UserInfo {private int id; nombre de usuario de cadena privada; contraseña de cadena privada; cadena privada Truename; sexo de cuerda privada; cumpleaños de cita privada; Cadena privada a casa; Colegio de cuerdas privadas; cadena privada el año próximo; 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 Password; } public void setPassword (String Password) {this.password = contraseña; } public String getTruename () {return trUEname; } public void setTrUename (string trUEname) {this.trUename = trUEname; } public String getsex () {return sex; } public void setsex (sexo de cadena) {this.sex = sex; } Fecha pública GetBirthday () {regreso de cumpleaños; } public void setBirthday (cumpleaños de fecha) {this.birthday = cumpleaños; } public String gethome () {return home; } public void sethome (string home) {this.home = home; } public String getColLeage () {return College; } public void setColleage (String colegue) {this.ColLeage = College; } public String getcy () {return Comingyear; } public void setcy (string cy) {this. Comingyear = cy; }} El siguiente es el código de capa lógica de negocios, el código es el siguiente:
paquete kane; import java.sql.connection; import kane.dbutility; import kane.pagemodel; public class UserInfomanage {private userInfodao userInfodao = null; Public UserInfomanage () {userInfodao = new UserInfodao (); } public Pagemodel <Serinfo> UserBasicSearch (UserInfo U, Int Pageno, int PageSize) lanza Exception {Connection Connection = NULL; Pagemodel <sererInfo> pagination = new PageModel <SererInfo> (); intente {Connection = dButility.getConnection (); DButility.setAutOcommit (conexión, falso); Pagination.SetList (UserInfodao.getuserList (U, Pageno, PageSize)); Pagination.SetPageno (Pageno); Pagination.setPageSize (PageSize); paginación.settotalnum (userInfodao.gettotalnum (u)); DButility.commit (conexión); } catch (Exception e) {dButility.rollback (conexión); E.PrintStackTrace (); arrojar una nueva excepción (); } finalmente {dButility.CloSeconnection (); } Paginación de retorno; }} Donde dButilidad es la clase de encapsulación de conexión de la base de datos.
Finalmente, la implementación del código de capa DAO es la siguiente:
paquete kane; import java.sql.connection; import java.sql.preparedStatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.arrayList; import java.util.list; import java.util.list; import kane.userinfo; importación; UserInfodao {Public List <SererInfo> getUserList (UserInfo UserInfo, int pageno, int PageSize) lanza la excepción {preparado PSTMT = null; ResultSet rs = null; Lista <SererInfo> userList = null; Pruebe {String sql = "Seleccione * de (Seleccione Rownum Num, U Rownum <=?) donde num> =? "; UserList = new ArrayList <SererInfo> (); Conexión 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 (); while (rs.next ()) {userInfo user = new UserInfo (); user.setId (rs.getInt ("id")); user.setTrUeName (rs.getString ("trueName")); user.setSex (rs.getString ("sexo")); user.sethome (rs.getString ("inicio")); UserList.Add (usuario); }} Catch (SQLException e) {E.PrintStackTrace (); arrojar una nueva excepción (e); } Finalmente {dButilidad.CloserSultSet (rs); DButility.ClosepreparedStatement (PSTMT); } return UserList; } public int getToTalnum (UserInfo UserInfo) lanza la excepción {PrepareStatement pstmt = null; ResultSet rs = null; int count = 0; Pruebe {String sql = "Seleccione Count (*) de User_info Where Sex =? Y Home Like '" + UserInfo.gethome () + "%" + "y la universidad como'" + userInfo.getColLeage () + "%" + "y el año que viene como '" + userInfo.getcy () + "%" + "" ";";; Conexión 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 (); arrojar una nueva excepción (e); } Finalmente {dButilidad.CloserSultSet (rs); DButility.ClosepreparedStatement (PSTMT); } recuento de retorno; }} Finalmente, el servlet devuelve el resultado a la página JSP para mostrar.
Nota: El código DButilidad es el código que encapsula la operación de conexión de la base de datos, de la siguiente manera:
paquete kane; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedStatement; import java.sql.ResultSet; import java.sql.sqlexception; clase pública dButility {private estaticlocal <nection> Threadlocal = new threadlocal <Conexy> (); 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; } // Conexión de configuración de encapsulación La conexión envía automáticamente public static void setAutoCommit (Connection Conn, Boolean Flag) {try {conn.setAutOcommit (bandera); } Catch (Sqlexception e) {E.PrintStackTrace (); }} // establecer la transacción comet public static void commit (conexión conn) {try {conn.commit (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} // Encapsulación Conexión de conexión Rollback public static void Rollback (Connection Conn) {try {conn.rollback (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} // Encapsula la función que cierra la conexión, preparada y el resultado publican public static void CloseConnection () {Connection conn = ThreadLocal.get (); intente {if (conn! = null) {conn.close (); conn = nulo; ThreadLocal.remove (); }} Catch (SQLException e) {E.PrintStackTrace (); }} public static void ClosePreparareStatement (preparado PSTMT) {try {if (pstmt! = null) {pstmt.close (); pstmt = nulo; }} Catch (SQLException e) {E.PrintStackTrace (); }} public static void CloseSultSet (ResultSet rs) {try {if (rs! = null) {rs.close (); rs = nulo; }} Catch (SQLException e) {E.PrintStackTrace (); }}} ThreadLocal se utiliza para garantizar la consistencia de las transacciones, de modo que todas las operaciones de la base de datos del mismo subproceso usen la misma conexión.
En este punto, se completa una implementación de código simple.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.