组件准备
pager-taglib-2.0.war
自动解压到web服务器中
pager-taglib-2.0
http://localhost:8080/pager-taglib-2.0/index.html 进行访问 查看例子和文档
pager-taglib.jar jar包引入项目
组件简单应用
创建一个jsp页面 引入
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
export 导出参数
pageNumber 也是导出参数 输出的时候不能这样写
<c:if test="${pageNumber eq pageNumber}"></c:if>
可以把导出参数重命名的方式pageNumber重新命名为currentPageNumber
每页显示maxPageItems="30" 30条记录请看offset
maxIndexPage=25 显示25个页码
<pg:pager items="1001" maxPageItems="30" maxIndexPages="25" export="currentPageNumber=pageNumber">
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}">前页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber}</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl}">下页</a>
</pg:next>
<pg:last>
<a href="${pageUrl}">尾页</a>
</pg:last>
</pg:pager>
输出
首页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 下页 尾页
分装到项目中
将列表页面中分页部分封装到一个common/pager.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script type="text/javascript">
function selectPagesize(field){
//取到输出参数$pageUrl
window.location = document.getElementById("firstPage").href + "&pagesize="+field.value;
}
</script>
<pg:pager url="${param.url}" items="${total}" maxPageItems="${pagesize}" maxIndexPages="15" export="currentPageNumber=pageNumber">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="33%">
<div align="left">
<span class="STYLE22"> 共有<strong> ${total}</strong> 条记录,
当前第<strong> ${currentPageNumber}</strong> 页,共 <strong>${pageNumber }</strong> 页</span>
</div>
</td>
<td width="67%" align=right vAlign="center" noWrap>
<pg:param name="title"/>
<pg:first>
<a id="firstPage" href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}">前页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber}</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl}">下页</a>
</pg:next>
<pg:last>
<a href="${pageUrl}">尾页</a>
</pg:last>
<select name="pagesize" οnchange="selectPagesize(this)" >
<c:forEach begin="5" end="50" step="5" var="i">
<option value="${i}"
<c:if test="${i eq pagesize}">selected</c:if>
>${i}</option>
</c:forEach>
</select>
</td>
</tr>
</table>
</pg:pager>
列表页面加载
<!-- 分页组件 -->
<jsp:include page="/backend/common/pager.jsp">
<jsp:param name="url" value="SearchArticlesServlet"/>
<jsp:param name="params" value="title,source,content"/>
</jsp:include>
为了解决pagerTaglib中文乱码问题
当我们在页面中输入中文,那么这个浏览器可以自动按照编码转换为%..这种就是浏览器自动转换,为什么没有按照UTF-8帮我们转换呢如果是转正确的毕竟是开源的工具会有一些bug,所以我们要修改一下pagerTaglib的源码 当然pagerTaglib默认使用的系统编码是gbk编码那么如果页面我们使用的是gbk编码那么这个问题就会隐藏发现不了我们现在使用的是UTF-8这个问题就呈现出来了。
当我们部署到应用服务器上
classes里面放置的是那些servlet和util工具类 classess是类路径的根目录 编译到这里面都会通过web应用程序被加载上去 lib里面也是类路径的一部分
classes这个目录会先于lib目录被加载 这个意思就是讲我在class里面有一个类然后在lib里面某个包里面有那个类相同的包相同的类名,相同的包相同的类名导致加载的是classess里面的就基于这样一个最基本的原理
项目中创建一个源代码目录把pager-src.jar中的源代码拷贝进去
对应列表页面中<pg:pager
这个类里面有各种各样的参数 我们修改开源工具的时候真的无需全面的了解他然后在测试一下
name = java.net.URLEncoder.encode(name);
value = java.net.URLEncoder.encode(value);
如果编码正确就会得到正确的解释 这个方法已经被禁止使用了 这个方法他会使用系统默认的编码来对这些东西进行编码 在我们系统中他会使用中文操作系统进行编码,实际上我们页面是utf-8这就是问题所在 页面是gbk的传到后台后台认为是utf-8 中间编码不正确了
修改
name = java.net.URLEncoder.encode(name,"UTF-8");
value = java.net.URLEncoder.encode(value,"UTF-8");
name = java.net.URLEncoder.encode(name,"UTF-8");
页面里面的参数交给pagerTaglib的时候 taglib负责把这些参数附加到url后面 所以他就负责把这些参数进行编码,然后附加到url后面在这种情况下我们要指定正确的编码
上面这种方法不够通用 如果页面将来换成了GBK编码了 那么我们还要再次修改页面编码吗肯定不能这样所以要构造一个通用的方案
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
pageEncoding="UTF-8"是页面本身的编码 charset=UTF-8"这是页面里面的响应编码
name = java.net.URLEncoder.encode(name,pageContext.getResponse().getCharacterEncoding());//获得页面响应的编码