`
junziyiyan
  • 浏览: 10015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

学习spirngmvc 和 使用 pager-taglib的一点小例子(包含 跳转页 及 每页显示数量控制)

阅读更多

最近在学习使用 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大部分问题都是传值问题,我的例子是我自己测试出来的思路,希望能给大家一些小小的帮助,主要还是需要自己去测试一下。

  • com.rar (13.7 KB)
  • 下载次数: 51
分享到:
评论
1 楼 yssheep 2016-11-24  
收益良多,解决了一个困扰几天的问题

相关推荐

    使用pager-taglib分页完整例子

    除了基础的分页功能,`pager-taglib`还提供了许多可配置的属性,如`style`(样式)、`firstPageText`(首页文本)、`lastPageText`(尾页文本)等,允许开发者自定义分页的外观和行为。 在提供的`PageDemo`示例中,...

    Pager-taglib页面分页示例

    本项目提供了一个简单的使用Pager-taglib的示例,包括了两种不同的分页样式:普通样式和谷歌样式。 **1. Pager-taglib介绍** Pager-taglib是由Java开发的开源项目,它提供了自定义的JSP标签来处理分页逻辑。开发者...

    pager-taglib分页标签

    `pagerTaglibDemo.rar`可能包含了一个演示如何自定义和使用`pager-taglib`的示例项目,你可以解压后参考学习。 ### 5. 其他相关知识点 - JSP标签库:`pager-taglib`是基于JSP 2.0的自定义标签库,它是JSP的一种...

    pager-taglib.jar包下载

    在`pager-taglib`标签库中,包含了处理分页所需的各个标签,如显示总页数、当前页、上一页、下一页等,这些标签可以直接插入到JSP页面中,通过传入必要的参数,如当前页码、总记录数等,就能自动计算并生成分页链接...

    pager-taglib 分页框架+附带例子

    `pager-taglib`通过接收服务器端的数据总数和每页显示的数量,动态生成分页链接,用户点击不同页码时,发送请求获取对应页的数据。 2. **标签库的引入** 在JSP页面中,首先需要引入`pager-taglib`的TLD文件,通常...

    pager-taglib-2.0及使用方法

    在`pager-taglib的安装和使用.txt`文件中,可能包含了更详细的使用示例和配置说明,建议参考该文件进行实践操作。 ### 结论 Pager Taglib 2.0是实现高效、灵活页面分页的利器。通过理解并熟练使用它的各种标签和...

    pager-taglib 分页扩展实例

    pager-taglib 是个很好的jsp分页标签,使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见,本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能: 1.添加输入跳转、每...

    pager-taglib-2.0

    Pager-Taglib 2.0 提供了一套完整的解决方案,包括显示当前页、总页数、跳转到指定页等功能,并能轻松定制样式以适应不同的UI需求。 使用Pager-Taglib 2.0 的步骤通常包括以下几个部分: 1. **引入库**:首先,你...

    pager-taglib-2.0.rar

    2. **高度可定制化**:这个库支持多种样式和布局配置,可以根据项目需求定制分页按钮的样式、间距、颜色等视觉效果,同时也能调整每页显示的记录数量。 3. **兼容性好**:"pager-taglib-2.0" 兼容各种主流的Web框架...

    pager-taglib分页jar包

    3. **自定义标签**:在`pager-taglib`中,可能包含如`&lt;pager:page&gt;`、`&lt;pager:prev&gt;`、`&lt;pager:next&gt;`等标签,分别用于显示当前页、上一页和下一页的链接,以及分页导航的其他元素。 4. **属性和参数**:这些自定义...

    pager-taglib jar 和 tld 以及使用说明

    `pager-taglib`标签通常需要与后端控制器(如Servlet或Spring MVC的Controller)配合工作,后端负责计算总页数、获取指定页的数据,并将这些信息传递给前端JSP页面。 6. **注意事项** - 确保JSP引擎能够正确找到`...

    pager-taglib源码

    这是pager-taglib的官方源码,但在采用官方的pager-taglib分页传输中文参数会出现乱码,所以我采用maven新建一个pager-...以便可以根据需求重构pager-taglib引用,如果熟悉maven可以直接使用maven构建和安装到本地仓库

    pager-taglib.jar

    利用pager-taglib进行查询分页时需要添加该jar包:pager-taglib.jar

Global site tag (gtag.js) - Google Analytics