多线程的问题:如何保证界面的分页参数安全的传递到dao层?

本文介绍了一种利用ThreadLocal实现分页功能的方法。通过ThreadLocal存储分页参数,如当前页、总页数等,实现了线程间的数据隔离。文章详细展示了如何设置和获取这些参数,并提供了完整的PageFilter方法实现。

ThreadLocal是Java语言提供的用于支持线程局部变量的类。

所谓的线程局部变量,就是仅仅只能被本线程访问,不能再

线程之间进行共享访问的变量(每个线程一个拷贝),在java

web的各种框架(spring,mybatis,hibernate)中都有使用,今天

我们的这个分页也用ThreadLocal来传递参数


package com.netease.live.admin.util;
 
import com.netease.live.common.util.Constant;
 
/**
 *
 * @author bjliuzezhou
 * @description 使用threadLocal 封装分页所必需传的参数 
 * @date 2017年11月12日
 */
public class SystemContext {
    //当前第几页
    private static ThreadLocal<Integer> currentPage = new ThreadLocal<Integer>();
    //总共的页数
    private static ThreadLocal<Integer> totalPages = new ThreadLocal<Integer>();
    //起始数据位置
    private static ThreadLocal<Integer> offSet = new ThreadLocal<Integer>();
    //总记录的条数
    private static ThreadLocal<Integer> recordCount = new ThreadLocal<Integer>();
    //每页显示数
    private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>();
  
    /*
     * currentPage :get、set、remove
     */
    public static int getCurrentPage(){
        Integer cp = currentPage.get();
        if(cp == null){
            return 0;
        }
        return cp;
    }
     
    public static void setCurrentPage(int currentPage) {
     
        int validPage = currentPage > 0 ? currentPage : 1;
        validPage = validPage < getTotalPages() ? validPage : getTotalPages();
        SystemContext.currentPage.set(validPage);
         
    }
    public static void removeCurrentPage(){
        currentPage.remove();
    }
     
    /*
     * totalPages :get、set、remove
     */ 
    public static int getTotalPages() { 
        Integer tp = totalPages.get(); 
        if (tp == null) { 
            return 0
        
        return tp; 
    
     
    public static void calTotalPages() { 
         
        int totalPages = (getRecordCount() + getPageSize() -1) / getPageSize();
        SystemContext.totalPages.set(totalPages); 
    
     
    public static void removeTotalPages(){ 
        totalPages.remove(); 
    
     
    /*
     * offset :get、set、remove
     */ 
    public static int getOffSet() { 
        Integer os =offSet.get(); 
        if (os == null) { 
            return 0
        
        return os; 
    
     
    public static void calOffSet() { 
        int offset = (getCurrentPage() - 1) * getPageSize();
        int validOffSet = offset > 0 ? offset : 0;
        SystemContext.offSet.set(validOffSet);
    
     
     
    public static void removeOffSet(){ 
        offSet.remove(); 
    }  
     
    /*
     * recordCount :get、set、remove
     */
    public static int getRecordCount(){
        Integer rc = recordCount.get();
        if(rc == null){
            return 0;
        }
        return rc;
    }
     
    public static void setRecordCount(int recordCount) {
         
        SystemContext.recordCount.set(recordCount);
    }
    public static void removeRecordCount(){
        recordCount.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 pageSize) {
         
        SystemContext.pageSize.set(pageSize);
    }
    public static void removePageSize(){
        pageSize.remove();
    }
     
     
    public static void PageFilter(int recordCount,int pageSize,int currentPage){
        // 记录总条数
        SystemContext.setRecordCount(recordCount);
        SystemContext.setPageSize(Constant.PAGE_COUNT);
        SystemContext.calTotalPages();
        SystemContext.setCurrentPage(currentPage);
        SystemContext.calOffSet();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值