Java视频学习笔记2------SSH------分页解决方案
来源:互联网 发布:淘宝按了发布没反应 编辑:程序博客网 时间:2024/05/22 08:12
对分页处理做成一个解决方案,适应不同的查询条件
抽象一个的管理器类,对分页的处理过程进行封装
package com.bjsxt.oa.manager.impl; import java.util.List; import org.hibernate.Query; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.bjsxt.oa.PagerModel; import com.bjsxt.oa.manager.SystemException; public class AbstractManager extends HibernateDaoSupport{ /** * 根据Hql语句进行分页查询 * @param hql * @param params * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize) { //获取记录总数 String countHql = getCountQuery(hql); Query query = getSession().createQuery(countHql); if(params != null && params.length > 0){ for(int i=0; i<params.length; i++){ query.setParameter(i, params[i]); } } int total = ((Long)query.uniqueResult()).intValue(); //获取结果集 query = getSession().createQuery(hql); if(params != null && params.length > 0){ for(int i=0; i<params.length; i++){ query.setParameter(i, params[i]); } } query.setFirstResult(offset); query.setMaxResults(pagesize); List datas = query.list(); //返回PagerModel PagerModel pm = new PagerModel(); pm.setDatas(datas); pm.setTotal(total); return pm; } /** * 根据HQL语句,获得查询总记录数的HQL语句 * 如: * select ... from Organization o where o.parent is null * 经过转换,可以得到: * select count(*) from Organziation o where o.parent is null * @param hql * @return */ private String getCountQuery(String hql) { int index = hql.indexOf("from"); if(index != -1){ return "select count(*) " + hql.substring(index); } throw new SystemException("无效的HQL查询语句【"+hql+"】"); } }
让业务逻辑类去继承AbstractManager
为了适应不同的情况,多设计几个接口方法:
/** * 没有查询参数 * @param hql * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,int offset,int pagesize) { return searchPaginated(hql,null,offset,pagesize); } /** * 有一个查询参数 * @param hql * @param obj * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize) { return searchPaginated(hql,new Object[]{obj},offset,pagesize); }
原先的分页方法:
public PagerModel findOrgs(int parentId, int offset, int pagesize) { String selectCountHql = "select count(*) from Orgnization o where o.parent is null"; if (parentId != 0) { selectCountHql = "select count(*) from Orgnization o where o.parent.id = " + parentId; } int total = ((Long) getSession().createQuery(selectCountHql) .uniqueResult()).intValue(); String selectHql = "select o from Orgnization o where o.parent is null"; if (parentId != 0) { selectHql = "select o from Orgnization o where o.parent.id = " + parentId; } List datas = getSession().createQuery(selectHql).setFirstResult(offset) .setMaxResults(pagesize).list(); PagerModel pm = new PagerModel(); pm.setDatas(datas); pm.setTotal(total); return pm; }
修改后的分页方法:
public PagerModel findOrgs(int parentId, int offset, int pagesize) { String selectHql = "select o from Orgnization o where o.parent is null"; if (parentId != 0) { selectHql = "select o from Orgnization o where o.parent.id = " + parentId; } return searchPaginated(selectHql, offset, pagesize); }
在开发过程中要形成一个不断地封装、抽象的意识。
我们还可以进一步的简化,把上面这两个参数去掉,而用其他的手段来传输这两个值来进一步封装。因为是在多线程的环境下运行,所以这两个属性不能写成普通的静态类型,可以用ThreadLocal来封装这两个参数。
定义SystemContext,在类中定义ThreadLocal。
package com.bjsxt.oa; public class SystemContext { private static ThreadLocal offset = new ThreadLocal(); private static ThreadLocal pagesize = new ThreadLocal(); public static void setOffset(int _offset){ offset.set(_offset); } public static int getOffset(){ Integer os = (Integer)offset.get(); if(os == null){ return 0; } return os; } public static void removeOffset(){ offset.remove(); } public static void setPagesize(int _pagesize){ pagesize.set(_pagesize); } public static int getPagesize(){ Integer ps = (Integer)pagesize.get(); if(ps == null){ return Integer.MAX_VALUE; } return ps; } public static void removePagesize(){ pagesize.remove(); } }
定义一个过滤器调用set方法,在AbstractManager调用get方法
在过滤器里把offset,pagesize从客户端那取出来放到ThreadLocal中
package com.bjsxt.oa.web; 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 javax.servlet.http.HttpServletRequest; import com.bjsxt.oa.SystemContext; public class PagerFilter implements Filter { public static final String PAGE_SIZE_NAME = "ps"; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; SystemContext.setOffset(getOffset(httpRequest)); SystemContext.setPagesize(getPagesize(httpRequest)); try { chain.doFilter(request, response); } finally { //清空ThreadLocal中得值,防止内存溢出 SystemContext.removeOffset(); SystemContext.removePagesize(); } } private int getOffset(HttpServletRequest request) { int offset = 0; try { offset = Integer.parseInt(request.getParameter("pager.offset")); } catch (Exception ignore) { } return offset; } private int getPagesize(HttpServletRequest httpRequest) { return 10; } public void init(FilterConfig arg0) throws ServletException { } }
对AbstractManager方法进行修改扩充:
package com.bjsxt.oa.manager.impl; import java.util.List; import org.hibernate.Query; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.bjsxt.oa.PagerModel; import com.bjsxt.oa.SystemContext; import com.bjsxt.oa.manager.SystemException; public class AbstractManager extends HibernateDaoSupport{ /** * 只有hql语句 * @param hql * @return */ public PagerModel searchPaginated(String hql) { return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize()); } /** * 有一个查询参数 * @param hql * @return */ public PagerModel searchPaginated(String hql,Object obj) { return searchPaginated(hql,new Object[]{obj},SystemContext.getOffset(),SystemContext.getPagesize()); } /** * 有多个查询参数 * @param hql * @return */ public PagerModel searchPaginated(String hql,Object[] params) { return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize()); } /** * 没有查询参数 * @param hql * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,int offset,int pagesize) { return searchPaginated(hql,null,offset,pagesize); } /** * 有一个查询参数 * @param hql * @param obj * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize) { return searchPaginated(hql,new Object[]{obj},offset,pagesize); } /** * 根据Hql语句进行分页查询 * @param hql * @param params * @param offset * @param pagesize * @return */ public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize) { //获取记录总数 String countHql = getCountQuery(hql); Query query = getSession().createQuery(countHql); if(params != null && params.length > 0){ for(int i=0; i<params.length; i++){ query.setParameter(i, params[i]); } } int total = ((Long)query.uniqueResult()).intValue(); //获取结果集 query = getSession().createQuery(hql); if(params != null && params.length > 0){ for(int i=0; i<params.length; i++){ query.setParameter(i, params[i]); } } query.setFirstResult(offset); query.setMaxResults(pagesize); List datas = query.list(); //返回PagerModel PagerModel pm = new PagerModel(); pm.setDatas(datas); pm.setTotal(total); return pm; } /** * 根据HQL语句,获得查询总记录数的HQL语句 * 如: * select ... from Organization o where o.parent is null * 经过转换,可以得到: * select count(*) from Organziation o where o.parent is null * @param hql * @return */ private String getCountQuery(String hql) { int index = hql.indexOf("from"); if(index != -1){ return "select count(*) " + hql.substring(index); } throw new SystemException("无效的HQL查询语句【"+hql+"】"); } }
web.xml配置pagerFilter过滤器
<filter><filter-name>pagerFilter</filter-name><filter-class>com.bjsxt.oa.web.PagerFilter</filter-class></filter><filter-mapping><filter-name>pagerFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
- Java视频学习笔记2------SSH------分页解决方案
- SSH视频学习笔记
- java SSH学习笔记
- java视频学习笔记
- java学习笔记--ssh框架
- 圣思园Java视频 学习笔记
- Java/SSH分页组件
- ssh框架学习视频
- ssh学习笔记(2)
- 毕向东Java视频学习笔记【day21-IO流<2>】
- 网络编程2--毕向东java基础教程视频学习笔记
- 网络编程2--毕向东java基础教程视频学习笔记
- 集合2--毕向东java基础教程视频学习笔记
- JAVA学习笔记_真假分页查询
- 看尚学堂视频Java学习笔记
- 张孝祥java视频学习笔记(一)
- 张孝祥java视频学习笔记(二)
- 张孝祥java视频学习笔记(三)
- SLC和MLC的 简介 及 区别
- 监听类的创建
- 为什么只要2k月薪也不录用这些应聘者?
- 安装并运行 Android NDK R7b
- 两个被广泛使用的Model Checking工具
- Java视频学习笔记2------SSH------分页解决方案
- Java泛型简明教程
- java 怎么取得视频文件的总时长
- DB2对于Linux下HADR配置步骤(linux环境 测试成功)
- 监控android USB拔插
- Flex 实现 在图表线上显示多个箭头解决思路
- 玩转数组 指针参数之c专家编程第九章
- JAVA定时器
- flex上传带中文参数,但是在后台转换成中文时,IE内核的浏览器可以成功,但是火狐和谷歌等不行。解决方案