大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类
经过前两篇文章(大话分页一、大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章。
在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说,它没有任何问题,不过就OO思想来说,这个类是有一点问题的:实现分页,我们是要用到offSet和pageSize两个参数,也就是说他们是必须的。可是我们每当使用到分页的时候,除了穿业务逻辑所需的参数,还需要传递这两个参数。这样,方法未免有些太过冗长,有没有一种方法,可以让它自动传递这两个参数,开发人员不用手动去管它呢?它就是threadlocal。
下面SystemContext这个类里面就用Threadlocal封装了offSet和pageSize两个参数,并依次定义了他们的get、set和remove方法。
- package com.lzq;
- /**
- * 使用threadLocal简化API
- * 由于封装的分页类AbstractPageManager,中的方法参数offSet和pageSize必要但是每个方法都必须写
- * 所以使用threadLocal简化
- * @author lzq
- *
- */
- public class SystemContext {
- //定义两个threadLocal变量:offSet和pageSize
- private static ThreadLocal<Integer> offSet = new ThreadLocal<Integer>();
- private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>();
- /*
- * offset :get、set、remove
- */
- public static int getOffSet() {
- Integer os =offSet.get();
- if (os == null) {
- return 0;
- }
- return os;
- }
- public static void setOffSet(int offSetValue) {
- offSet.set(offSetValue);
- }
- public static void removeOffSet(){
- offSet.remove();
- }
- /*
- * pageSize :get、set、remove
- */
- public static int getPageSize() {
- Integer ps = pageSize.get();
- if (ps == null) {
- return 0;
- }
- return ps;
- }
- public static void setPageSize(int pageSizeValue) {
- pageSize.set(pageSizeValue);
- }
- public static void removePageSize(){
- pageSize.remove();
- }
- }
PageFilter,用于获取前台传过来的offset的值以及设置pageSize的值。
- package com.lzq.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.lzq.SystemContext;
- /**
- * 分页Filter,用于获取offSet和pageSize的值
- * @author lzq
- *
- */
- public class PageFilter implements Filter {
- @Override
- public void destroy() {}
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- HttpServletRequest httpRequest=(HttpServletRequest)request;
- SystemContext.setOffSet(getOffSet(httpRequest));
- SystemContext.setPageSize(getPageSize());
- try {
- chain.doFilter(request, response);
- }
- //使用完Threadlocal,将其删除。使用finally确保一定将其删除
- finally{
- SystemContext.removeOffSet();
- SystemContext.removePageSize();
- }
- }
- /**
- * 获得pager.offset参数的值
- * @param request
- * @return
- */
- protected int getOffSet(HttpServletRequest request) {
- int offSet = 0;
- try {
- String pageOff = request.getParameter("pager.offset");
- if (pageOff != null) {
- offSet =Integer.parseInt(pageOff);
- }
- } catch (NumberFormatException e) {
- e.printStackTrace();
- }
- return offSet;
- }
- /**
- * 设置默认每页大小
- * @return
- */
- protected int getPageSize() {
- return 4;
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {}
- }
在web.xml配置文件中对filter进行配置:
- <filter>
- <filter-name>PageFilter</filter-name>
- <filter-class>com.lzq.web.PageFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>PageFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
在工具类AbstractPageManager中,另外增加下面几个重载的工具API方法,以达到减少参数的目的。
- package com.lzq.manager.impl;
- import org.hibernate.Query;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import com.lzq.PageModel;
- import com.lzq.SystemContext;
- import com.lzq.manager.SystemException;
- /**
- * 简化的分页API
- * @author lzq
- *
- */
- public class AbstractPageManager extends HibernateDaoSupport {
- /**
- * 通过调用这些工具方法,简化API
- * @param hql
- * @return
- */
- public PageModel searchPaginate(String hql){
- return searchPaginate(hql,null,SystemContext.getOffSet(),SystemContext.getPageSize());
- }
- public PageModel searchPaginate(String hql, Object param){
- return searchPaginate(hql,new Object[]{param},SystemContext.getOffSet(),SystemContext.getPageSize());
- }
- public PageModel searchPaginate(String hql, int offSet, int pageSize){
- return searchPaginate(hql,null,offSet,pageSize);
- }
- public PageModel searchPaginate(String hql, Object param, int offSet, int pageSize){
- return searchPaginate(hql,new Object[]{param},offSet,pageSize);
- }
- }
测试调用的方法:
- /**
- * 测试方法
- *
- * @param parentId
- * @return
- */
- @Override
- public PageModel findOrgList(int id) {
- PageModel pageModel = null;
- String txtSQL = "from Organization o where o.parent.id= ?";
- pageModel = searchPaginate(txtSQL, id);
- return pageModel;
- }
至此,就更有点面向对象的意思了。编程中感觉别扭的时候,就该停下来想一想是不是自己太将就了。真正的程序员该干的活不是ctrl C 和 ctrl V,而是那些有思考的代码。
大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类的更多相关文章
- 封装关于金额计算的double工具类
由于直接使用double类型的加减乘除,可能会出现不可预测的问题,精度丢失等等.在业务中,计算金额是一件很重要的事情. 可以直接使用BigDecimal类,进行加减乘除.相关BigDecimal类介绍 ...
- java反射的补充:桥接方法以及Spring中一些工具类
在上一篇博文中:http://www.cnblogs.com/guangshan/p/4660564.html 源码中有些地方用到了 this.bridgedMethod = BridgeMethod ...
- Java 200+ 面试题补充 ThreadLocal 模块
让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致. 本文是前文<Java 最常见的 200+ 面试题>的第一个补充模块. 1.ThreadLocal 是什么 ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 【01-14】java ThreadLocal工具类
自定义ThreadLocal package concurrent; import java.util.HashMap; import java.util.Map; /** * @author alo ...
- 轻量级封装DbUtils&Mybatis之三MyBatis分页
MyBatis假分页 参考DefaultResultSetHandler的skipRows方法. 温馨提示:部分代码请参考轻量级封装DbUtils&Mybatis之一概要 解决方案 1)之前公 ...
- SQL Server 2012使用Offset/Fetch Next实现分页
在Sql Server 2012之前,实现分页主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows Fetch Next ... Rows onl ...
- 【SSH】——封装参数不确定的分页查询
[前言] 在BS中,分页技术的应用相当频繁.说到分页,简单的分页就很好实现了,如果在分页的基础上再加上业务逻辑,这就使得分页的技术更加的灵活了. [简单分页] 我们先看一种简单的分页,为了做到复用,我 ...
随机推荐
- [React] React Router: activeStyle & activeClassName
react-router provides two props for setting a specific style on a Link component whose path matches ...
- Transparency Tutorial with C# - Part 1
Download demo project - 4 Kb Download source - 6 Kb Download demo project - 5 Kb Download source - 6 ...
- Jquery-uploadify多文件上传插件使用介绍
Jquery-uploadify多文件上传插件使用起来非常的给力,在此记录一下使用方法. query-uploadify插件的属性设置 <script src="JS/jquery.m ...
- 从html字符串中获取div内容---jquery
思考的问题: 怎么在一个网页的div中嵌套另外的网页(不使用inclue,iframe和frame,不使用他们的原因,include只能嵌套静态网页,iframe对网络爬虫影响,frame嵌套网页无法 ...
- WPF 获取屏幕分辨率(获取最大宽高)等
double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...
- oracle nvl()函数在使用中出现的问题
看一条sql select q.*, r.goods_name from (select nvl(t.goods_code, s.goods_code) goods_code, t.buy_open_ ...
- [转]XML中必须进行转义的字符
转自:http://jaenson.iteye.com/blog/945469 编写XML代码经常遗漏的常识: XML实体中不允许出现"&","<" ...
- smarty练习: 设置试题及打印试卷
数据库表格:shiti, shititimu, timu, kemu, xuanxiang 根据科目设置一个可以添加试题的页面:(如下图) 具体的题目从数据库中查出并形成一张试卷的形式 考试试题设置: ...
- 实例讲解MySQL联合查询
好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...
- [转]NopCommerce MVC 插件机制分析
原文地址:http://www.cnblogs.com/haoxinyue/archive/2013/06/06/3105541.html 基本原理 插件话的应用程序一般都是先定义插件接口,然后把插件 ...