mysql jsp分页技术_jsp分页技术

如果一张表的数据有非常多,页面就需要分页展示,但一次性从数据库中读取全部的数据会给服务器带来巨大压力。jsp分页技术的设计思想来源于“select * from employee limit ?,?”这条sql语句,第一个“?”指查询的起始位置,第二个“?”代表偏移量。页面需要展示多少数据,每次就从服务器读取多少数据,大大减轻了服务器的压力。下面开始实现一个javaweb的demo帮助大家更好的理解。

一.准备工作:

MySQL中创建一张用例表

CREATE TABLEemployee(

empIdINT PRIMARY KEYAUTO_INCREMENT,

empNameVARCHAR(20),

dept_idVARCHAR(20)

);

往里面插入足够的数据(20条就够了)

二.demo采用mvc模式,首先编写JSP页面

表格代码如下

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

序号员工编号员工姓名${vs.count }${emp.empId }${emp.empName }

对不起,没有你要找的数据

当前${requestScope.pageBean.currentPage }/${requestScope.pageBean.totalPage }页  

首页

上一页

下一页

末页

View Code

三.表对应实体类的设计,分页的几个重要参数也封装到一个实体类里

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.entity;public classEmployee {private int empId; //员工id

private String empName; //员工名称

private int dept_id; //部门id

public intgetEmpId() {returnempId;

}public void setEmpId(intempId) {this.empId =empId;

}publicString getEmpName() {returnempName;

}public voidsetEmpName(String empName) {this.empName =empName;

}public intgetDept_id() {returndept_id;

}public void setDept_id(intdeptId) {

dept_id=deptId;

}

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.utils;importjava.util.List;importcn.cracker.entity.Employee;public class PageBean{private int currentPage = 1; //当前页, 默认显示第一页

private int pageCount = 4; //每页显示的行数(查询返回的行数), 默认每页显示4行

private int totalCount; //总记录数

private int totalPage; //总页数 = 总记录数 / 每页显示的行数 (+ 1)

private List pageData; //分页查询到的数据//返回总页数

public intgetTotalPage() {if (totalCount % pageCount == 0) {

totalPage= totalCount /pageCount;

}else{

totalPage= totalCount / pageCount + 1;

}returntotalPage;

}public void setTotalPage(inttotalPage) {this.totalPage =totalPage;

}public intgetCurrentPage() {returncurrentPage;

}public void setCurrentPage(intcurrentPage) {this.currentPage =currentPage;

}public intgetPageCount() {returnpageCount;

}public void setPageCount(intpageCount) {this.pageCount =pageCount;

}public intgetTotalCount() {returntotalCount;

}public void setTotalCount(inttotalCount) {this.totalCount =totalCount;

}public ListgetPageData() {returnpageData;

}public void setPageData(ListpageData) {this.pageData =pageData;

}

}

View Code

四.DbUtils和C3p0配置文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.utils;importjavax.sql.DataSource;importorg.apache.commons.dbutils.QueryRunner;importcom.mchange.v2.c3p0.ComboPooledDataSource;/*** 工具类*/

public classJdbcUtils {/*** 1. 初始化C3P0连接池*/

private staticDataSource dataSource;static{

dataSource= newComboPooledDataSource();

}/*** 2. 创建DbUtils核心工具类对象*/

public staticQueryRunner getQueryRuner(){return newQueryRunner(dataSource);

}

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

jdbc:mysql://localhost:3306/jdbc_demo

com.mysql.jdbc.Driver

root

root

3

6

1000

jdbc:mysql://localhost:3306/jdbc_demo

com.mysql.jdbc.Driver

root

root

3

6

1000

View Code

五.数据库访问层的设计(包含接口与实现)

实现查询分页的数据和总数据两个功能

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.dao;importcn.cracker.entity.Employee;importcn.cracker.utils.PageBean;public interfaceIEmployeeDao {public void getAll(PageBeanpb);public intgetTotalCount();

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.dao.impl;importjava.sql.SQLException;importjava.util.List;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanListHandler;importorg.apache.commons.dbutils.handlers.ScalarHandler;importcn.cracker.dao.IEmployeeDao;importcn.cracker.entity.Employee;importcn.cracker.utils.JdbcUtils;importcn.cracker.utils.PageBean;/*** 2. 数据访问层实现*/

public class EmployeeDao implementsIEmployeeDao {

@Overridepublic void getAll(PageBeanpb) {//2. 查询总记录数; 设置到pb对象中

int totalCount = this.getTotalCount();

pb.setTotalCount(totalCount);/** 问题: jsp页面,如果当前页为首页,再点击上一页报错!

* 如果当前页为末页,再点下一页显示有问题!

* 解决:

* 1. 如果当前页 <= 0; 当前页设置当前页为1;

* 2. 如果当前页 > 最大页数; 当前页设置为最大页数*/

//判断

if (pb.getCurrentPage() <=0) {

pb.setCurrentPage(1); //把当前页设置为1

} else if (pb.getCurrentPage() >pb.getTotalPage()){

pb.setCurrentPage(pb.getTotalPage());//把当前页设置为最大页数

}//1. 获取当前页: 计算查询的起始行、返回的行数

int currentPage =pb.getCurrentPage();int index = (currentPage -1 ) * pb.getPageCount(); //查询的起始行

int count = pb.getPageCount(); //查询返回的行数//3. 分页查询数据; 把查询到的数据设置到pb对象中

String sql = "select * from employee limit ?,?";try{//得到Queryrunner对象

QueryRunner qr =JdbcUtils.getQueryRuner();//根据当前页,查询当前页数据(一页数据)

List pageData = qr.query(sql, new BeanListHandler(Employee.class), index, count);//设置到pb对象中

pb.setPageData(pageData);

}catch(Exception e) {throw newRuntimeException(e);

}

}

@Overridepublic intgetTotalCount() {

String sql= "select count(*) from employee";try{//创建QueryRunner对象

QueryRunner qr =JdbcUtils.getQueryRuner();//执行查询, 返回结果的第一行的第一列

Long count = qr.query(sql, new ScalarHandler());returncount.intValue();

}catch(Exception e) {throw newRuntimeException(e);

}

}

}

View Code

六.业务层

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.service;importcn.cracker.entity.Employee;importcn.cracker.utils.PageBean;public interfaceIEmployeeService {/*** 分页查询数据*/

public void getAll(PageBeanpb);

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.service.impl;importcn.cracker.dao.IEmployeeDao;importcn.cracker.dao.impl.EmployeeDao;importcn.cracker.entity.Employee;importcn.cracker.service.IEmployeeService;importcn.cracker.utils.PageBean;/*** 3. 业务逻辑层,实现*/

public class EmployeeService implementsIEmployeeService {//创建Dao实例

private IEmployeeDao employeeDao = newEmployeeDao();

@Overridepublic void getAll(PageBeanpb) {try{

employeeDao.getAll(pb);

}catch(Exception e) {throw newRuntimeException(e);

}

}

}

View Code

七.控制层

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.cracker.servlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcn.cracker.entity.Employee;importcn.cracker.service.IEmployeeService;importcn.cracker.service.impl.EmployeeService;importcn.cracker.utils.PageBean;/*** 4. 控制层开发*/

public class IndexServlet extendsHttpServlet {//创建Service实例

private IEmployeeService employeeService = newEmployeeService();//跳转资源

privateString uri;public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {try{//1. 获取“当前页”参数; (第一次访问当前页为null)

String currPage = request.getParameter("currentPage");//判断

if (currPage == null || "".equals(currPage.trim())){

currPage= "1"; //第一次访问,设置当前页为1;

}//转换

int currentPage =Integer.parseInt(currPage);//2. 创建PageBean对象,设置当前页参数; 传入service方法参数

PageBean pageBean = new PageBean();

pageBean.setCurrentPage(currentPage);//3. 调用service

employeeService.getAll(pageBean); //【pageBean已经被dao填充了数据】//4. 保存pageBean对象,到request域中

request.setAttribute("pageBean", pageBean);//5. 跳转

uri = "/WEB-INF/list.jsp";

}catch(Exception e) {

e.printStackTrace();//测试使用//出现错误,跳转到错误页面;给用户友好提示

uri = "/error/error.jsp";

}

request.getRequestDispatcher(uri).forward(request, response);

}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {this.doGet(request, response);

}

}

View Code

PS:别忘了导入这几个lib包 c3p0-0.9.1.2.jar、commons-dbutils-1.6.jar、mysql-connector-java-5.1.12-bin.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值