Сразу после предыдущей статьи - принципы технологии пейджинга и значение и методы пейджинга (i). Эта статья продолжает анализировать технологию подкидки. В предыдущей статье рассказывается о простых принципах и внедрении технологии страниц. В этой статье глубоко анализируется внедрение кода технологии страниц.
В последней статье наилучшей реализацией пейджинга является лиц на уровне базы данных, а различные базы данных имеют разные реализации пейджинга. Например, Oracle использует трехслойное гнездование SQL для реализации пейджинга, а MySQL использует ключевое слово Limit для реализации лимита (упомянутое в предыдущей статье).
Эта статья основана на Java + Oracle и объясняет реализацию уровня кода .
Как мы обычно видим в пейджинге, возвращаемый результат запроса не только включает набор результатов запроса (список), но также включает общее количество страниц (pagenum), текущую страницу (Pageno) и другую информацию. Поэтому мы инкапсулируем класс Pagemodel результата запроса, код заключается в следующем:
Пакет Kane; Import java.util.list; Public Class Pagemodel <e> {private list <e> list; Частный Int Pageno; частный int pageSize; частный int totalnum; частная общая страница; public List <e> getList () {return List; } public void SetList (список <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 cetTotOtalNum (int totalnum) {this.totalnum = totalnum; SetTotalPage ((getTotalNum () % pageSize) == 0? (getTotalNum () / pageSize): (getTotalNum () / pagesize + 1)); } public int getTotalPage () {return TotalPage; } public void cetTotoTalPage (int totalPage) {this.TotalPage = totalPage; } // Получить первую страницу public int getFirstPage () {return 1; } // Получить последнюю страницу public int getLastPage () {return TotalPage; } // Получить предыдущую страницу public int getPrepage () {if (pageno> 1) вернуть Pageno - 1; возврат 1; } // Получить последнюю страницу public int getbackPage () {if (pageno <totalPage) return pageno + 1; вернуть общую страницу; } // Получить последнюю страницу public int getbackPage () {if (pageno <totalPage) return pageno + 1; вернуть общую страницу; } // Измерить, доступны ли «домашняя страница» и «первая страница» общедоступную строку isprable () {if (pageno == 1) return "disabled"; возвращаться ""; } // Измерить, доступны ли «последняя страница» и «следующая страница» public String isbackable () {if (pageno == totalPage) return "Отключен"; возвращаться ""; }} Использование дженериков заключается в том, чтобы позволить повторному использованию класса подкачки. Например, при запросе пользователей можно инкапсулировать пользовательский объект, а при запросе заказов потока в финансах можно инкапсулировать класс Flowcard.
Мы принимаем пользователя запроса в качестве примера. Пользователь выбирает условие запроса, сначала вызовите сервлет, чтобы получить параметры запроса, а затем запросить слой бизнес -логики, чтобы получить класс результатов лиц, полученной от лиц. Бизнес -логика вызывает уровень DAO, чтобы получить набор результатов и получить записи в процессе. Количество записей в процессе инкапсулируется в класс страницы. Наконец, сервлет устанавливает результат на страницу JSP для отображения.
Во -первых, давайте объясним сервлет, код выглядит следующим образом:
Пакет Kane; импорт java.io.*; import java.util.*; import javax.servlet.servletconfig; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletresponse; import kane.userinfo; import kane.userinfoansage; import kane.pagemodel; открытый класс userbasicsearchservlet расширяет httpservlet {private static final long serialversionuid = 1L; private int pageSize = 0; @Override public void init (конфигурация ServletConfig) Throws ServletException {pagesize = integer.parseint (config.getinitParameter ("pagesize")); } @Override Protected void Doget (httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {dopost (req, resp); } @Override Protected void Dopost (httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {// 1. Получить параметры страницы и построить параметр объекта int pageno = integer.parseint (req.getParameter ("pageno")); String sex = req.getParameter ("пол"); String home = req.getParameter ("newlocation"); String college = req.getParameter ("коллеги"); Строка наступающего года = req.getParameter ("getyyear"); UserInfo u = new userInfo (); u.setsex (sex); U.Sethome (Home); u.setCollege (коллега); u.setcy (getyeear); // 2. Позвоните в бизнес -логику, чтобы получить набор результатов userInfomanage userInfomanage = new userInfomanage (); Pagemodel <userInfo> pagination = userInfomanage.userbasicsearch (U, Pageno, PageSize); Список <userInfo> userList = pagination.getList (); // 3. Инкапсулируйте результат возврата stringBuffer resultXml = new StringBuffer (); try {resultxml.append ("<? xml version = '1.0' Encoding = 'gb18030'?>/n"); resultXml.append ("<root>/n"); for (iterator <userInfo> iterator = userlist.iterator (); iterator .hasnext ();) {userInfo userInfo = iterator.next (); resultXml.Append ("<TACATE>/n"); resultXml.append ("/t <id>" + userinfo.getid () + "</id>/n"); resultXml.append ("/t <truename>" + userinfo.gettruename () + "</truename>/n"); resultXml.append ("/t <ses>" + userInfo.getSex () + "</sex>/n"); resultXml.append ("/t <home>" + userInfo.gethome () + "</home>/n"); resultXml.append ("/t <home>" + userInfo.gethome () + "</home>/n"); resultXml.append ("</data>/n"); } resultxml.append ("<<<<<<<<<<<bebagination>/n"); resultXml.append ("/t <tote>" + 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 () + "</pageno>/n"); resultXml.append ("</pagination>/n"); resultXml.append ("</root>/n"); } catch (Exception e) {e.printstackTrace (); } writerSponse (req, resp, resultxml.toString ()); } public void writerSponse (httpservletRequest, httpservletresponse ответ, Result Result) Throws ioException {response.setContentType ("text/xml"); response.setheader («Контроль кэша», «без каша»); response.setheader ("Content-type", "text/xml; charset = gb18030"); Printwriter pw = response.getWriter (); pw.write (результат); pw.close (); }} Объектный код пользователя выглядит следующим образом:
пакет kane; import java.util.date; открытый класс userinfo {private int id; частное имя пользователя; Private String Password; Приватная строка TrueName; частный строковый секс; частное свидание по случаю дня рождения; частная строка дома; частный строковый колледж; частная строка наступает год; 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 пароль; } public void setPassword (String password) {this.password = password; } public String getTrueName () {return TrueName; } public void setTruEname (String TrueName) {this.truename = trueName; } public String getSex () {return Sex; } public void setsex (строка Sex) {this.sex = sex; } public date getBirthDay () {return Birthday; } public void setBirthDay (дата рождения) {this.BirthDay = день рождения; } public String gethome () {return Home; } public void sethome (String Home) {this.home = home; } public String getCollegeeage () {return College; } public void setColleage (String Colleague) {this.colleage = college; } public String getCy () {return gearyear; } public void setcy (string cy) {this. comeyear = cy; }} Следующим является код уровня бизнес -логики, код выглядит следующим образом:
пакет kane; import java.sql.connection; import kane.dbutility; import kane.pagemodel; открытый класс userinfomanage {private user userfodao userinfodao = null; public userInfomanage () {userInfodao = new userInfodao (); } public pagemodel <userInfo> userBasicsearch (userInfo U, int pageno, int pagesize) Throws Exception {connection Connection = null; Pagemodel <userInfo> pagination = new PageModel <userInfo> (); try {connection = dbutility.getConnection (); Dbutility.setautocommit (соединение, false); pagination.setlist (userinfodao.getuserlist (u, pageno, pagesize)); Pagination.SetPageno (Pageno); Pagination.SetPagesize (PageSize); pagination.settotalnum (userinfodao.gettotalnum (u)); Dbutility.commit (соединение); } catch (Exception e) {dbutility.rollback (connection); e.printstacktrace (); бросить новое исключение (); } наконец {dbutility.closeConnection (); } вернуть страниц; }} Где Dbutility - это класс инкапсуляции подключения базы данных.
Наконец, реализация кода уровня DAO выглядит следующим образом:
Пакет Kane; импорт java.sql.connection; import java.sql.preparedStatement; импорт java.sql.resultset; import java.sql.sqlexception; импорт java.util.arraylist; import java.util.list; импорт java.util.list. UserInfodao {public list <userInfo> getUserlist (userInfo userInfo, int pageno, int pagesize) вызывает исключение {подготовлено pstmt = null; Результат RS = NULL; Список <userInfo> userList = null; Попробуйте {string sql = "select * from (select rownum num, u. * from (select * from user_info, где Sex =? и Home Like '" + userInfo.gethome () + "%" + "' и коллега, как" " + userInfo.getCollege () +"%" +" и приезжающий год, как " + userInfo.getClecy ()"%"%" + u u use userInfo.get () + "%" + "%" + ")". rownum <=?) Где num> =? "; userList = new 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 (); 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 (пользователь); }} catch (sqlexception e) {e.printstacktrace (); бросить новое исключение (e); } наконец {dbutility.closeresultset (rs); Dbutility.closepreparedStatement (PSTMT); } return userList; } public int getTotalNum (userInfo userInfo) бросает исключение {PrecateStatement pStmt = null; Результат RS = NULL; int count = 0; try {string sql = "select count (*) из user_info, где Sex =? и Home Like '" + userInfo.gethome () + "%" + "" и колледж, как " + userInfo.getCollege () +"%" +"' и наступающий год, как '" + userInfo.getcy () +"%"' '"; Соединение 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); } return Count; }} Наконец, сервлет возвращает результат на страницу JSP для отображения.
Примечание. Код DBUtility - это код, который инкапсулирует операцию подключения к базе данных следующим образом:
Пакет Kane; импорт java.sql.connection; import java.sql.drivermanager; импорт java.sql.preparedStatement; импорт java.sql.resultset; импорт java.sql.sqlexception; открытый класс dbutility {private Static Threadlocal <nealy> Threadlocal = new Threadlocalcal {private State Threadlocal <neachal> Threadlocal = new Threadlocal {private State Threadlocal <neachal> Threadlocal = new Threadlocal. 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; } // Настройки инкапсуляции Автоматически подчиняет публичную статическую void setautocommit (connection conn, boolean flag) {try {conn.setautocommit (flag); } catch (sqlexception e) {e.printstacktrace (); }} // Установить коммит транзакции Public Static void Commit (Connection Conn) {try {conn.commit (); } catch (sqlexception e) {e.printstacktrace (); }} // инкапсуляция Установите соединение Откат обстановки static void hollback (connection conn) {try {conn.rollback (); } catch (sqlexception e) {e.printstacktrace (); }} // инкапсулируйте функцию, которая закрывает соединение, подготовку и результаты Public Static void sceeConnection () {Connection conn = threadlocal.get (); попробуйте {if (conn! = null) {conn.close (); conn = null; threadlocal.remove (); }} catch (sqlexception e) {e.printstacktrace (); }} public static void closePrepRepRedStatement (подготовка pstmt) {try {if (pstmt! = null) {pstmt.close (); pstmt = null; }} catch (sqlexception e) {e.printstacktrace (); }} public static void scosteresultset (resultset rs) {try {if (rs! = null) {rs.close (); rs = null; }} catch (sqlexception e) {e.printstacktrace (); }}} Threadlocal используется для обеспечения согласованности транзакций, так что все операции базы данных одного и того же потока используют одно и то же соединение.
На этом этапе простая реализация кода завершена.
Вышеуказанное - все содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.