经过前两篇文章(大话分页一大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章。

在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说,它没有任何问题,不过就OO思想来说,这个类是有一点问题的:实现分页,我们是要用到offSet和pageSize两个参数,也就是说他们是必须的。可是我们每当使用到分页的时候,除了穿业务逻辑所需的参数,还需要传递这两个参数。这样,方法未免有些太过冗长,有没有一种方法,可以让它自动传递这两个参数,开发人员不用手动去管它呢?它就是threadlocal。

下面SystemContext这个类里面就用Threadlocal封装了offSet和pageSize两个参数,并依次定义了他们的get、set和remove方法。

  1. package com.lzq;
  2.  
  3. /**
  4. * 使用threadLocal简化API
  5. * 由于封装的分页类AbstractPageManager,中的方法参数offSet和pageSize必要但是每个方法都必须写
  6. * 所以使用threadLocal简化
  7. * @author lzq
  8. *
  9. */
  10. public class SystemContext {
  11. //定义两个threadLocal变量:offSet和pageSize
  12. private static ThreadLocal<Integer> offSet = new ThreadLocal<Integer>();
  13. private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>();
  14. /*
  15. * offset :get、set、remove
  16. */
  17. public static int getOffSet() {
  18. Integer os =offSet.get();
  19. if (os == null) {
  20. return 0;
  21. }
  22. return os;
  23. }
  24. public static void setOffSet(int offSetValue) {
  25. offSet.set(offSetValue);
  26. }
  27. public static void removeOffSet(){
  28. offSet.remove();
  29. }
  30. /*
  31. * pageSize :get、set、remove
  32. */
  33. public static int getPageSize() {
  34. Integer ps = pageSize.get();
  35. if (ps == null) {
  36. return 0;
  37. }
  38. return ps;
  39. }
  40. public static void setPageSize(int pageSizeValue) {
  41. pageSize.set(pageSizeValue);
  42. }
  43. public static void removePageSize(){
  44. pageSize.remove();
  45. }
  46. }

PageFilter,用于获取前台传过来的offset的值以及设置pageSize的值。

  1. package com.lzq.web;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import com.lzq.SystemContext;
  12.  
  13. /**
  14. * 分页Filter,用于获取offSet和pageSize的值
  15. * @author lzq
  16. *
  17. */
  18. public class PageFilter implements Filter {
  19. @Override
  20. public void destroy() {}
  21.  
  22. @Override
  23. public void doFilter(ServletRequest request, ServletResponse response,
  24. FilterChain chain) throws IOException, ServletException {
  25.  
  26. HttpServletRequest httpRequest=(HttpServletRequest)request;
  27.  
  28. SystemContext.setOffSet(getOffSet(httpRequest));
  29. SystemContext.setPageSize(getPageSize());
  30.  
  31. try {
  32. chain.doFilter(request, response);
  33. }
  34. //使用完Threadlocal,将其删除。使用finally确保一定将其删除
  35. finally{
  36. SystemContext.removeOffSet();
  37. SystemContext.removePageSize();
  38. }
  39. }
  40. /**
  41. * 获得pager.offset参数的值
  42. * @param request
  43. * @return
  44. */
  45. protected int getOffSet(HttpServletRequest request) {
  46. int offSet = 0;
  47. try {
  48. String pageOff = request.getParameter("pager.offset");
  49. if (pageOff != null) {
  50. offSet =Integer.parseInt(pageOff);
  51. }
  52. } catch (NumberFormatException e) {
  53. e.printStackTrace();
  54. }
  55. return offSet;
  56. }
  57. /**
  58. * 设置默认每页大小
  59. * @return
  60. */
  61. protected int getPageSize() {
  62. return 4;
  63. }
  64. @Override
  65. public void init(FilterConfig arg0) throws ServletException {}
  66. }

在web.xml配置文件中对filter进行配置:

  1. <filter>
  2. <filter-name>PageFilter</filter-name>
  3. <filter-class>com.lzq.web.PageFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>PageFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

在工具类AbstractPageManager中,另外增加下面几个重载的工具API方法,以达到减少参数的目的。

  1. package com.lzq.manager.impl;
  2.  
  3. import org.hibernate.Query;
  4. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  5.  
  6. import com.lzq.PageModel;
  7. import com.lzq.SystemContext;
  8. import com.lzq.manager.SystemException;
  9. /**
  10. * 简化的分页API
  11. * @author lzq
  12. *
  13. */
  14. public class AbstractPageManager extends HibernateDaoSupport {
  15.  
  16. /**
  17. * 通过调用这些工具方法,简化API
  18. * @param hql
  19. * @return
  20. */
  21. public PageModel searchPaginate(String hql){
  22. return searchPaginate(hql,null,SystemContext.getOffSet(),SystemContext.getPageSize());
  23. }
  24. public PageModel searchPaginate(String hql, Object param){
  25. return searchPaginate(hql,new Object[]{param},SystemContext.getOffSet(),SystemContext.getPageSize());
  26. }
  27. public PageModel searchPaginate(String hql, int offSet, int pageSize){
  28. return searchPaginate(hql,null,offSet,pageSize);
  29. }
  30. public PageModel searchPaginate(String hql, Object param, int offSet, int pageSize){
  31. return searchPaginate(hql,new Object[]{param},offSet,pageSize);
  32. }
  33. }

测试调用的方法:

  1. /**
  2. * 测试方法
  3. *
  4. * @param parentId
  5. * @return
  6. */
  7. @Override
  8. public PageModel findOrgList(int id) {
  1. PageModel pageModel = null;
  1. String txtSQL = "from Organization o where o.parent.id= ?";
  1. pageModel = searchPaginate(txtSQL, id);
  2. return pageModel;
  3. }

至此,就更有点面向对象的意思了。编程中感觉别扭的时候,就该停下来想一想是不是自己太将就了。真正的程序员该干的活不是ctrl C 和 ctrl V,而是那些有思考的代码。

大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类的更多相关文章

  1. 封装关于金额计算的double工具类

    由于直接使用double类型的加减乘除,可能会出现不可预测的问题,精度丢失等等.在业务中,计算金额是一件很重要的事情. 可以直接使用BigDecimal类,进行加减乘除.相关BigDecimal类介绍 ...

  2. java反射的补充:桥接方法以及Spring中一些工具类

    在上一篇博文中:http://www.cnblogs.com/guangshan/p/4660564.html 源码中有些地方用到了 this.bridgedMethod = BridgeMethod ...

  3. Java 200+ 面试题补充 ThreadLocal 模块

    让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致. 本文是前文<Java 最常见的 200+ 面试题>的第一个补充模块. 1.ThreadLocal 是什么 ...

  4. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

  5. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  6. 【01-14】java ThreadLocal工具类

    自定义ThreadLocal package concurrent; import java.util.HashMap; import java.util.Map; /** * @author alo ...

  7. 轻量级封装DbUtils&Mybatis之三MyBatis分页

    MyBatis假分页 参考DefaultResultSetHandler的skipRows方法. 温馨提示:部分代码请参考轻量级封装DbUtils&Mybatis之一概要 解决方案 1)之前公 ...

  8. SQL Server 2012使用Offset/Fetch Next实现分页

    在Sql Server 2012之前,实现分页主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows  Fetch Next ... Rows onl ...

  9. 【SSH】——封装参数不确定的分页查询

    [前言] 在BS中,分页技术的应用相当频繁.说到分页,简单的分页就很好实现了,如果在分页的基础上再加上业务逻辑,这就使得分页的技术更加的灵活了. [简单分页] 我们先看一种简单的分页,为了做到复用,我 ...

随机推荐

  1. [React] React Router: activeStyle & activeClassName

    react-router provides two props for setting a specific style on a Link component whose path matches ...

  2. Transparency Tutorial with C# - Part 1

    Download demo project - 4 Kb Download source - 6 Kb Download demo project - 5 Kb Download source - 6 ...

  3. Jquery-uploadify多文件上传插件使用介绍

    Jquery-uploadify多文件上传插件使用起来非常的给力,在此记录一下使用方法. query-uploadify插件的属性设置 <script src="JS/jquery.m ...

  4. 从html字符串中获取div内容---jquery

    思考的问题: 怎么在一个网页的div中嵌套另外的网页(不使用inclue,iframe和frame,不使用他们的原因,include只能嵌套静态网页,iframe对网络爬虫影响,frame嵌套网页无法 ...

  5. WPF 获取屏幕分辨率(获取最大宽高)等

    double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...

  6. oracle nvl()函数在使用中出现的问题

    看一条sql select q.*, r.goods_name from (select nvl(t.goods_code, s.goods_code) goods_code, t.buy_open_ ...

  7. [转]XML中必须进行转义的字符

    转自:http://jaenson.iteye.com/blog/945469 编写XML代码经常遗漏的常识: XML实体中不允许出现"&","<" ...

  8. smarty练习: 设置试题及打印试卷

    数据库表格:shiti, shititimu, timu, kemu, xuanxiang 根据科目设置一个可以添加试题的页面:(如下图) 具体的题目从数据库中查出并形成一张试卷的形式 考试试题设置: ...

  9. 实例讲解MySQL联合查询

    好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...

  10. [转]NopCommerce MVC 插件机制分析

    原文地址:http://www.cnblogs.com/haoxinyue/archive/2013/06/06/3105541.html 基本原理 插件话的应用程序一般都是先定义插件接口,然后把插件 ...