JavaWeb-在会一会【分页】

标签: 分页

话说:

各位读者,晚上好!

好久不见!真的不愿意间隔了这么久才动笔,如果今天再不发表博客,就不能原谅自己。笔者在10.14号博客《JavaWeb-News-分页》博客中用对象的方式写了分页,没记错的话,那时候实现的分页还是有小bug。这次直接用在Servlet中实现分页,页面显示方式参考百度分页,这次效果很满意。(当然倾向于功能,没有美化)。

目标:
Servlet中直接实现分页
难度系数:★☆☆☆☆
建议用时:30min 实际用时2H

目录:


一、效果图
二、Servlet
三、页面(重点)
四、总结
五、下期预告


开发工具:Eclipse

一、效果图

页面非常粗糙,如果加上美化,效果会非常好。

这里写图片描述

首页,每页显示10条数据

这里写图片描述

中间页,当前页不是超链接。

这里写图片描述

末页

二、Servlet

这里直接调用底层方法,查处数据。为便于分页,可以在新增数据的时候,调用Servlet本身,可产生大量数据。

TextListServlet

package com.hmc.controller;
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 com.hmc.dao.UserDaoImpl;
import com.hmc.pojo.ListShow;

/**
*
*2017年12月26日
*User:Meice
*下午9:14:17
*/
public class TextListServlet extends HttpServlet{
    @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.接收参数

        /**
         * 分页5要素:
         * 1)pageIndex 当前页
         * 2)startIndex 从第几条数据开始
         * 3)countAll 总条目数
         * 4)pageSize 每页大小
         * 5)pageCount 总共多少页
         */

        int pageIndex;
        int startIndex;
        int countAll;
        int pageSize = 10;
        int pageCount;

        //当前页
        String pageIndexStr =   req.getParameter("pageIndex");
        if(pageIndexStr!=null && !pageIndexStr.equals("")) {
                pageIndex = Integer.parseInt(pageIndexStr);
        }else {
            pageIndex = 1;
        }

        System.out.println("当前页:"+pageIndex);

        //总条目数
        countAll = new UserDaoImpl().getCountAll();
        System.out.println("总页数:"+countAll);
        //总页数
        pageCount = (int)Math.ceil(((double)countAll/pageSize));    

        // 从哪页的数据开始显示(当前页-1)*2;
        startIndex = (pageIndex-1)*pageSize;
        System.out.println("偏移量:"+startIndex);



        //2.调用方法
        String sql = "select a.textId, a.title,a.userNick,b.replyCount,a.textTime from  (select t.textId,t.title,u.userNick,t.textTime from text t inner join user u on t.userId = u.userId)a left join  (select  t.title,count(replyId) replyCount from reply r inner join text t on r.textId = t.textId  inner join user u on r.userId =  u.userId  group by title) b on   a.title = b.title order by a.textId limit ?,?";
        Object[] params = {startIndex,pageSize};
        List<ListShow>  list =(List<ListShow>)new UserDaoImpl().textShowSearch(sql, params);



        //3.页面跳转
        req.setAttribute("list", list);
        req.setAttribute("pageCount", pageCount);
        req.setAttribute("pageIndex", pageIndex);
        req.setAttribute("pageCount", pageCount);
        req.setAttribute("pageSize", pageSize);
        req.getRequestDispatcher("TextList.jsp").forward(req, resp);





    }
}

有了Servlet,当然少不了配置web.xml

   <!--=============================首页显示的TextListServlet==============================-->
  <servlet>
        <servlet-name>listServlet</servlet-name>
        <servlet-class>com.hmc.controller.TextListServlet</servlet-class>
  </servlet>

  <servlet-mapping>
        <servlet-name>listServlet</servlet-name>
        <url-pattern>/pageList</url-pattern>
  </servlet-mapping>

三、页面

TextList

<%@page import="com.hmc.util.getStringToIntUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!--Author:Meice 2017年12月26日下午9:23:43 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>帖子分页</title>

<script type="text/javascript">
        function skipToPage() {

        }   
</script>

<%-- <%
    String  skipPageStr =   request.getParameter("skip");
    System.out.print("选择框内容:"+skipPageStr);
    int skipPage = getStringToIntUtil.getInt(skipPageStr);
%> --%>

</head>
<body>

    <table border="1" width="90%" align="center">
        <thead>
            <tr>
                <th>帖子标题</th>
                <th>发帖人</th>
                <th>回复数量</th>
                <th>发帖时间</th>
            </tr>
        </thead>

        <tbody>

            <c:forEach var="ListShow" items="${list}">
                <tr>
                    <td>${ListShow.title}</td>
                    <td>${ListShow.userNick}</td>
                    <td>${ListShow.replyCount}</td>
                    <td>${ListShow.textTime}</td>
                </tr>

            </c:forEach>




            <tr>
                <td colspan="4" align="center">


                    <c:if test="${pageIndex>1 }">
                        <a href="pageList?pageIndex=1">首页</a>
                        <a href="pageList?pageIndex=${pageIndex-1}">上一页</a>
                    </c:if>

                    <!--开头10页  -->
                    <c:if test="${pageIndex<=10 }">
                            <c:forEach begin="1" end="10" var="i">
                                <c:if test="${pageIndex==i}">
                                    ${i}
                                </c:if>

                                <c:if test="${pageIndex!=i}">
                                    <a href="pageList?pageIndex=${i}">${i}</a>
                                </c:if>

                            </c:forEach>

                    </c:if>

                    <!--中间部分  -->
                    <c:if test="${pageIndex>10 &&pageIndex<pageCount-(pageSize-1)}">
                        <c:forEach begin="${pageIndex-4 }" end="${pageIndex+5}" var="i">
                            <c:if test="${pageIndex==i}">
                                ${i}
                            </c:if>
                            <c:if test="${pageIndex!=i}">
                                <a href="pageList?pageIndex=${i}">${i}</a>
                            </c:if>

                        </c:forEach>

                    </c:if>


                    <!--最后10页-->
                    <c:if test="${pageIndex>=pageCount-(pageSize-1)}">
                        <c:forEach begin="${pageCount-(pageSize-1)}" end="${pageCount }" var="i">

                            <c:if test="${pageIndex==i }">
                                ${i}
                            </c:if>

                            <c:if test="${pageIndex!=i }">
                                <a href="pageList?pageIndex=${i}">${i}</a>
                            </c:if>


                        </c:forEach>
                    </c:if>



                    <c:if test="${pageIndex<pageCount}">
                        <a href="pageList?pageIndex=${pageIndex+1}">下一页</a>
                        <a href="pageList?pageIndex=${pageCount}">末页</a>
                    </c:if>



                    ${pageIndex}/${pageCount}

                    <!--跳转页面  -->
                    <form  action="pageList" method="get">
                        <select name="pageIndex">
                            <option value="15" selected>15</option>
                            <option >20</option>
                            <option >30</option>
                        </select>
                        <input type="submit" value="跳转">
                    </form>

                </td>
            </tr>
        </tbody>




    </table>




</body>
</html>

四、总结


1、分页的核心在五要素:

pageIndex——当前页
countAll——总条目数
pageSize——每页显示数量,limit的第二个?号
pageAll——总页数
startPage——limit的起始查询值,第一个?号

2、页面处理核心在于处理好第一页、中间页面、尾部页面;整体逻辑是:第一页我们写固定,最后一页也写固定,中间按照每页大小灵活变动;

3、控制好实现效果,用好以下标签即可,需要先导入JSTL包。

<c:forEach  var="" items="${传过来的值}"></c:forEach>
<c:forEach begin="" end="" var=""></c:forEach>

<c:if  text="满足条件表达式"></c:if>

熟悉这三个,分页就可以搞定。


五、下期预告

最近分身乏术,没有精力推进企业门户网项目,暂且搁置,一旦有空,就是更新这个。

好了,晚安!下期再会!17年即将过去,冬至到了,春天真的不远了。

版权声明:本文为meiceatcsdn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/meiceatcsdn/article/details/78907984

智能推荐

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

猜你喜欢

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...

OpenStack代码贡献初体验

为什么80%的码农都做不了架构师?>>>     OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。  在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报...

SQL Server之8:sql查询每个学生得分最高的两门课

这是一道面试题,今天有空把它记下来,以后遇到此类问题作个参考!刚一看到这个题目,估计好多人都会想到关键字top,其实这里用到的关键字是partition, 好了,先看看表结构,及数据吧!     接下来看一看partition的功能,执行语句   结果如下:   到这里一目了然知道最终结果了!   View Code     &...