pager-taglib分页逻辑的封装处理

本文介绍了一种利用ThreadLocal模式进行分页参数传递的方法,通过在过滤器中设置分页参数,并在业务逻辑层获取这些参数,实现高效的数据分页查询。
为了避免在Action(呈现层)和Manager(业务逻辑层)之间传递大量的参数,
可以使用ThreadLocal模式来传递分页参数(包括:offset和pagesize)。
- 定义: 参考SystemContext.java
- 往ThreadLocal中赋值:参考PagerFilter.java
- 从ThreadLocal中获取分页参数:参考AbstractManager.java



package com.xwj.oa.pageSearch;
import java.util.List;

import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.xwj.oa.utils.SystemException;


public class AbstractManager extends HibernateDaoSupport {

public pagerModel searchPaginated (String hql){
return searchPaginated ( hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
}

public pagerModel searchPaginated (String hql,Object param){
return searchPaginated ( hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
}

public pagerModel searchPaginated (String hql,int offset,int pagesize){
return searchPaginated ( hql,null,offset,pagesize);
}


/**
*
* @param hql
* @param params
* @param offset
* @param pagesize
* @return
*/
public pagerModel searchPaginated (String hql,Object[] params,int offset,int pagesize){

String countHql = this.getCountQuery(hql);
Query query = this.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 = this.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 pm = new pagerModel();
pm.setDatas(datas);
pm.setTotal(total);

return pm;


}

private String getCountQuery(String hql){
int index = hql.indexOf("from");
if(index != -1){
String countQuery = "select count(*) "+" "+hql.substring(index);
return countQuery;
}
throw new SystemException("无效的HQL查询");
}
}




package com.xwj.oa.pageSearch;

public class SystemContext {

private static ThreadLocal offset = new ThreadLocal();
private static ThreadLocal pagesize = new ThreadLocal();

public static int getOffset(){
Integer os = (Integer)(offset.get());
if(os == null){
return 0;
}
return os.intValue();
}

public static void setOffset(int offsetValue){
offset.set(new Integer(offsetValue));
}

public static void removeOffset(){
offset.remove();
}


public static int getPagesize(){
Integer ps =(Integer) pagesize.get();
if(ps == null){
return Integer.MAX_VALUE;
}
return ps.intValue();
}

public static void setPagesize(int pagesizeValue){
pagesize.set(new Integer(pagesizeValue));
}

public static void removePagesize(){
pagesize.remove();
}

}




package com.xwj.oa.pageSearch;

import java.util.List;

public class pagerModel {
/**
* 总记录数
*/
private int total;

/**
* 当前的结果集
*/
private List datas;

public int getTotal() {
return total;
}

public void setTotal(int total) {
this.total = total;
}

public List getDatas() {
return datas;
}

public void setDatas(List datas) {
this.datas = datas;
}
}



package com.xwj.oa.pageSearch;

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;


public class PagerFilter implements Filter {

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest)request;
SystemContext.setOffset(this.getOffset(httpRequest));
SystemContext.setPagesize(this.getPagesize(httpRequest));

try{
chain.doFilter(request, response);
}finally{
SystemContext.removeOffset();
SystemContext.removePagesize();
}

}

private int getOffset(HttpServletRequest httpRequest){
int offset = 0 ;
try{
offset=Integer.parseInt(httpRequest.getParameter("pager.offset"));
}catch(NumberFormatException ignore){

}
return offset;
}

private int getPagesize(HttpServletRequest httpRequest){

return 10;
}

public void init(FilterConfig arg0) throws ServletException {

}

}


上面写了一个fileter,因此要在web-xml中作相应的配置

<!-- pagerFileter -->
<filter>
<filter-name>PagerFilter</filter-name>
<filter-class>com.xwj.oa.pageSearch.PagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PagerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




public class OrgManagerImpl extends AbstractManager implements OrgManager {
public PagerModel findOrgs(int parentId) {

//如果parentId=0,则查找顶级机构列表
if(parentId == 0){
return searchPaginated("from Orgnization o where o.parent is null");
}
return searchPaginated("from Orgnization o where o.parent.id = ?", parentId);
}
}




public class OrgAction extends DispatchAction {

private OrgManager orgManager;

/**
* 打开机构管理主界面
*/
@Override
protected ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

OrgActionForm oaf = (OrgActionForm)form;

request.setAttribute("pm",
orgManager.findOrgs(oaf.getParentId())
);
}
}





<pg:pager url="org.do" items="${pm.total }" maxPageItems="10" export="currentPageNumber=pageNumber">
<pg:param name="parentId" />
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }">前页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber }">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }">后页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }">尾页</a>
</pg:last>
</pg:pager>
标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值