第一步.使用该分页组件需要导入pager-taglib.jar包。
第二步.在jsp页面中导入标签<%@taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%>
第三部.复制代码如下
<pg:pager items="${pm.totalRows}"
maxPageItems="${pm.pageSize}" maxIndexPages="20"
export="currentPageNumber=pageNumber"
url="User_findAllUser.action">
<pg:param name="pid" />
<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>
第四步:新建一个分页工具类PageUtil来保存页面中分页组件传递过来的参数。
public class PageUtil {
//线程本地变量 查询开始位置
private static ThreadLocal<Integer> offsetTL=new ThreadLocal<Integer>();
//线程本地变量 每页多少条
private static ThreadLocal<Integer> pageSizeTL=new ThreadLocal<Integer>();
public static void setOffset(int offset)
{
offsetTL.set(offset);
}
public static void setPageSize(int pageSize)
{
pageSizeTL.set(pageSize);
}
public static int getOffset()
{
return offsetTL.get();
}
public static int getPageSize()
{
return pageSizeTL.get();
}
public static void removePageSize()
{
pageSizeTL.remove();
}
public static void removeOffset()
{
offsetTL.remove();
}
}
第五部:新建一个实体类分页模型
import java.util.List;
/**
* 分页模板实体类
* @author 王伟
*
* @param <E>
*/
public class PageModel<E> {
private List<E> dataList;
private int totalRows;
private int pageSize;
public List<E> getDataList() {
return dataList;
}
public void setDataList(List<E> dataList) {
this.dataList = dataList;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
第六步:编写一个设置分页参数的过滤器PageFilter
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
String offsetStr=req.getParameter("pager.offset");
if(offsetStr!=null)
{
PageUtil.setOffset(Integer.parseInt(offsetStr));
}else
{
PageUtil.setOffset(0);
}
PageUtil.setPageSize(10);
chain.doFilter(req, resp);
PageUtil.removeOffset();
PageUtil.removePageSize();
}
第七部:将分页过滤器配置到web项目中
<filter>
<filter-name>PageFilter</filter-name>
<filter-class>com.elisoft.wechat.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PageFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第八步:根据PageUtil查询数据库获取数据,我自己项目使用的是持久层框架hibernate
//分页查询用户
@SuppressWarnings("unchecked")
public PageModel<User> findUser() {
String hql="from User u where u.userName is not null ";
Query query =this.getSession().createQuery(hql).setFirstResult(PageUtil.getOffset()).setMaxResults(PageUtil.getPageSize());
List<User> userList=query.list();
PageModel<User> pm=new PageModel<User>();
pm.setPageSize(PageUtil.getPageSize());
pm.setDataList(userList);
hql="select count(*) "+getHQL(hql);
query=this.getSession().createQuery(hql);
long rows=(Long)query.uniqueResult();
pm.setTotalRows((int)rows);
return pm;
}
private String getHQL(String hql)
{
int index=hql.indexOf("from");
if(index==-1)
{
index=hql.indexOf("FROM");
}
return hql.substring(index);
}
如果是纯jdbc如mysql数据库可以在sql查询语句后面加上limit ?,?;第一个?表示从哪个位置开始查询,第二个?表示查询条数因此第一个位置应该是PageUtil.getOffset(),第二个位置是PageUtil.getPageSize();
至此,分页模型基本完成。