手把手带你写代码,完美实现Java分页功能

79 篇文章 1 订阅
67 篇文章 2 订阅

小伙伴们应该都知道,我们在项目开发中经常要用到分页功能,现在我们一般都会使用各种分页插件来进行快速实现。不过在面试的时候,面试官有时会问我们分页的实现过程与原理,这就有点让人防不胜防了。所以为了防止大家在面试时手足无措,索尔就用最原始的技术来带各位实现一下分页效果,希望能够让大家弄清楚分页的底层原理!

内容导读

本文的核心内容主要分为如下几部分:

  • 程序结构

  • JSP页面设计

  • 分页主要编码

  • 效果展示

程序结构

本项目虽小,但也是遵循三层架构的。对啦,不要忘了在项目中导入tomcat、JRE、mysql的依赖库文件,我这里用的是Eclipse工具。

因为项目中用到了JSP标签,所以我们需要在tomcat安装文件夹中的lib子文件夹下放好jstl-1.2.jar与standard.jar文件,如果有的话就不用管它了。项目的代码及依赖结构如下图所示:

JSP页面设计

接下来是本项目所用的jsp页面文件,主要有以下几个。

1. 创建index.jsp网页文件

<%@ page language="java" contentType="text/html;

charset=utf-8" pageEncoding="utf-8"%>
<%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<!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>
<link rel="stylesheet" 

type="text/css" href="css/index.css"  rel="external nofollow">
</head>
<body>
<h2>信息分页查询</h2>

<div class="wrap">
<table class="tab" border="2">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<c:forEach items="${pg.list}" var="stu">
<tr>
<td><c:out value="${stu.sid}" /></td>
<td><c:out value="${stu.sname}" /></td>
<td><c:out value="${stu.score}" /></td>
</tr>
</c:forEach>
</table>
</div>

<div class="set">
第<span id="currentPage">${pg.currentPage}</span>页 共<span
id="totalPage"> ${pg.totalPage}

</span>页 <a
href="index?currentPage=${0}">首页</a>  <a
href="index?currentPage=${pg.currentPage-1}">上一页</a>  <a
href="index?currentPage=${pg.currentPage+1}">下一页</a>  <a
href="index?currentPage=${pg.totalPage}">尾页</a>转到第:<input id="jump"
type="text" />页 <input id="go" type="button" value="GO" />
</div>
</body>
<script type="text/javascript" src="js/index.js"></script>
</html>

2. play.jsp文件

<%@ page language="java" contentType="text/html;

charset=utf-8"
pageEncoding="utf-8"%>
<!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>
</head>
<body>
<jsp:forward page="index"></jsp:forward>
</body>
</html>

分页主要编码

1. 创建分页文件Pagination

public class Pagination<T> {

    private int currentPage;
    
    // 总页号或总页数
    private int totalPage;
    // 每页记录数或行数
    private int limitRows;
    // 总的记录数或行数
    private int totalRows;
    // 每页开始的记录号
    private int startRecord;
    // 存每页中的记录
    private List<T> list;
    
    //初始化操作
    public void init() {
        // 1.1 求总页数,通过总记录数与每页行数来计算,有几种情况
        // (1)不够一页(2)有零头(3)刚好是整数页
        int tp = totalRows / limitRows;
        if (totalRows > limitRows) {
        totalPage = (totalRows %
        
        limitRows) == 0 ? tp : tp + 1;
        } else {
        totalPage = 1;
    }
    
    // 1.2 将当页保留在第一页或最后一页
    if (currentPage > totalPage) {
       currentPage = totalPage;
    } else if (currentPage <1) {
        currentPage = 1;
    }
    
    // 1.3 初始化开始记录数,mysql应用的limit它不包括开始记录,所以不要加1;
    // 还有limit传入的是开始记录号与查询的条数,此处是每页可显示数limitRows,
    // 如果查到最后没有limitRows限制的行数,则显示剩余部分
        this.startRecord = (currentPage -1) * limitRows;
    }
    
    public Pagination() {}
    
    // 当前页号,总记录数,每页行数;这些属性需要传入后初始化,其它的可以set设置
    public Pagination(int currentPage,int totalRows, int limitRows) {
        this.currentPage = currentPage;
        this.totalRows = totalRows;
        this.limitRows = limitRows;
    }
    
    // 以下为简单的get与set方法,我给省略了
    ......

2. 创建StuService类

public class StuService {

   //2.1 拿到记录条数
   public static int getTotalRows() {
        Dao dao = new DaoImpl();
        return dao.getTotalRows();
   }
    
    //2.2 拿到每个分页数据
    public static List<Stu> getList(int startRecord, int limitRows) {
        Dao dao = new DaoImpl();
        return dao.getList(startRecord, limitRows);
    }
    
}

当然啦,还有数据库与表、实体类等也是需要我们创建的,大家可以根据项目需求自己去完成。

效果展示

接下来就是本项目运行后的效果展示。

今天的内容就写到这里,现在你知道分页是怎么实现的了吗?

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
显示效果: [页面总数小于等于10,全部显示,当前页特殊显示] 上一页 1 2 3 4 5 6 7 8 9 10 下一页 [页面总数大于10,部分显示,当前页特殊显示] 上一页 1 2 3 … 20 下一页 [当前页面为首页时,上一页不可用] 上一页 1 2 3 4 … 20 下一页一页 1 2 3 4 5 … 20 下一页一页 1 2 3 4 5 6 … 20 下一页一页 1 … 3 4 5 6 7 … 20 下一页一页 1 … 14 15 16 17 18 ... 20 下一页一页 1 … 15 16 17 18 19 20 下一页一页 1 … 16 17 18 19 20 下一页一页 1 … 17 18 19 20 下一页一页 1 … 18 19 20 下一页[当前页面为末页时,下一页不可用] 算法提取: 0.页码显示规则: 当前页为首页时不显示上一页; 上一页 1 2 3 … 20 下一页 当前页为尾页时不显示下一页; 上一页 1 … 17 18 19 20 下一页 1.页面总数(n)<=10 { 显示全部页码:上一页 1 2 3 4 5 6 7 8 9 10 下一页 } 2.页面总数(n) > 10 { 2.1 当前页码 <= 4 { 左侧显示所有 + 当前页码 + 右侧2个页码 + ... + 尾页 上一页 1 2 3 … 20 下一页一页 1 2 3 4 … 20 下一页一页 1 2 3 4 5 … 20 下一页一页 1 2 3 4 5 6 … 20 下一页 } 2.2 当前页码 > 4 且<= 页面总数(n) - 3 { 首页 + ... + 左侧2个页码 + 当前页码 + 右侧2个页码 + ... + 尾页 上一页 1 … 3 4 5 6 7 … 20 下一页一页 1 … 14 15 16 17 18 ... 20 下一页 } 2.3 当前页码 > 页面总数(n) - 3 { 首页 + ... + 左侧2个页面 + 当前页码 + 右侧显示所有 上一页 1 … 15 16 17 18 19 20 下一页一页 1 … 16 17 18 19 20 下一页一页 1 … 17 18 19 20 下一页一页 1 … 18 19 20 下一页 } }
要用Pytorch手一个Transformer模型,可以按照以下步骤进行: 1. 导入所需的库和模块,包括torch、torch.nn、torch.nn.functional以及Transformer模型所需的子模块如EncoderLayer和DecoderLayer。 2. 定义Transformer模型的编码器部分。编码器由多个EncoderLayer组成,每个EncoderLayer包含自注意力机制(Self-Attention)、前馈神经网络和残差连接。 3. 定义Transformer模型的解码器部分。解码器也由多个DecoderLayer组成,每个DecoderLayer包含自注意力机制、编码器-解码器注意力机制和前馈神经网络。 4. 定义Transformer模型本身。它包含编码器和解码器,以及最后的线性层用于生成输出。 5. 实现模型的前向传播函数。在前向传播函数中,输入数据将分别经过编码器和解码器,并返回最后的输出。 6. 初始化模型并定义损失函数和优化器。 7. 定义训练循环。在每个训练迭代中,将输入数据传递给模型进行前向传播,计算损失值,并进行反向传播和参数更新。 8. 进行模型训练。根据实际情况,可以调整超参数、训练数据和训练次数等。 请注意,以上步骤是一个大致的框架,具体的实现细节可能会有所不同。可以参考引用中提到的huggingface提供的transformer模型代码,以及Transformer模型的论文《Attention is All You Need》来进行更详细的实现。 huggingface官方文档: [link] Transformer模型图: [link]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)](https://blog.csdn.net/qq_43827595/article/details/120394042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马剑威(威哥爱编程)

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值