最近在学习使用 springmvc, 同时由于用到了分页,所以就使用了一下page-taglib,用的时候,没懂得怎么配置之前还是很纠结的,不过最后还是解决了(直接 或者 间接)的,特别是大家用的时候基本上都没有自己配置跳转到第几页和每页显示数量,上网查了一下,貌似这个问题大家问的挺多,但是真正的例子还是很少,下面就简单的说一下使用过程。
1.先跟大家讲一下传统分页和使用pager-taglib的不同,下面会有具体的例子,一会大家可以参考看一下。
(1)传统的分页其实就是在 所显示的内容后面(大部分就是在table标签后再加一行tr)加入一些自己写的分页所需要传递的参数,然后当点击这些连接时候,将整个页面所在的表单(form)提交到配置好的后台(action="myUrl.do"),从后台取出分页参数以及查询条件参数,到dao中获取下一次需要的数据,然后传递到页面,基本就完成了一次分页查询和分页展示。
(2)pager-taglib的方式则不一样,这个是基于 传递url+参数的方式去获取数据的
例如:http://localhost:8080/myApp/myUrl.do?pager.offset=10&pageNo=1&userName=admin
所以当使用pager-taglib最重要的就是配置好 需要获取数据的url 以及将对应的参数传到后台 就可以了。网上大部分的例子其实都是官方给出的例子,大家用的时候大部分都对其中 pager.offset 和自己无法传递参数到后台 很蛋疼,下面会介绍如何使用自己的参数和一些配置的例子给大家作参考(pager.offset 其实不需要去管他,一般来讲,这个偏移量对用户和开发者而言没有什么实际意义,根本不需要去获取)
2.大家先看一下以前的分页大概的模型,就是设置一个表单,里面利用一个table,使用jstl的c:forEach 或者 strus的一些循环标签将分页内容显示出来,紧接着就自己构造一个分页参数的链接,以供分页时候提交表单数据和分页参数使用。
<script type="text/javascript">
function abc(a) {
var pageNo = document.getElementsByName("pageNo")[0];
pageNo.value = a;
form1.submit();
}
</script>
<form name="form1" action="<%=request.getContextPath()%>/showUsers.do" method="post">
<table border="1">
<tr>
<th>用户编号</th>
<th>用户名称</th>
<th>用户密码</th>
</tr>
<c:forEach var="userProfile" items="${pi.records}">
<tr>
<td><c:out value="${userProfile.userNo}"/></td>
<td><c:out value="${userProfile.userName}"/></td>
<td><c:out value="${userProfile.userPassword}"/></td>
</tr>
</c:forEach>
<tr>
<td colspan="4">
<input type="button" name="bnFirst" value="首页" onclick="abc(1)"/>
<input type="button" name="bnPre" value="前一页" onclick="abc(${pi.pageNo - 1})"/>
<input type="button" name="bnNext" value="后一页" onclick="abc(${pi.pageNo + 1})"/>
<input type="button" name="bnLast" value="末页" onclick="abc(${pi.totalPageCount })"/>
<input type="text" size="4" disabled="disabled" name="currentPage" value="${pi.pageNo }"/>
<input type="hidden" size="4" name="pageNo" value="${pi.pageNo }"/>
<input type="text" size="4" name="pageSize" value="${pi.pageSize }"/>
每页显示 ${pi.pageSize} 条 / 共 ${pi.totalPageCount } 页
</td>
</tr>
</table>
3.jsp中的使用pager-taglib
首先要引入pager-taglib的jar包和taglib(本例中还同时使用了jstl),以下2行大家加上就ok了
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
大家请看一下使用的小例子,如下
<pg:pager url="showUsers.do" items="${pi.totalCount }" maxPageItems="${pi.pageSize }" export="currentPageNumber=pageNumber">
<pg:param name="pageSize" value="${pi.pageSize }"/>
<pg:first>
<a href="${pageUrl}&pageNo=${pageNumber }">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }&pageNo=${pageNumber }">上一页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${pageNumber eq pi.pageNo}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }&pageNo=${pageNumber }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }&pageNo=${pageNumber }">下一页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }&pageNo=${pageNumber }">尾页</a>
</pg:last>
<pg:page>
<input id="pNo" size="2" type="text" />
<input type="button" value="跳转到" onclick="jump('${pageUrl }')" />
</pg:page>
</pg:pager>
[每页显示<input type="text" size="2" name="pageSize" value="${pi.pageSize }" onkeydown="kdown(this)"/>条数据,请输入数字后按回车]
<select name="" onchange="selectPagesize(this)">
<c:forEach var="i" begin="1" end="${pi.totalPageCount }" step="1">
<option value="${i}" <c:if test="${pi.pageNo eq i }">selected</c:if> ><c:out value="${i}" /></option>
</c:forEach>
</select>
<!-- </form> -->
<script type="text/javascript">
function selectPagesize(field){
var uri = "<%=request.getContextPath()%>" + "/showUsers.do?pageNo=" + field.value + "&pageSize=${pi.pageSize }";
document.location.href = uri;
}
function jump(uri) {
var pNo = document.getElementById("pNo").value;
document.location.href = uri + "&pageNo=" + pNo;
}
function kdown(pSize) {
if (event.keyCode == 13) {
var uri = "<%=request.getContextPath()%>" + "/showUsers.do?pageNo=1&pageSize=" + pSize.value;
document.location.href = uri;
}
}
</script>
其中的红色字体标注的部分是相对比较重要的一部分,下面给大家重点说明一下。
(1)url="showUsers.do" 意思是当你点击 下一页 或者 首页 之类的标签时候,你的页面会去哪个url获取数据(pager-taglib使用的是传递url+参数的方式去获取数据的 例如http://localhost:8080/myApp/myUrl.do?pager.offset=10&pageNo=1&userName=admin这种格式去获取数据),所以这个你就配置成原本分页中的 form的 action地址就可以了。
(2)items="${pi.totalCount }" (items:总记录数,pager标签正是根据这个值来计算分页参数的),也就是说这个其实就是pager分页的基础,所以这个值是必须填的,取值其实就是你从数据库中分页时候获取的总记录数。
(3)maxPageItems="${pi.pageSize }" (maxPageItems:每页显示的行数,默认为10 ),也就是说当你想要控制每页显示数量的时候,一定要把这个参数配置好,并且需要传递到后台,以便当你跳转到其他页时还能够按照自己设定的每页显示数量来显示。
(4)<pg:param name="pageSize" value="${pi.pageSize }"/> 传递参数到后台使用,其实前面讲过了,pager-taglib使用的是传递url+参数的方式去获取数据的,与我们原本的form 提交表单的方式不同,所以当你有任何自己需要传递到后台的参数时,都是使用这一行来传递的,其中需要注意的一点是 这行代码必须 是 <pg:pager >中的第一个子串,也就是要紧挨着 <pg:pager >标签, 否则数据会无法传递到后台。
(5)<a href="${pageUrl}&pageNo=${pageNumber }">首页</a> 网上的大部分例子这个地方其实应该写成
<a href="${pageUrl }">,这里之所以要多加一个 &pageNo=${pageNumber }则是要解决大多数人很蛋疼的当前页的页码问题,这样后台就能拿到pageNo这个当前页码了,然后当然可以该干嘛干嘛了:)
(6)<c:when test="${pageNumber eq pi.pageNo}"> 这个按照网上的例子应该是
<c:when test="${pageNumber eq currentPageNumber }"> 之所以改成 pi.pageNo 是为了当增加 跳转到第几页功能时候能同步的将分页的页码对应到当前页,如果按照原有的代码的话,当你使用跳转到例如第2页时候,这个表达式是不会起作用的,所有的页码都会是可以点击的链接,这个大家拿附件中的代码修改试验一下就能明白(注意看分页的的页码全是链接)
(7)<pg:page>
<input id="pNo" size="2" type="text" />
<input type="button" value="跳转到" onclick="jump('${pageUrl }')" />
</pg:page>
这个就是后来自己加的 跳转到第几页的一个小功能,因为这个功能很多时候还是有用的,其实就是拼接一个url串就ok了,大家稍微看看应该没啥问题。
4.spirngmvc的后台获取数据的一些小提示
@RequestMapping(value = "/showUsers.do")
public ModelAndView showAllUsers(PageInfo<UserProfile> pi) {
ModelAndView mav = new ModelAndView("showUsers");
pi = userService.getAllUsers(pi);
mav.addObject("pi", pi);
return mav;
}
这个就是controller类,这边只需要接收 PageInfo这个参数就ok了,因为springmvc 会根据名称自动的为对象的属性赋值,例如我们在pager中使用的 pageNo pageSize 这些参数都被自动的赋值给 PageInfo(pi) 这个对象了,后台只需要定义这个对象为参数,就可以去取,大多数情况如果取不到数据,请大家去看一下pager中的 各个参数名称是否正确就可以了。
5.这个例子中我没有给出 关于分页条件的传递 例子,其实原理是一样的,大家只需要多定义一些<pg:param >参数就可以了,例如:
后台再设置一个对象到返回参数中
MyBean mb = new MyBean();
mb.setUserName("admin");
mb.setUserEmail("test@test.com");
mav.addObject("myBean", mb);
加上以下这些就可以将这些参数贯穿前后台,需要注意的则是中文问题,因为中文也是跟在 url后面传递的,一般来讲都会有乱码问题,这个大家上网上搜一下关于 url带中文参数乱码怎么解决就ok,网上有很多例子
<pg:param name="userName" value="${myBean.userName}"/>
<pg:param name="userEmail" value="${myBean.userEmail}"/>
6.项目的源码结构
因为我用的时eclipse,还用了maven管理,所以我的文件目录结构跟大家常用的有一点点不同,而且我也不是很会用maven,不知道怎么把源码直接给大家发出来,只能在这里描述以下我的目录结构
(1)com.rar包请放到 src文件夹中
(2)请新建一个Source Folder,叫做conr 跟 src平级就ok,将conf中的3个文件拷到这个文件夹中,其中的 dbConfig.properties文件就是数据库配置,如果大家自己测试时候,修改 数据库实例名和用户名密码 就在这里修改就ok
(3)WEB-INF目录就放到对应的文件夹下,需要注意一个问题,我用的 eclipse在项目属性上有 Deployment Assembly这个选项,所以我把 WEB-INF/page 的路径发布到 根目录下,所以如果当使用网址
http://localhost:8080/mytestspringmvc3/showUsers.do 无法访问时候,可以尝试将page里头的jsp copy到 webContent目录下,同时修改一下/WEB-INF/spring-mvc目录下得dispatcher-servlet.xml文件,将其中的
<property name="prefix" value="/WEB-INF/page/" />修改成
<property name="prefix" value="/" />
哎,使用maven和eclipse比较闹心,大家见谅,有些小配置问题大家可以自己调整一下。
7.数据库配置
数据库实例名、用户名、密码均为 mytest
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest?characterEncoding=utf-8
jdbc.user=mytest
jdbc.password=mytest
建表语句及我的测试数据都再mytest.rar包中
8.附件war包使用方法
附件中给出的时war包,大家可以根据 WEB-INF/lib里头的图片中内容将 所有的jar包给配好,放到tomcat下(我使用的是tomcat7),连接好数据库,访问地址是:http://localhost:8080/mytestspringmvc3/showUsers.do ,大家试的时候可以多注意留心以下地址栏,就会明白pager-taglib的方式。
9.总结
pager-taglib大部分问题都是传值问题,我的例子是我自己测试出来的思路,希望能给大家一些小小的帮助,主要还是需要自己去测试一下。
分享到:
相关推荐
YOLOv12:以注意力为中心的实时目标检测器
GO语言基础语法指令教程
MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容:代码主要做的是分布式电源接入场景下对配电网运行影响的分析,其中,可以自己设置分布式电源接入配电网的位置,接入配电网的有功功率以及无功功率的大小,通过牛顿拉夫逊法求解分布式电源接入后的电网潮流,从而评价分布式电源接入前后的电压、线路潮流等参数是否发生变化,评估配电网的运行方式。 代码非常精品,是研究含分布式电源接入的电网潮流计算的必备程序 ,分布式电源; 配电网; 接入影响分析; 潮流计算; 牛顿拉夫逊法; 电压评估; 必备程序。,基于MATLAB的分布式电源对配电网影响评估系统
三相光伏并网逆变器:Mppt最大功率跟踪与800V中间母线电压的电力转换技术,三相光伏并网逆变器:实现最大功率跟踪与800V中间母线电压的优化处理,三相光伏并网逆变器 输入光伏Mppt 最大功率跟踪中间母线电压800V 后级三相光伏并网逆变器 ,三相光伏并网逆变器; 输入光伏Mppt; 最大功率跟踪; 中间母线电压800V; 后级逆变器,三相光伏并网逆变器:MPPT最大功率跟踪800V母线电压
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
西门子博途三部十层电梯程序案例解析:基于Wincc RT Professional V14及更高版本的应用探索,西门子博途三部十层电梯程序案例解析:基于Wincc RT Professional画面与V14及以上版本技术参考,西门子1200博途三部十层电梯程序案例,加Wincc RT Professional画面三部十层电梯程序,版本V14及以上。 程序仅限于参考资料使用。 ,西门子;1200博途;三部十层电梯程序案例;Wincc RT Professional;V14以上程序版本。,西门子V14+博途三部十层电梯程序案例:Wincc RT Pro专业画面技术解析
基于舆情数据的知识图谱推荐可视化系统论文,全原创,免费分享
基于Vivado源码的AM包络检调制解调与FIR滤波器设计在FPGA上的实现,基于Zynq-7000和Artix-7系列的AM包络检调制解调源码及Vivado环境下的实现,AM包络检调制解调,Vivado源码 FPGA的AM调制解调源码,其中FIR滤波器根据MATLAB设计。 【AM_jietiao】文件是基于zynq-7000系列,但没有涉及AD与DA,只是单纯的仿真。 【AM包络检调制解调_Vivado源码】文件基于Artix-7系列,从AD读入信号后,进行AM调制,并解调DA输出。 ,AM包络检调制解调;Vivado源码;FPGA;AM调制解调源码;FIR滤波器;MATLAB设计;Zynq-7000系列;Artix-7系列;AD读入信号;DA输出,AM包络调制解调源码:Zynq-7000与Artix-7 FPGA的不同实现
yugy
2025山东大学:DeepSeek应用与部署(部署方案大全+API调用+业务应用)-80页.pptx
chromedriver-mac-x64-135.0.7023.0(Dev).zip
基于单片机protues仿真的433MHz无线模块编解码收发通信测试(仿真图、源代码) 该设计为单片机protues仿真的433MHz无线模块收发通信测试; 1、433M超再生收发模块; 2、在仿真图中是把发射MCU的P2_7腿直接输入到接收MCU的INT0实现编码解码的; 3、通过433MHz无线模块实现无线通信的编解码功能; 4、按键控制指令; 5、液晶屏显示收发状态和信息;
资源说说明; 自带文件管理 adb操作以及应用管理等等的功能。 操作性对比其他应用较好。 参阅博文: https://blog.csdn.net/mg668/article/details/145689511?spm=1001.2014.3001.5352
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
智慧图书管理系统(源码+数据库+论文)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 本系统分为读者、管理员2个角色 读者可以进行注册登录、浏览图书以及留言、图书借阅、图书归还、图书续借、个人中心、论坛交流、等功能 管理员可以进行读者管理、图书管理、论坛论坛回复管理、图书借阅管理(下架、库存管理、修改、删除)、轮播图管理 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
三相APFC电路与单相Boost PFC电路仿真模型:电压外环电流内环双闭环控制研究,三相电路仿真模型:探索APFC电路、单相PFC电路及BoostPFC电路的动态特性与双闭环控制策略,APFC电路,单相PFC电路,单相BoostPFC电路仿真模型。 网侧220V 50Hz,输出电压设置为50Hz。 电压外环电流内环双闭环控制仿真模型 ,APFC电路; 单相PFC电路; 单相BoostPFC电路仿真模型; 网侧电压; 220V 50Hz; 输出电压50Hz; 电压外环电流内环双闭环控制仿真模型。,基于APFC电路的单相Boost PFC仿真模型:网侧电压220V/50Hz下电压电流双闭环控制的研究与应用
MATLAB环境下ADMM算法在分布式调度中的应用:比较并行与串行算法(Jocobi与Gaussian Seidel)的优化效果与实现细节——基于YALMIP和GUROBI的仿真平台复刻参考文档的研究结果。,MATLAB下ADMM算法在分布式调度中的并行与串行算法应用:基于YALMIP与GUROBI的仿真研究,MATLAB代码:ADMM算法在分布式调度中的应用 关键词:并行算法(Jocobi)和串行算法(Gaussian Seidel, GS) 参考文档:《主动配电网分布式无功优化控制方法》《基于串行和并行ADMM算法的电-气能量流分布式协同优化》 仿真平台:MATLAB YALMIP GUROBI 主要内容:ADMM算法在分布式调度中的应用 复刻参考文档 ,关键词:ADMM算法; 分布式调度; 并行算法(Jocobi); 串行算法(Gaussian Seidel, GS); MATLAB代码; YALMIP; GUROBI; 主动配电网; 无功优化控制方法; 能量流分布式协同优化。,MATLAB实现:ADMM算法在分布式调度中的并行与串行优化应用
“考虑P2G、碳捕集与碳交易机制的综合能源系统优化调度模型研究”,考虑电转气P2G与碳捕集设备的热电联供综合能源系统优化调度模型研究(含碳交易机制与四种算例场景分析),考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型 摘要:代码主要做的是一个考虑电转气P2G和碳捕集设备的热电联供综合能源系统优化调度模型,模型耦合CHP热电联产单元、电转气单元以及碳捕集单元,并重点考虑了碳交易机制,建立了综合能源系统运行优化模型,与目前市面上的代码不同,本代码完全复现了文档中所提出的四种算例场景,没有对比算例,买过去也没有任何意义,四种算例主要包括: 1)t不包括P2G、CCS、以及碳交易 2)t包括P2G,但是不包括CCS以及碳交易 3)t包括P2G和CCS,但是不包括碳交易 4)t包括P2G、CCS以及碳交易 且最终的实现效果与文档进行对比后,虽然数值无法100%一致,但是结果以及数值曲线,几乎完全一样,此版本为目前市面上最好的园区综合能源调度代码,没有之一 ,考虑电转气(P2G); 碳捕集设备; 热电联供综合能源系统; 优化调度模型; 碳交易机制; CHP热电联产单元; 耦合模型; 算
FS-LDM培训材料(DAY_2)_NCR数据仓库事业部.ppt