Servlet分页

1.创建工程

导入jar包
(javax.servlet\jstl\mysql\standard\servlet-api)
导入jquery类库
第一个放在web- WEB-INF的lib中,第二个放在web-js中。

2.cn.kgc.util/BaseDao、PageBean
BaseDao省略
PageBean如下:

package cn.kgc.util;
//分页(配置)的实体类 第三方的功能 类似工具包 
//不是数据库的,不是动态的不用放在entity包
public class PageBean {
    //分页的工具类
    private Integer pageNo;//当前页
    private Integer pageTotal;//总页数
    private Integer countTotal;//总记录数
    private Integer pageSize;//每页记录数
    private Integer startRow;//起始位置

    public PageBean() {}//默认调用父类的无参构造
    public PageBean(Integer pageNo, Integer countTotal,Integer pageSize) {
        this.pageNo = pageNo;
        this.pageTotal = countTotal%pageSize==0?countTotal/pageSize:countTotal/pageSize+1;
        //总页数    三目运算符   总记录数%每页记录数 取余(取模)           /  除
        this.countTotal = countTotal;
        this.pageSize = pageSize;
        this.startRow = (pageNo-1)*pageSize;
        //通过三个参数就能获得五个参数          角标 0 开始
    }
		//省略getter和setter方法
}

3.cn.kgc.entity/User

public class User {
    private Integer id;
    private String name;
	private String pwd;
//定义变量的getter\setter方法
//定义类的无参构造,有参构造和name、pwd的有参构造。
}

4.cn.kgc.dao/UserDao、UserDaoImpl
UserDao

package cn.kgc.dao;

import cn.kgc.entity.User;
import cn.kgc.util.PageBean;
import java.util.List;
//实现分页的uesrDao中的两个方法
public interface UserDao {
    //查询列表
    List<User> findAll(PageBean pageBean);
    //查询记录数
    Integer countTotal();
}

UserDaoImpl

package cn.kgc.dao;

import cn.kgc.entity.User;
import cn.kgc.util.BaseDao;
import cn.kgc.util.PageBean;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl extends BaseDao implements UserDao {

    @Override
    public List<User> findAll(PageBean pageBean) {//查询列表
        ArrayList<User> list = new ArrayList<>();
        String sql = "select * from t_user limit ?,?";
        Object[] params = new Object[]{pageBean.getStartRow(),pageBean.getPageSize()};
        //startRow起始位置     pageSize 每页记录数
        rs = super.executeQuery(sql, params);
        try {
            while (rs.next()){
                User uu = new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
				list.add(uu);
            }//try catch finally : ctrl + alt + t
        } catch (SQLException e) {
            e.printStackTrace();
        } finally { super.closeAll(); }
        return list;
    }

    @Override
    public Integer countTotal() {	//查询记录数
        rs = super.executeQuery("select count(*) as count from t_user",null);
        Integer count = 0;
        try {
            //只有一个值,可以不用遍历,但最好写上
            while (rs.next()){
//                数据库里没有count 所以上面有
                count = rs.getInt("count");
                //获取结果集里的count并存储到前面的count。
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {super.closeAll();}
        return count;
    }
}

初始化: (摘录)
1.在JAVA里类中的类属性,也就是全局变量不初始化系统有默认值,
而方法里的变量必须初始化。
2.类的成员变量不管程序有没有显式的进行初始化,
Java虚拟机都会先自动给它初始化为默认值。
3.局部变量声明之后,Java虚拟机就不会自动给它初始化为默认值,
因此局部变量的使用必须先经过显式的初始化。
4.对于只负责接收一个表达式的值的局部变量可以不初始化,
参与运算和直接输出等其它情况的局部变量需要初始化。

5.cn.kgc.service/Userservice、UserserviceImpl
Userservice

package cn.kgc.service;
import cn.kgc.entity.User;
import cn.kgc.util.PageBean;
import java.util.List;

public interface UserService {
    List<User> findAll(PageBean pageBean);
    Integer countTotal();
}

UserserviceImpl

package cn.kgc.service;

import cn.kgc.dao.UserDao;
import cn.kgc.dao.UserDaoImpl;
import cn.kgc.entity.User;
import cn.kgc.util.PageBean;

import java.util.List;

public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImpl();
    @Override
    public List<User> findAll(PageBean pageBean) {
        return userDao.findAll(pageBean);
    }

    @Override
    public Integer countTotal() {
        return userDao.countTotal();
    }
}

6.cn.kgc.servlet/UserServlet (导包省略)

package cn.kgc.servlet;

public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //上面是给request对象设置UTF-8字符集,下面是给response对象设置UTF-8字符集
        response.setContentType("text/html;charset=UTF-8");

        //获取请求URL后?后的pageNo参数对应的value值
        String pageNoStr = request.getParameter("pageNo");// String 默认值是空的
        //定义默认变量pageNo,默认value为0
        Integer pageNo = 0;
        //如果pageNoStr不为空值(代表非首页),则将字符串类型的pageNo转换为Integer类型的pageNo
        if (pageNoStr != null){
            pageNo = Integer.parseInt(pageNoStr);
            //否则pageNostr为空值(代表默认访问首页),则给pageNo 默认设置为 1
        }else {
            pageNo = 1;
        }

        //实例化UserServiceImpl 对象
        UserService userService = new UserServiceImpl();
        //调用userService对象的countTotal(),获取数据库中的记录数,返回值赋给countTotal变量
        Integer countTotal = userService.countTotal();//查询记录数
        //将三个参数pageNo , countTotal, pageSize组装PageBean分页工具类
        PageBean pageBean = new PageBean(pageNo, countTotal, 5);//pageNo当前页 countTotal总记录数 pageSize每页记录数
        // 调用userService对象的findA11查询列表方法,获取列表内容
        List<User> list = userService.findAll(pageBean);//查询列表
        //将list列表内容绑定到request请求域中
        request.setAttribute("list",list);

		System.out.println("list.size:"+list.size());
		//分布迭代数据  后端没问题再写前端  ==》list.size:5

        // 将pageBean对象绑定到request请求域中
        request.setAttribute("pageBean",pageBean);
        //转发到list.jsp页面中
        request.getRequestDispatcher("index.jsp").forward(request,response);

    }
}

7.配置xml
省略

8.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        function firstPage(num) {
            $("[name=pageNo]").val(num);
            $("form").submit();
        }
        function prevPage(num) {
            if(num<=1){
                alert("当前已经是第一页");
            }else{
                num--;
                $("[name=pageNo]").val(num);
                $("form").submit();
            }
        }
        function nextPage(num) { //传入参数
            //获取隐藏域中的总页数
            var pageTotal = $("[name=pageTotal]").val();
            //判断如果当前页num大于等于总页数,则弹出“前页已是最后一页”
            if(num>=pageTotal){
                alert("当前也已是最后一页");
            }else {
                //否则如果当前页num小于总页数,则需要将当前页数量加1
                num++;
                //给隐藏域中的当前页更新当前页的最新值
                $("[name=pageNo]").val(num);
                //提交form表单
                $("form").submit();
            }
        }
        function lastPage(num) {
            $("[name=pageNo]").val(num);
            $("form").submit();
        }
    </script>
</head>
<body>
<form action="UserServlet" method="post"><%--  action是空的--%>
    <table border="1px solid" >
        <tr>
            <td>用户编码</td>
            <td>用户名称</td>
            <td>用户密码</td>
        </tr>
        <c:forEach var="user" items="${list}"><!-- JSTL需导包啊 -->
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.pwd}</td>
            </tr>
        </c:forEach>
    </table>
    <div>
        <%-- 当前页:--%><input type="hidden" name="pageNo" value="${pageBean.pageNo}" />
        <%-- 总页数:--%><input type="hidden" name="pageTotal" value="${pageBean.pageTotal}" /><br/>
<%--        上面两个起辅助作用,到时首候隐藏--%>
        <a href="javascript:void(0);" onclick="firstPage(1)">首页</a>
        <a href="#" onclick="prevPage(${pageBean.pageNo})">上一页</a>
        <a href="#" onclick="nextPage(${pageBean.pageNo})">下一页</a>
        <a href="javascript:void(0);" onclick="lastPage(${pageBean.pageTotal})">末页</a>    
	</div>
</form>
</body>
</html>

javascript:void(0); (摘录)
javascript:void(0); 这个链接不做跳转动作
Javascript中void是一个操作符,该操作符指定要计算一个表达式
但是不返回值。
当用户链接时,void(0) 计算为 0,但 Javascript 上没有任何效果。
a href=#与 a href=javascript:void(0) 的区别:
#包含了一个位置信息 默认的锚是#top 也就是网页的上端
而javascript:void(0) 仅仅表示一个死链接
这就是为什么有的时候页面很长浏览链接明明是# 然而跳动到了页首
而javascript:void(0) 则不是如此所以调用脚本的时候最好用void(0)
在使用void(0)之前,最好先想一想,
这个页面是否需要整体刷新 Ajax用void(0)比较多
href="#"这种形式会整体刷新页面,而 href=“javascript:void(0)” 则不会

结果:
http://localhost:8080/UserServlet
在这里插入图片描述

----2021.10.30&11.02

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单从表现层来说分页不是一个复杂的工作,稍微理一下思路,处于不同competence level的同学应该都能自己搞出来。 以上面的文章列表分页为例,我觉得分页有两点重要的, 一是:分页我们必须首先自己搞清楚,文章总数、每页显示文章数(页大小)、页数 二是:如何做好页脚的分页导航条 实际应用中,文章总数这个值我们从数据库可以得到;每页显示的文章数即分页的页大小可以自己定义;页数我们可以通过下面的个表达式简单得出。 假设: int pageSize = 10; //分页大小 int totalPosts = PagingDAO.entryList.size(); //总文章数 int totalPages = totalPosts/pageSize + ((totalPosts%pageSize)>0?1:0); //计算得出的总页数 每页的文章怎么取出来? 知道分页的大小之后,我们生成了页好的选取下拉框,每次选择第几页的时候,都会向Servlet传递当前选择页号的参数,这样Servlet调用后面的DAO相应的方法,取得文章列表信息,再回传到JSP以供显示。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> page Size : ${pageSize} <br /> Total Posts: ${totalPosts} <br /> Total Pages: ${totalPages} <br /> Current Page: ${pageNumber} <hr /> <table> <thead> <tr align="center"> <td width="10%">Article ID</td> <td width="70%">Article Title</td> <td colspan="3">Actions</td> </tr> </thead> <tbody> <c:forEach items="${entryList}" var="entry"> <tr align="center"> <td>${entry.entryID}</td> <td>${entry.title}</td> <td><a href="viewEntry?entryID=${entry.entryID}">View</a></td> <td><a href="editEntry?entryID=${entry.entryID}">Edit</a></td> <td><a href="deleteEntry?entryID=${entry.entryID}">Delete</a></td> </tr> </c:forEach> </tbody> <tfoot> <tr align="center"> <td colspan="5"> <jsp:include page="paging_footer.jsp"></jsp:include> </td> </tr> </tfoot> </table> <hr/>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值