JSP分页(MySql+c3p0+dbutils)
来源:互联网 发布:一淘和淘宝哪个比较好 编辑:程序博客网 时间:2024/06/06 19:24
为什么要对数据进行分页?当数据较多时,页面就会变的很庞大,不仅会影响到用户的使用,而且还有加重服务器的负担。下面简单的实现了数据的分页。
第一步:导入相应的jar包
需要导入c3p0,dbutils,mysql驱动等jar包。
第二步:创建数据库和表, 配置c3p0, 创建工具类,User类
创建数据库,并准备测试数据(可以自行生成)
create database contacts;use contacts;create table users(id varchar(32),username varchar(36),password varchar(36),constraint user_pk primary key(id));
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?><c3p0-config><!-- 默认配置,只可以出现一次 --><default-config><!-- 连接超时设置30秒 --><property name="checkoutTimeout">30000</property><!-- 30秒检查一次connection的空闲 --><property name="idleConnectionTestPeriod">30</property><!--初始化的池大小 --><property name="initialPoolSize">2</property><!-- 最多的一个connection空闲时间 --><property name="maxIdleTime">30</property><!-- 最多可以有多少个连接connection --><property name="maxPoolSize">10</property><!-- 最少的池中有几个连接 --><property name="minPoolSize">2</property><!-- 批处理的语句 --><property name="maxStatements">50</property><!-- 每次增长几个连接 --><property name="acquireIncrement">3</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl"><![CDATA[jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8]]></property><property name="user">root</property><property name="password">123456</property></default-config><named-config name="contacts"><property name="checkoutTimeout">1000</property><property name="idleConnectionTestPeriod">30</property><property name="initialPoolSize">2</property><property name="maxIdleTime">30</property><property name="maxPoolSize">5</property><property name="minPoolSize">2</property><property name="maxStatements">50</property><property name="acquireIncrement">3</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl"><![CDATA[jdbc:mysql://127.0.0.1:3306/contacts?useUnicode=true&characterEncoding=UTF-8]]></property><property name="user">root</property><property name="password">123456</property></named-config> </c3p0-config>
DataSourceUtil.java
package cn.zq.util;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DataSourceUtil {private static DataSource ds;static{ds = new ComboPooledDataSource("contacts"); }public static DataSource getDataSource(){return ds;}public static Connection getConnection() throws SQLException{return ds.getConnection();}}
User.java
package cn.zq.domain;public class User {private String id;private String username;private String password;public User() {}public User(String id, String username, String password) {this.id = id;this.username = username;this.password = password;}public void setId(String id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public String toString() {return "User [id=" + id + ", username=" + username + ", password="+ password + "]";}public String getId() {return id;}public String getUsername() {return username;}public String getPassword() {return password;}}
第三步:创建并配置servlet,创建显示页面
UserServlet.java
package cn.zq.servlet;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ScalarHandler;import cn.zq.domain.User;import cn.zq.util.DataSourceUtil;public class UserServlet extends HttpServlet {public void init() throws ServletException {try {Class.forName("cn.zq.util.DataSourceUtil");} catch (ClassNotFoundException e) {e.printStackTrace();}}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//which page to show.String pn = request.getParameter("pn");int pageNum = 1;try{pageNum = Integer.parseInt(pn);}catch(Throwable t){//ignore}int pageSize = 10;QueryRunner run = new QueryRunner(DataSourceUtil.getDataSource());try {String sql = "SELECT COUNT(1) from users";int totalRecord = run.query( sql, new ScalarHandler<Long>() ).intValue();System.err.println("totalRecord = " + totalRecord);//(11 + ( 10 -1))/10int pageCount = (totalRecord + (pageSize - 1)) / pageSize;if(pageNum < 0){pageNum = 1;}if(pageNum > pageCount){pageNum = pageCount;}//0, 10 10, 20int m = (pageNum - 1)*pageSize;int n = pageSize;sql = "SELECT * FROM users LIMIT ?, ?";List<User> userList = run.query(sql, new BeanListHandler<User>(User.class), m, n);//分页显示多少个页号int no = 10;int beginPageIndex = 0;int endPageIndex = 0;if(pageCount <= no){beginPageIndex = 1;endPageIndex = pageNum;}else{beginPageIndex = pageNum - no/2;endPageIndex = beginPageIndex + (no -1);if(beginPageIndex < 1){beginPageIndex = 1;endPageIndex = no;}if(endPageIndex > pageCount){endPageIndex = pageCount;beginPageIndex = endPageIndex - (no - 1);}}request.setAttribute("pageCount", pageCount);request.setAttribute("totalRecord", totalRecord);request.setAttribute("pageNum", pageNum);request.setAttribute("beginPageIndex", beginPageIndex);request.setAttribute("endPageIndex", endPageIndex);request.setAttribute("userList", userList);request.getRequestDispatcher("/page/user.jsp").forward(request, response);;} catch (Exception e) {e.printStackTrace();}}}
web.xml
<servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>cn.zq.servlet.UserServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/servlet/UserServlet</url-pattern> </servlet-mapping>
/page/user.jsp
<%@ page pageEncoding="utf-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <table border="1"> <tr> <th>INDEX</th> <th>ID</th> <th>USERNAME</th> <th>PASSWORD</th> </tr> <c:forEach var="user" items="${userList}" varStatus="stat"> <tr> <td>${stat.index + 1}</td> <td>${user.id }</td> <td>${user.username }</td> <td>${user.password }</td> </tr> </c:forEach> </table> <div id="page"> <c:if test="${pageNum != 1 }"> <a href="<c:url value='/servlet/UserServlet?pn=1'/>">首页</a> <a href="<c:url value='/servlet/UserServlet?pn=${pageNum-1 }'/>"><上一页</a> </c:if> <c:forEach begin="${beginPageIndex }" end="${endPageIndex }" step="1" var="num"> <c:choose> <c:when test="${num != pageNum}"> <a href="<c:url value='/servlet/UserServlet?pn=${num }'/>">${num }</a> </c:when> <c:otherwise> ${num } </c:otherwise> </c:choose> </c:forEach> <c:if test="${pageNum != pageCount}"> <a href="<c:url value='/servlet/UserServlet?pn=${pageNum+1 }'/>">下一页></a> <a href="<c:url value='/servlet/UserServlet?pn=${pageCount}'/>">尾页</a> </c:if> <input id="pn" type="text" name="pn" size="4"/> <button onclick="go()">Go</button> 当前第${pageNum }页,总共${pageCount }页,共条${totalRecord }记录 <script> function go(){ var input = document.getElementById("pn"); if(isNaN(input.value) || input.value.indexOf(".") != -1){ alert("请输入整数!"); }else if(input.value < 1 || input.value > ${pageCount}){ alert("请输入1到${pageCount}之间的整数"); }else{ window.location.href = "<c:url value='/servlet/UserServlet?pn=' />"+input.value; } input.value = ""; input.focus(); } </script> </div> </body></html>
启动tomcat并访问:
小结:通过上面的代码能基本的实现数据的分页显示,但是数据显示比较的零散,应该将上面的数据进行封装再传递到页面进行显示(java对数据进行封装很重要,不然这些数据显得彼此之间都没有关系),为了方便代码的重要应该对数据进行封装。
改造后的代码如下:
Page.java
package cn.zq.domain;import java.util.Collection;public class Page {//每页显示多少条记录private int pageSize = 10;//显示多少个页号private int no = 10;//总记录数private int totalRecord;//分页数private int pageCount;//当前显示的页号private int pageNum;//分页起始页号private int beginPageIndex;//分页结束页号private int endPageIndex;//存放数据private Collection cs;/** * * @param pageNum 页号 * @param totalRecord 总记录数 * @param cs beans */public Page(int pageNum, int totalRecord, Collection cs){this.pageNum = pageNum;this.totalRecord = totalRecord;this.cs = cs;//计算分页数this.pageCount = (totalRecord + (pageSize - 1))/pageSize;if(this.pageNum < 0){this.pageNum = 1;}else if(this.pageNum > pageCount){this.pageNum = pageCount;}//计算开始页号和结束页号if(pageCount <= no){beginPageIndex = 1;endPageIndex = pageCount;}else{beginPageIndex = (pageNum - no/2) + 1;endPageIndex = beginPageIndex + (no-1);if(beginPageIndex < 1){beginPageIndex = 1;endPageIndex = no;}if(endPageIndex > pageCount){endPageIndex = pageCount;beginPageIndex = endPageIndex - (no - 1);}}}public int getPageSize() {return pageSize;}public void setCs(Collection cs) {this.cs = cs;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public void setNo(int no) {this.no = no;}public int getNo() {return no;}public int getTotalRecord() {return totalRecord;}public int getPageCount() {return pageCount;}public int getPageNum() {return pageNum;}public int getBeginPageIndex() {return beginPageIndex;}public int getEndPageIndex() {return endPageIndex;}public Collection getCs() {return cs;}}
/page/user.jsp
<%@ page pageEncoding="utf-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <table border="1"> <tr> <th>INDEX</th> <th>ID</th> <th>USERNAME</th> <th>PASSWORD</th> </tr> <c:forEach var="user" items="${page.cs}" varStatus="stat"> <tr> <td>${stat.index + 1}</td> <td>${user.id }</td> <td>${user.username }</td> <td>${user.password }</td> </tr> </c:forEach> </table> <div id="page"> <c:if test="${page.pageNum != 1 }"> <a href="<c:url value='/servlet/UserServlet?pn=1'/>">首页</a> <a href="<c:url value='/servlet/UserServlet?pn=${page.pageNum-1 }'/>"><上一页</a> </c:if> <c:forEach begin="${page.beginPageIndex }" end="${page.endPageIndex }" step="1" var="num"> <c:choose> <c:when test="${num != page.pageNum}"> <a href="<c:url value='/servlet/UserServlet?pn=${num }'/>">${num }</a> </c:when> <c:otherwise> ${num } </c:otherwise> </c:choose> </c:forEach> <c:if test="${page.pageNum != page.pageCount}"> <a href="<c:url value='/servlet/UserServlet?pn=${page.pageNum+1 }'/>">下一页></a> <a href="<c:url value='/servlet/UserServlet?pn=${page.pageCount}'/>">尾页</a> </c:if> <input id="pn" type="text" name="pn" size="4"/> <button onclick="go()">Go</button> 当前第${page.pageNum }页,总共${page.pageCount }页,共条${page.totalRecord }记录 <script> function go(){ var input = document.getElementById("pn"); if(isNaN(input.value) || input.value.indexOf(".") != -1){ alert("请输入整数!"); }else if(input.value < 1 || input.value > ${page.pageCount}){ alert("请输入1到${page.pageCount}之间的整数"); }else{ window.location.href = "<c:url value='/servlet/UserServlet?pn=' />"+input.value; } input.value = ""; input.focus(); } </script> </div> </body></html>
总结:根据一定的算法,对数据进行分页处理,上面只是给出了实例代码,个人可以根据实际的需求给出自己的算法。上面的代码还有很多地方需要优化,比如:查询总记录数和数据,应该通过service层来获取,而不应该直接在servleyt中进行数据库的访问操作,页面的显示也有待美化,待以后完善......
1 0
- JSP分页(MySql+c3p0+dbutils)
- Dbutils + C3P0实现oracle分页
- mysql:day7--开源数据库连接池(DBCP/C3P0)、DBUTILS及ext-dbutils扩展包)
- DBUtils+C3P0封装
- c3p0+DButils操作数据库
- JSP+mysql简单分页
- jsp+mysql分页实现
- JSP+MYSQL分页技术
- jsp+mysql分页
- JSP+MYSQL进行分页
- sqlserver mysql jsp 分页
- jsp+mysql实现分页
- jsp+jdbc+MySQL分页
- JDBC、mysql、jsp分页
- jsp+MySQL实现分页
- Jsp-MySQL数据库分页
- c3P0结合DBUtils操作数据库
- MySQL+DBUtils+C3P0+ Servlet+HTML完成Web端登陆验证案例实现
- 基于Qt移动应用的消息推送服务原理与应用
- keil多文件组织方法 - 道客巴巴
- jQuery替换textarea中的换行(转)
- 离职的正确原因
- [LeetCode]Binary Tree Level Order Traversal
- JSP分页(MySql+c3p0+dbutils)
- WebDriver中执行JavaScript
- eclipse cocos2dx Couldn't load cocos2dcpp from loader
- O(n)时间求字符串的最长回文子串
- ssh中数据库配置文件加密方法
- 佐臻Jorjin WLAN/BT/FM 模组WG7310 WLAN关闭后,蓝牙无法打开
- luci的国际化(多语言)
- vim自动补全之搭建
- 纪念博客诞生