SSH04---分页
来源:互联网 发布:c 接ctp的源码示例 编辑:程序博客网 时间:2024/06/14 05:12
分页
1.1、导入分页的包 pager-taglib.jar
1.2、创建分页对象
package com.chb.spring_hibernate.model;import java.util.List;/** * 分页对象 */public class Pager<T> { /** * 数据 */ private List<T> datas; /** * 当前页数 */ private int pageOffset; /** * 总的记录数 */ private int totalRecord; /** * 总的页数 */ private int pageSize; ...setter getter}
1.3、修改IBaseDao, list不分页, find分页, 提供三个方法
/** list不分也, find 分页 */ public List<T> find(String hql, Object[] args); public List<T> find(String hql, Object obj); public List<T> find(String hql); }
1.4、在BaseDao中实现
@Override public List<T> find(String hql, Object[] args) { //创建分页对象 Pager<T> pager = new Pager<T>(); return null; } @Override public List<T> find(String hql, Object obj) { return this.find(hql, new Object[] {obj}); } @Override public List<T> find(String hql) { return this.find(hql, null); }}
1.4.1、主要关注find(String hql, Object[] args)
1.4.1.1、既然要实现分页, 那么就需要Pager对象
@Override public List<T> find(String hql, Object[] args) { //创建分页对象 Pager<T> pager = new Pager<T>(); return null; }
1.4.2、有了Pager对象, 就需要获取Pager的参数, pageOffset, 这个需要从哪个界面层获取, 通过SystemContext对象获取。ThreadLocal , 不同之间获取数据
package com.chb.spring_hibernate.model;public class SystemContext { /** * 获取offset */ private static ThreadLocal<Integer> pageOffset = new ThreadLocal<Integer>(); /** * 获取pageSize, 总页数 */ private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>(); /** * 注意get, set获取, 返回的都是int类型 * @return */ public static int getPageOffset() { return pageOffset.get(); } public static void setPageOffset(int _pageOffset) { pageOffset.set(_pageOffset); } public static int getPageSize() { return pageSize.get(); } public static void setPageSize(int _pageSize) { pageSize.set(_pageSize); } public static void removePageSize() { pageSize.remove(); } public static void removePageOffset() { pageOffset.remove(); }}
1.4.3、在过滤器中设置值, 创建过滤器SystemContextFilter
package com.chb.spring_hibernate.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import com.chb.spring_hibernate.model.SystemContext;public class SystemContextFilter implements Filter{ private int pageSize = 0; @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { int pageOffset = 0; try { try { SystemContext.setPageOffset(Integer.parseInt(req.getParameter("pageOffset"))); } catch (NumberFormatException e) { e.printStackTrace(); } SystemContext.setPageOffset(pageOffset); SystemContext.setPageSize(pageSize); }finally{ //最终移除 SystemContext.removePageOffset(); SystemContext.removePageSize(); } chain.doFilter(req, resp); } @Override public void init(FilterConfig cfg) throws ServletException { try { pageSize = Integer.parseInt(cfg.getInitParameter("pageOffset")); } catch (NumberFormatException e) { //出现异常,初始化pageSize; pageSize = 10; } }}
1.4.4、在web.xml设置过滤器, 注意必须在Strtus的过滤器之前
1.5、在find() 中继续, 获取pageSize, pageOffset
1.5.1、查询
1.5.2、如何获取totalRecord
1.5.2.1、根据输入的查询对象的hql, 变化成查询记录条数的语句
/** * 根据hql, 获取 统计count(*) * from User ---> select count(*) from User * select * from User u where u.id = ? ---> select count(*) from User u where u.id=? * 总结就是将from 前面的替换成 select count(*) * * @param hql * @return */ private String getCountHql(String hql) { String f = hql.substring(0, hql.indexOf("from")); if (f.equals("")) { //from User hql = "select count(*)" + hql; }else { hql = hql.replace(f, "select count(*) "); } return hql; }
1.5.2.2、获取totalRecord
1.5.2.3 精简
1.6、创建分页标签/SSH01_struts2/WebContent/inc/pager.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><pg:pager maxPageItems="15" items="${param.items }" export="curPage=pageNumber" url="${param.url }"><c:forEach items="${param.params }" var="p"> <pg:param name="${p }"/></c:forEach><pg:last>共${items }记录,共${pageNumber }页,</pg:last>当前第${curPage }页<pg:first> <a href="${pageUrl }">首页</a></pg:first><pg:prev> <a href="${pageUrl }">上一页</a></pg:prev><pg:pages><c:if test="${curPage eq pageNumber }"> [${pageNumber }]</c:if><c:if test="${curPage ne pageNumber }"> <a href="${pageUrl }">${pageNumber }</a></c:if></pg:pages><pg:next> <a href="${pageUrl }">下一页</a></pg:next><pg:last> <a href="${pageUrl }">尾页</a></pg:last></pg:pager>
阅读全文
0 0