分页的实现

想要实现如下分页效果:

分页实现逻辑:

关键代码如下:

page.jsp


<%@ page language="java" contentType="text/html;
charset=UTF-8"
 pageEncoding= "UTF-8"%>

<%@taglib uri= "http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>

<head>

<base href= "http://${pageContext.request.serverName
}:${pageContext.request.serverPort }${pageContext.request.contextPath }/" />

<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8"
>

<title> Insert
title here</title >

<style type= "text/css">

#pageCode{

width: 30px;

border: 1px
solid black
;

}

#current{

border: 1px
solid black
;

background-color: #bbffaa ;

}

</style>

<script type= "text/javascript" src="script/jquery-1.7.2.js" ></script>

<script type= "text/javascript">

$(function(){

//onchange在文本框内容发生改变时触发事件

$( "#pageCode").change(function (){

var pageCode=$.trim(this.value);

//如果输入为空

if(pageCode=="" ){

this.value=this .defaultValue;//恢复为默认值

return false ;

}

//如果输入值不是一个数字

if(isNaN(pageCode)){

this.value=this .defaultValue;//恢复为默认值

return false ;

}

//通过window.location对象实现页面的跳转

window.location.href= "DataServlet?method=getPage&pageNo=" +pageCode;

});

});

</script>

</head>

<body>

<!--显示页面上的数据  -->

<c:forEach items="${page.list
" var ="data">

${data }<br >

</c:forEach >

<!-- 如果有上一页的话就显示以下的超链接 -->

<c:if test="${page.hasPrev
">

<a href="/Page/DataServlet?method=getPage&pageNo=1" >首页 </a>

<a href="/Page/DataServlet?method=getPage&pageNo= ${page.prevNo
}"> 上一页</a >

</c:if >

<!--当前页码大于3时显示第一页的超链接  -->

<c:if test="${page.pageNo>3
">

<a href="/Page/DataServlet?method=getPage&pageNo=1" >1 </a>

</c:if >

<!--当前页码>4 显示三个点“...”  -->

<c:if test="${page.pageNo>4
">...</c:if >

<!-- 从1开始 到总页数结束 -->

<c:forEach begin="1" end= "${page.totalPageNum
}" var="num" >

<c:choose>

<c:when test= "${num==page.pageNo
}"><span id="current" >${num
}</ span></c:when >

<c:when test= "${num>=page.pageNo-2
&& num<=page.pageNo+2 }" >${num
}&nbsp; </c:when>

</c:choose>

</c:forEach >

<!--当前页码+3小于总页数时   显示三个点“...”  -->

<c:if test="${page.pageNo+3<page.totalPageNum
}">...</c:if >

<c:if test="${page.pageNo+3<page.totalPageNum} ">

<a href="/Page/DataServlet?method=getPage&pageNo= ${page.totalPageNum}"> ${page.totalPageNum}</a >

</c:if >

<!--如果还有当前页还有下一页则显示下一页和末页-->

<c:if test="${page.hasNext
">

<a href="/Page/DataServlet?method=getPage&pageNo= ${page.nextNo
}"> 下一页</a >

<a href="/Page/DataServlet?method=getPage&pageNo= ${page.totalPageNum}"> 末页</a >

</c:if >

共有 ${page.totalItemNum }条记录

前往第 <input id= "pageCode" type ="text" name="pageCode" value="${page.pageNo
"/>页

</body>

</html>

DataServlet.java


public class DataServlet extends BaseServlet {

private static final long serialVersionUID = 1L ;

private DataService dataService = new DataServiceImpl();

protected void getDataList( HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

List <Data> dataList = dataService .getDataList() ;

WebUtils .forward( request, response , "dataList" , dataList, "/data.jsp" );

}

protected void getPage( HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//获取页码

String pageNoStr = request.getParameter( "pageNo");

//获取Page对象

Page <Data> page = dataService.getPage (pageNoStr );

//传到前台去

//WebUtils.forward(request, response, attrName,
attrVal, targetPath);

WebUtils .forward( request, response , "page" , page, "/page.jsp" );

}

}

BaseServlet .java



public abstract class BaseServlet extends HttpServlet {

private static final long serialVersionUID = 1L ;

@Override

protected void doGet( HttpServletRequest request, HttpServletResponse response )

throws ServletException, IOException {

doPost( request, response );

}

@Override

protected void doPost( HttpServletRequest request, HttpServletResponse response )

throws ServletException, IOException {

request .setCharacterEncoding( "UTF-8");

String methodName = request.getParameter( "method");

try {

Method method =

this. getClass() .getDeclaredMethod(

methodName ,

HttpServletRequest .class ,

HttpServletResponse .class

);

method .setAccessible( true);

method .invoke(this, request, response);

catch (Exception e ) {

e .printStackTrace() ;

}

}

}

DataServiceImpl.java


public class DataServiceImpl implements DataService {

private DataDao dataDao = new DataDaoImpl ();

@Override

public List< Data> getDataList() {

return dataDao .getDataList() ;

}

@Override

public Page< Data> getPage(String pageNoStr) {

//1.取得总记录数

int totalItemNum = dataDao.getTotalItemNum ();

//2.通过参数pageNoStr和参数totalItemNum来创建page对象

//内部纠正了pageNo值

Page <Data> page= new Page<>(pageNoStr, totalItemNum);

//3.获取list数据,调用page.getPageNo()得到有效值

List <Data> list = dataDao.getPageList (page .getPageNo(), Page .pageSize) ;

page .setList(list);

//4.组装完page对象后将其返回

return page;

}

}

DataDaoImpl .java


public class DataDaoImpl extends DaoImpl <Data> implements DataDao {

@Override

public List< Data> getDataList() {

Connection connection = getConnection() ;

String sql = "select
data_id dataId,data_name dataName from datatable";

List <Data> dataList = this .getBeanList (sql , connection);

releaseConn(connection );

return dataList;

}

@Override

public List< Data> getPageList(int pageNo, int pageSize) {

Connection connection = JDBCUtils.getConnection() ;

String sql = "SELECT
data_id dataId,data_name dataName FROM datatable LIMIT ?,?";

List <Data> list = this .getBeanList (sql , connection, (pageNo - 1) *pageSize, pageSize);

JDBCUtils .releaseConn( connection);

return list;

}

@Override

public int getTotalItemNum() {

Connection connection = JDBCUtils.getConnection() ;

String sql = "SELECT
COUNT(*) FROM datatable";

//执行count函数的SQL语句的Java函数返回的Java类型是Long

//将Long包装类型转换为long基本数据类型

long itemNum = this. getSigleValue(sql , connection);

JDBCUtils .releaseConn( connection);

//在返回时,将long基本数据类型强转为 int基本数据类型

return (int) itemNum;

}

}

DataDaoImpl.java


public class DataDaoImpl extends DaoImpl <Data> implements DataDao {

@Override

public List< Data> getDataList() {

Connection connection = JDBCUtils.getConnection() ;

String sql = "select
data_id dataId,data_name dataName from datatable";

List <Data> dataList = this .getBeanList (sql , connection);

JDBCUtils .releaseConn( connection);

return dataList;

}

@Override

public List< Data> getPageList(int pageNo, int pageSize) {

Connection connection = JDBCUtils.getConnection() ;

String sql = "SELECT
data_id dataId,data_name dataName FROM datatable LIMIT ?,?";

List <Data> list = this .getBeanList (sql , connection, (pageNo - 1) *pageSize, pageSize);

JDBCUtils .releaseConn( connection);

return list;

}

@Override

public int getTotalItemNum() {

Connection connection = JDBCUtils.getConnection() ;

String sql = "SELECT
COUNT(*) FROM datatable";

//执行count函数的SQL语句的Java函数返回的Java类型是Long

//将Long包装类型转换为long基本数据类型

long itemNum = this. getSigleValue(sql , connection);

JDBCUtils .releaseConn( connection);

//在返回时,将long基本数据类型强转为 int基本数据类型

return (int) itemNum;

}

}

时间: 2024-11-02 23:34:11

分页的实现的相关文章

python__Django 分页

自定义分页的类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by Mona on 2017/9/20 from django.utils.safestring import mark_safe class Paginator: ''' 页码的格式依赖于bootstrap: 使用案例: from django.shortcuts import render,redirect,HttpResponse from app01.mod

ajax+分页

<!DOCTYPE html><html><head lang="zh-cn"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><meta http-equiv="X-UA-Compat

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句.如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作. 一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高.如果所有的页面被访问的频率相同,那么这样的查询平均需要访问半个表的数据.要优化这样的查询,要么实在页面中限制分页的数量,

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

关于分页SQL的小总结

findPage 和findPageTotal条件分页中的条件 较为复杂点的关联查询 有取别名的 <select id="findPage" resultMap="MinOrderInfo" parameterType="map"> SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.CAR_BRAND_NAME c

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

TODO:数据库优化之分页

本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返回m个结果,要是匹配的结果不到m个,则返回匹配数据量的结果,m是指定上限数量,而不是下限数量: c.sort({"name": 1,"address":-1}),1表示升序,-1表示降序. 使用skip跳过少量的文档还可以.但是数据量非常多的话,skip就会变得非常慢,每个数据库都会有这种情况,所

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

easymall项目的商品删除,前台商品分页,商品详情,购物车模块

简单的挑选一下昨天所学的重点知识模块,以备后续的复习 一.购物车模块1.1购物车两种实现的区别:!!!!!!!! 用session保存  缺点:浏览器关闭,session失效时保存在session中购物信息将会消失  后续优化,将购买的信息除了保存在session中以外,还要将购物的信息保存在cookie中,这样  就解决了浏览器关闭购买商品信息丢失的问题(但是解决不了跟换电脑信息丢失的问题)  优点:不用操作数据库,可以减少数据库访问压力 数据库中:  缺点:只用登录的用户才能添加购物车