02_分页_02_步步优化

【缺点一 : 总记录数过多,页码条冗长】

如果页数过多,将数据库中user表的数据增加到500多条,

会出现以下情况:

所以要在页面展示的数据数量做一个限制,优化成如百度的这样限制10条页码数。

【优化】

修改【PageBean.java】中的【getPageBar()方法】

    public int[] getPagebar() {
        int pagebar[] =new int[10];  //限制每页显示10条页码数
        int startpage;  //页面展示的起始页码数
        int endpage;    //页面展示的结束页码数
        if(this.totalpage<=10){  //如果总页数本身就<=10,无需优化
            startpage=1;
            endpage=this.totalpage;
        }else{    //总页数大于10
            startpage=this.currentpage-4;
            endpage=this.currentpage+5;  //1 2 3 4 X 5 6 7 8 9 10
            if(startpage<1){  //假如当前页为2,currentpage-4会导致startpage=-2
                startpage=1;
                endpage=10;
            }
            if(endpage>this.totalpage){//假如总页数为30,当前页为28,currentpage+5会导致endpage=33
                endpage=this.totalpage;
                startpage=endpage-9;
            }
        }

        int index=0;
        for(int i=startpage;i<=endpage;i++){
            pagebar[index++]=i;
        }

        this.pagebar = pagebar;
        return this.pagebar;
    }

【运行结果】

【缺点二:页码条,当前页的颜色应该不同(比如变为红色),且不应该有当前页的超链接】

这里的优化在listUser.jsp中,优化的代码如下:

【listUser.jsp】

<a href="javascript:void(0)" onclick="gotopage(${pageBean.previouspage})">上一页</a>
        <c:forEach var="pagenum" items="${pageBean.pagebar}">
                <!--优化代码,即加一个判断即可->      <!-- 如果是当前页码,不显示超链接,并把颜色变为红色 -->
            <c:if test="${pagenum==pageBean.currentpage }">
                <font color="red">${pagenum}</font>
            </c:if>
            <!-- 如果不是当前页码,显示超链接,颜色默认 -->
            <c:if test="${pagenum!=pageBean.currentpage }">
                <a href="javascript:void(0)" onclick="gotopage(${pagenum})">${pagenum} </a>
            </c:if>

        </c:forEach>
       &nbsp;
    <a href="javascript:void(0)" onclick="gotopage(${pageBean.nextpage})">下一页</a>

【运行结果】

【最后优化】

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>listUser</title>
    <style type="text/css">
        .even{background-color:#C0C0C0 }
        .odd{background-color:#A08080 }
        tr:hover{background-color:#FF99FF }
    </style>
  </head>

  <body style="text-align:center;">
    <table frame="border" width="85%">
        <tr>

            <td>客户姓名</td>
            <td>性别</td>
            <td>手机</td>
            <td>邮箱</td>
        <tr>

        <c:forEach var="c" items="${requestScope.pageBean.list}" varStatus="status">
            <!-- 每行数据的颜色样式不同,当鼠标在某一行的时候的颜色也会有变化 -->
            <tr class="${status.count%2==0?‘even‘:‘odd‘ }">
                <td>${c.name }</td>
                <td>${c.sex }</td>
                <td>${c.phone }</td>
                <td>${c.email }</td>
            </tr>
        </c:forEach>

    </table>
    <br>

    <script type="text/javascript">

        function gotopage(currentpage){
            //当在GO前的输入框输入的值或者点击上一页下一页等情况的数值 小于1、不是合理的数字、大于最大的页码 等情况,提示"请输入有效值",且不做处理
            if(currentpage<1 || currentpage!=parseInt(currentpage) || currentpage>${pageBean.totalpage}){
                alert("请输入有效值! ")
                document.getElementById("pagenum").value=‘‘;
            }else{
                //获取pagesize的值,方便后面保持对应的每页的记录数
                var pagesize=document.getElementById("pagesize").value;
                window.location.href=‘${pageContext.request.contextPath}/ListUserServlet?currentpage=‘+currentpage+‘&pagesize=‘+pagesize;
            }
        }
        //当在"每页[X]条"中输入数值,失去焦点时
        function changesize(pagesize,oldvalue){
            //当输入的"每页[X]条"的数值小于等于0 或者不是合理的数字
            if(pagesize<=0 || pagesize!=parseInt(pagesize)){
                alert("请输入合法值! ");
                document.getElementById("pagesize").value=oldvalue;
            }else{
                window.location.href=‘${pageContext.request.contextPath}/ListUserServlet?pagesize=‘+pagesize;
            }
        }
    </script>
       共[${pageBean.totalrecord }]条记录,
       <!-- 在每页[]条 中输入对应的合法数字,就会将参数传递给 changesize(this.value,${pageBean.pagesize})方法-->
           每页<input type="text" id="pagesize" value="${pageBean.pagesize }" onchange="changesize(this.value,${pageBean.pagesize})" style="width: 30px" maxlength="2">条,
        共[${pageBean.totalpage }]页,
        当前[${pageBean.currentpage }]页
     &nbsp;&nbsp;&nbsp;
    <a href="javascript:void(0)" onclick="gotopage(${pageBean.previouspage})">上一页</a>
        <c:forEach var="pagenum" items="${pageBean.pagebar}">
            <!-- 如果是当前页码,不显示超链接,并把颜色变为红色 -->
            <c:if test="${pagenum==pageBean.currentpage }">
                <font color="red">${pagenum}</font>
            </c:if>
            <!-- 如果不是当前页码,显示超链接,颜色默认 -->
            <c:if test="${pagenum!=pageBean.currentpage }">
                <a href="javascript:void(0)" onclick="gotopage(${pagenum})">${pagenum} </a>
            </c:if>
        </c:forEach>
       &nbsp;
    <a href="javascript:void(0)" onclick="gotopage(${pageBean.nextpage})">下一页</a>
    <!-- 增加一个" [ ]GO " 输入页码,点击go进入对应的页码 -->
    <input type="text" id="pagenum" style="width: 30px"/>
    <input type="button" value=" GO " onclick="gotopage(document.getElementById(‘pagenum‘).value)"/>
  </body>
</html>

【运行结果】

最后优化增加了三个功能:

1.改变每页显示的记录数"每页[]条",这里输入合法的数值,就会改变当前显示的记录数目。

2.添加了跳转功能,在"[] GO"中输入对应的合法数值,点击"GO"就会跳转至对应的页码。

3.改变记录每行的颜色,方便识别,在鼠标停留在某一行数据时,又会出现另外一种颜色。

至此,分页基本的功能都已经完。后期有空可以再做优化。

时间: 2024-08-07 12:07:50

02_分页_02_步步优化的相关文章

分页sql语句优化

MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要的,所以n越大,性能会越差. 一般的分页做法,测试耗时 10.961s SELECT * FROM v_history_data  LIMIT 5000000, 10 优化后,测试耗时 1.943s SELECT * FROM v_history_data INNER JOIN (SELECT fid FROM t_history_data LIMIT 5000000, 10) a USING (fid) 优化前的SQL

mysql 两表联查分页排序效率优化

数据库中有两张表 t1 存储消息信息 +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI |

oracle中数据的分页显示及优化

在一个页面中经常会出现分页的现象,那么后台数据库又应该如何分页显示呢? 分页可以使用oracle中的rownum函数. 一个页面中从第几行到第几行数据的显示. 下面以scott用户下的emp表说明: 语句一: select b.* from( select a.* ,rownum row_num from (select * from emp ) a) bwhere row_num between 3 and 5; 语句二: select b.* from( select a.* ,rownum

MYSQL 分页慢加速器 解决方案 MYSQL 分页优化 MYSQL 分页解决方案 LIMIT 优化

无论你是InnoD引擎LIMIT分页慢还是MyISAM引擎LIMIT分页慢,大伙SELECT查询分页一般都是这样的[数据总共2万条,需要查询3个字段]: SELECT `id` , `url` , `content` FROM `product` WHERE 1 ORDER BY `id` LIMIT 10000 , 100 执行速度是: 45.7秒 哈哈,慢的掉渣吧! 作者LET再次隆重推荐 MySql LIMIT 分页查询加速利器解决方案: http://my.oschina.net/car

MySQL分页查询性能优化

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方法. 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明. 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数组,最大为varcha

小时到分钟 - 一步步优化巨量关键词的匹配

* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif; font-size: 15px } p { line-height: 25.6px; text-align: justify; margin: 23.7px 0 } blockquote { b

爬虫代码实现五:解析所有分页url并优化解析实现类

如图,我们进入优酷首页,可以看到电视剧列表,我们称这个页面为电视剧列表页,而点击进入某个电视剧,则称为电视剧详情页.那么如何获取所有分页以及对应的详情页呢,通过下面的分页得到. 因此,首先,我们将StartDSJCount中的url从详情页改为列表页, 由于这里我们想获取列表页对应的所有分页详情页,因此,我们需要在page中添加一个urlList属性,然后给它get/set方法.这里如果自动生成set方法,那么我们在set时还要new一个list,有点麻烦,这里我们先暂时只自动生成get方法,然

mysql分页的limit优化

1.很多新人都会很纳闷,为什么我建了索引使用分页还是这么卡.好,现在让我们一步一步去找原因吧. 首先limit本身跟索引没有直接关系. 先建一张商品sku表 create table goods_sku( id int(10) unsigned not null auto_increment comment '自增ID', goods_id varchar(20) not null comment '商品id', sale_status tinyint comment '上下架状态(0下架,1上

一步步优化JVM四:决定Java堆的大小以及内存占用

原文:http://blog.csdn.net/zhoutao198712/article/details/7783070 到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java堆大小.首先需要判断出应用存活的数据的大小,存活数据的大小是决定配置应用需要的Java堆大小的重要条件,也能够决定是否需要重新审视一下应用的内存需求或者修改应用程序以满足内存需