Imediatamente após o artigo anterior - os princípios da tecnologia de paginação e o significado e os métodos de paginação (i). Este artigo continua a analisar a tecnologia de paginação. O artigo anterior fala sobre os princípios simples e a introdução da tecnologia de paginação. Este artigo analisa profundamente a implementação do código da tecnologia de paginação.
No último artigo, a melhor implementação da paginação é paginar na camada de banco de dados, e diferentes bancos de dados têm implementações de paginação diferentes. Por exemplo, o Oracle usa o Nesting SQL de três camadas para implementar a paginação, e o MySQL usa a palavra-chave limite para implementar o limite (mencionado no artigo anterior).
Este artigo é baseado no Java + Oracle e explica a implementação da camada de código .
Como geralmente vemos na paginação, o resultado da consulta retornado não apenas inclui o conjunto de resultados da consulta (lista), mas também inclui o número total de páginas (pagenum), a página atual (pageno) e outras informações. Portanto, encapsulamos uma classe Pagemodel de resultado da consulta, o código é o seguinte:
pacote kane; importar java.util.list; public classe pagemodel <e> {lista privada <e> list; privado int pageno; private int PageSize; private 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 pagageSize; } public void setPagesize (int PAGESIZE) {this.pagesize = Pagesize; } public int getTotalNum () {return totalNum; } public void SettallNum (int totalNum) {this.totalnum = totalnum; SettotalPage ((getTotalNum () % PagageSize) == 0? (getTotalNum () / Pagesize): (getTotalnum () / Pagesize + 1)); } public int getTotalPage () {return totalpage; } public void SettotalPage (int totalpage) {this.totalpage = totalpage; } // obtenha a primeira página public int getFirstpage () {return 1; } // obtenha a última página public int getLastpage () {return totalpage; } // Obtenha a página anterior public int getPrepage () {if (pageno> 1) retorna pageno - 1; retornar 1; } // Obtenha a última página public int getBackPage () {if (pageno <TotalPage) retorna pageno + 1; retornar totalpage; } // Obtenha a última página public int getBackPage () {if (pageno <TotalPage) retorna pageno + 1; retornar totalpage; } // Meça se 'Página inicial' e 'Página inicial' estão disponíveis public string isPreable () {if (pageno == 1) retorna "desativado"; retornar ""; } // meça se 'última página' e 'Próxima página' estão disponíveis public string isbackable () {if (pageno == TotalPage) retorna "desativado"; retornar ""; }} O uso de genéricos é permitir que a classe de paginação seja reutilizada. Por exemplo, ao consultar usuários, o objeto do usuário pode ser encapsulado e, ao consultar ordens de fluxo em finanças, a classe Flowcard pode ser encapsulada.
Tomamos o usuário da consulta como exemplo. O usuário seleciona a condição de consulta, primeiro ligue para o servlet para obter os parâmetros da consulta e solicite a camada lógica de negócios para obter a classe de resultado de encapsulamento paginada. A lógica de negócios chama a camada DAO para obter o conjunto de resultados e obter os registros no processo. O número de registros no processo é encapsulado na classe da página. Finalmente, o servlet define o resultado para a página JSP para exibir.
Primeiro, vamos explicar o servlet, o código é o seguinte:
pacote kane; importar java.io. javax.servlet.http.httpServletResponse; importar kane.userinfo; importar kane.userinfomanage; importar kane.pagemodel; classe pública userBasicsearchServlet estende httpServlet {private static long serialversionuid = 1l; private int PageSize = 0; @Override public void init (servletconfig config) lança servletexception {Pagesize = Integer.parseint (config.getInitParameter ("Pagesize")); } @Override Protected Void Doget (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {dopost (req, resp); } @Override Protected void DoPost (httpServletRequest Req, httpServletResponse resp) lança servletexception, ioexception {// 1. Obtenha parâmetros da página e construa o 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 ("Colera"); String no próximo ano = req.getParameter ("Comingyear"); UserInfo u = new userInfo (); U.SetSex (sexo); U.Sethome (casa); U.Setcolleage (colegas); U.setcy (vizinhança); // 2. Ligue para a lógica de negócios para obter o resultado do UserInfomanage UserInfomanage = new UserInfomanage (); PAGEMODEL <UserInfo> paginação = userInfomanage.UserBasicSearch (U, Pageno, PageSize); Lista <SuserInfo> userList = paginação.getList (); // 3. Encapsular o resultado de retorno StringBuffer resultXml = new StringBuffer (); tente {resultxml.append ("<? xml versão = '1.0' coding = 'gb18030'?>/n"); resultadoxml.append ("<sic>/n"); for (iterator <userInfo> iterator = userList.iterator (); iterator .hasnext ();) {userInfo userInfo = iterator.next (); resultadoxml.append ("<wata>/n"); resultxml.append ("/t <d>" + userinfo.getId () + "</id>/n"); resultxml.append ("/t <ruename>" + userinfo.gettruename () + "</ruename>/n"); resultxml.append ("/t <sex>" + userinfo.getSex () + "</sex>/n"); resultxml.append ("/t <home>" + userinfo.gethome () + "</home>/n"); resultxml.append ("/t <home>" + userinfo.gethome () + "</home>/n"); resultxml.append ("</data>/n"); } resultadoxml.Append ("<Paginação>/n"); resultxml.append ("/t <Total>" + paginação.gettotalPage () + "</ot total>/n"); resultxml.append ("/t <start>" + paginação.getfirstpage () + "</start>/n"); resultxml.append ("/t <nd>" + paginação.getLastpage () + "</nd>/n"); resultadoxml.append ("/t <Pageno>" + paginação.getpageno () + "</pageno>/n"); resultxml.append ("</gugination>/n"); resultadoxml.append ("</sic>/n"); } catch (Exceção e) {e.printStackTrace (); } writerponse (req, resp, resultxml.toString ()); } public void WriterSponse (solicitação httpServletRequest, resposta httpServletResponse, resultado da string) lança a ioexception {Response.SetContentType ("text/xml"); Response.setheader ("Cache-Control", "No-Cache"); Response.setheader ("conteúdo-tipo", "text/xml; charset = gb18030"); PrintWriter pw = Response.getWriter (); pw.Write (resultado); pw.close (); }} O código do objeto do usuário é o seguinte:
pacote kane; importar java.util.date; classe pública userInfo {private int id; Nome de usuário privado de string; senha de sequência privada; String private Truename; sexo privado de cordas; aniversário privado; Private String Home; Private String College; Private String no próximo ano; 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 = nome de usuário; } public string getPassword () {return senha; } public void setPassword (string senha) {this.password = senha; } public string gettruename () {return truename; } public void settruename (string truename) {this.truename = Truename; } public string getSex () {return Sex; } public void SetSex (sexo de string) {this.sex = sexo; } public data getBirthday () {return Birthday; } public void setbirthday (data de aniversário) {this.birthday = aniversário; } public string gethome () {retornar para casa; } public void sethome (string home) {this.home = home; } public String getColleAge () {Return College; } public void setColleAge (String Colleague) {this.colleage = College; } public string getcy () {return vinglyear; } public void setcy (string cy) {this. CheingYear = cy; }} Em seguida é o código da camada lógica de negócios, o código é o seguinte:
pacote kane; importar java.sql.connection; importar kane.dbutility; importar kane.pagemodel; public class userInfomanage {private userinfodao userInfodao = null; public userInfomanage () {userInfodao = new UserInfodao (); } public pagemodel <suserInfo> userBasicSearch (userInfo u, int pageno, int paGageSize) lança exceção {conexão conexão = null; PAGEMODEL <usuárioInfo> paginação = new PagEmodel <SuserInfo> (); tente {conexão = dbutility.getConnection (); Dbutility.SetAutocommit (conexão, false); pagination.SetList (userInfodao.getUserlist (U, Pageno, Pagesize)); paginação.SetPageno (Pageno); pagination.SetPagesize (PageSize); pagination.setTotalNum (userInfodao.gettotalnum (u)); Dbutility.Commit (conexão); } catch (Exceção e) {dbutility.rollback (conexão); E.PrintStackTrace (); lançar uma nova exceção (); } finalmente {dbutility.closeConnection (); } retornar paginação; }} Onde dbutilidade é a classe de encapsulamento de conexão do banco de dados.
Finalmente, a implementação do código da camada DAO é a seguinte:
pacote kane; importar java.sql.connection; importar java.sql.preparedStatement; importar java.sql.resultset; importar java.sql.sqLexception; import java.util.utilist; import kava.Util.Ulist; UserInfodao {list public <suserInfo> getUserList (userInfo userInfo, int pageno, int paGageSize) lança exceção {preparado estatamento pstmt = null; ResultSet rs = null; Lista <SuserInfo> userList = null; tente {string sql = "Selecione * de (selecione rownum num, u. * de (selecione * de user_info onde sexo =? e casa como '" + userInfo.gethome () + "%" + "' e colégue como '" + userinfo.getcolleage () + "" + "e o próximo ano" " rownum <=?) Onde num> =? "; userlist = new ArrayList <VeriSinfo> (); Conexão 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 ("home")); userlist.add (usuário); }} catch (sqLexception e) {e.printStackTrace (); lançar uma nova exceção (e); } finalmente {dbutility.closeresultset (rs); Dbutility.ClosePreparedStatement (PSTMT); } retornar UserList; } public int getTotalNum (userInfo userInfo) lança Exceção {preparado pstmt = null; ResultSet rs = null; int conting = 0; tente {string sql = "Selecione count (*) de user_info onde sexo =? e casa como '" + userInfo.gethome () + "%" + "' e faculdade como '" + userinfo.getcollege () + "%" + "' e o próximo ano" " + userinfo.getcy () +"%"" "; Conexão 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 (); lançar uma nova exceção (e); } finalmente {dbutility.closeresultset (rs); Dbutility.ClosePreparedStatement (PSTMT); } contagem de retorno; }} Finalmente, o servlet retorna o resultado à página JSP para exibir.
NOTA: O código DButility é o código que encapsula a operação de conexão do banco de dados, como segue:
pacote kane; importar java.sql.connection; importar java.sql.driverManager; importar java.sql.preparedStatement; importar java.sql.ResultSet; import java.sql.sqLexception; public class dbutility {private static <hemellocal> Thread> Thread> Thread> Thread> Thread> Thread> Thread> Thread> Thread> Thread> conexão estática pública getConnection () {conexão 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 (); }} retornar Conn; } // Configurações de encapsulamento A conexão envia automaticamente o public static void setautocomit (conexão Conn, sinalizador booleano) {try {Conn.SetAutocommit (Flag); } catch (sqLexception e) {e.printStackTrace (); }} // Definir transação commit public static void Commit (conexão conn) {try {Conn.Commit (); } catch (sqLexception e) {e.printStackTrace (); }} // Definir reversão de conexão do encapsulamento public static void Rollback (conexão conn) {try {Conn.rollback (); } catch (sqLexception e) {e.printStackTrace (); }} // encapsula a função que fecha a conexão, a estatamento preparado e o resultado public estático nulo estático closeconnection () {conexão conn = threadlocal.get (); tente {if (conn! = null) {conn.close (); Conn = null; threadlocal.remove (); }} catch (sqLexception e) {e.printStackTrace (); }} public static void ClosePreparedStatement (preparado PSTMT) {try {if (pstmt! = null) {pstmt.close (); pstmt = null; }} catch (sqLexception e) {e.printStackTrace (); }} public static void CloseResultSet (ResultSet rs) {try {if (rs! = null) {rs.close (); rs = nulo; }} catch (sqLexception e) {e.printStackTrace (); }}} Threadlocal é usado para garantir a consistência das transações, para que todas as operações do banco de dados do mesmo encadeamento usem a mesma conexão.
Neste ponto, uma simples implementação de código é concluída.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.