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>
原创粉丝点击