`
Kenny.Lee
  • 浏览: 517873 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DetachedCriteria查询、分页类&整合struts标记制作分页按钮

阅读更多
花了两天时间才整理好的分页类,共享一下。

说明:该方法是参考了一下网上广为流传的DetachedCriteria查询方法后改进而来的。按照自己觉得满意的方法去修改了一下。并且配合struts1.2的标记配合使用,其实应该直接封装成自己分页标记的,或者使用JavaScript生成,但先这样吧,当作学习struts的标记库使用。

按钮的效果可以简单的做到附件图片上的效果





虽然不敢说完美的分页按钮,但比较满意的效果了。

------------------------------------

分页Bean类:

import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
/**
 * 分页常用的bean类。<br>
 * 里面包含搜索返回的List,查询条件DetachedCriteria及分页菜单用到的数据等。
 * 
 * @author KennyLee E-mail:kennylee26@gmail.com 2008-10-25
 */
public class KPaginationSupport implements Cloneable {
	// Default page size
	public static final int PAGESIZE = 20;
	public static final int MENU_SIZE = 7;
	// total Rows
	private int totalRowsAmount;
	private int pageSize = PAGESIZE;
	private int totalPages;
	// current page number
	private int currentPage = 1;
	// next page number
	private int nextPage;
	// previous page number
	private int previousPage;
	// is has next page
	private boolean hasNext;
	// is has previous page
	private boolean hasPrevious;
	// current page start row number
	private int pageStartRow = 0;
	// current page end row number
	private int pageEndRow;
	private String[] pageMenuNum;
	private int menuSize = MENU_SIZE;
	// Pagination values
	private List items;
	// select detachedCriteria
	private DetachedCriteria detachedCriteria;
	public KPaginationSupport() {
	}
	public String[] getPageMenuNum() {
		return pageMenuNum;
	}
	public void setPageMenuNum(String[] pageMenuNum) {
		this.pageMenuNum = pageMenuNum;
	}
	public DetachedCriteria getDetachedCriteria() {
		return detachedCriteria;
	}
	public void setDetachedCriteria(DetachedCriteria detachedCriteria) {
		this.detachedCriteria = detachedCriteria;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}
	public void setNextPage(int nextPage) {
		this.nextPage = nextPage;
	}
	public void setPreviousPage(int previousPage) {
		this.previousPage = previousPage;
	}
	public void setHasNext(boolean hasNext) {
		this.hasNext = hasNext;
	}
	public void setHasPrevious(boolean hasPrevious) {
		this.hasPrevious = hasPrevious;
	}
	public void setPageStartRow(int pageStartRow) {
		this.pageStartRow = pageStartRow;
	}
	public List getItems() {
		return items;
	}
	public void setItems(List items) {
		this.items = items;
	}
	public void setPageEndRow(int pageEndRow) {
		this.pageEndRow = pageEndRow;
	}
	/**
	 * 构造函数。
	 * 
	 * @param totalRows
	 *            总行数
	 * @param currentPage
	 *            当前页数
	 */
	public KPaginationSupport(int totalRows, int currentPage) {
		setPaginationSupport(totalRows, currentPage);
	}
	/**
	 * 构造函数。
	 * 
	 * @param totalRows
	 *            总行数
	 * @param currentPage
	 *            当前页数
	 * @param pageSize
	 *            每页显示数量。
	 */
	public KPaginationSupport(int totalRows, int currentPage, int pageSize) {
		this.pageSize = pageSize;
		this.setPaginationSupport(totalRows, currentPage);
		String[] pageNums = getPageMenuNums(currentPage);
		this.setPageMenuNum(pageNums);
	}
	public void setPaginationSupport(int totalRows, int currentPage) {
		// 获取总页码,通过对象总数还是每页多少行的关系
		setTotalRowsAmount(totalRows);
		setCurrentPage(currentPage);
	}
	public KPaginationSupport(List items, int totalCount) {
		setPageSize(PAGESIZE);
		setItems(items);
		int currentPage = 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	public KPaginationSupport(List items, int totalCount, int startIndex) {
		setPageSize(PAGESIZE);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	/**
	 * @param items
	 *            保存的目标List
	 * @param totalCount
	 *            查找的总行数
	 * @param pageSize
	 *            每页显示的行数
	 * @param startIndex
	 *            第几行开始
	 * 
	 */
	public KPaginationSupport(List items, int totalCount, int pageSize,
			int startIndex) {
		setPageSize(pageSize);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
	}
	/**
	 * 
	 * 构造PS时的初始化方法。
	 * 
	 * @param items
	 *            保存的目标List
	 * @param totalCount
	 *            查找的总行数
	 * @param pageSize
	 *            每页显示的行数
	 * @param startIndex
	 *            第几行开始
	 * 
	 */
	public KPaginationSupport(List items, int totalCount, int pageSize,
			int startIndex, DetachedCriteria detachedCriteria) {
		setPageSize(pageSize);
		setItems(items);
		int currentPage = (startIndex / pageSize) + 1;
		this.setPaginationSupport(totalCount, currentPage);
		setDetachedCriteria(detachedCriteria);
		String[] pageNums = getPageMenuNums(currentPage);
		this.setPageMenuNum(pageNums);
	}
	/**
	 * 分页导航按钮
	 * 
	 * @param currentPage
	 * @return
	 */
	private String[] getPageMenuNums(int currentPage) {
		String[] pageNums = null;
		if (totalPages > menuSize) {// 总页数大于导航显示的页数
			pageNums = new String[menuSize];
			int lastMenuNum = totalPages - menuSize + 1;// 最后一列导航栏按钮
			int beginMumNum = menuSize;
			int x = menuSize - 1;// 导航显示系数
			if ((currentPage < lastMenuNum) && (currentPage > beginMumNum)) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(currentPage + i - x / 2);
				}
			} else if (currentPage > lastMenuNum) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(lastMenuNum + i);
				}
			} else if (currentPage == lastMenuNum) {
				if ((lastMenuNum - x / 2) < 1) {
					lastMenuNum = x / 2 + 1;
				}
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(lastMenuNum + i - x / 2);
				}
			} else if (currentPage == beginMumNum) {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(1 + i + x / 2);
				}
			} else {
				for (int i = 0; i < menuSize; i++) {
					pageNums[i] = String.valueOf(1 + i);
				}
			}
		} else {// 总页数小于等于导航显示的页数,直接显示。
			pageNums = new String[totalPages];
			// 分页数比总页数少
			for (int i = 0; i < totalPages; i++) {
				pageNums[i] = String.valueOf(i + 1);
			}
		}
		return pageNums;
	}
	/**
	 * 设置总行数。
	 * 
	 * @param rows
	 *            总行数。
	 */
	private void setTotalRowsAmount(int rows) {
		if (rows < 0) {
			totalRowsAmount = 0;
		} else {
			totalRowsAmount = rows;
		}
		if (totalRowsAmount % pageSize == 0) {
			totalPages = totalRowsAmount / pageSize;
		} else {
			totalPages = totalRowsAmount / pageSize + 1;
		}
	}
	/**
	 *设置当前页数。
	 * 
	 * @param curPage
	 */
	private void setCurrentPage(int curPage) {
		if (curPage <= 0) {
			currentPage = 1;
		} else if (curPage > totalPages) {
			currentPage = totalPages;
		} else {
			currentPage = curPage;
		}
		if (currentPage == 1) {
			hasPrevious = false;
		} else {
			hasPrevious = true;
		}
		if (currentPage == totalPages) {
			hasNext = false;
		} else {
			hasNext = true;
		}
		nextPage = currentPage + 1;
		previousPage = currentPage - 1;
		// 计算当前页开始行和结束行
		pageStartRow = (currentPage - 1) * pageSize + 1;
		// pageStartRow = (currentPage - 1) * pageSize;
		// 记录索引从0开始
		pageStartRow -= 1;
		pageEndRow = pageStartRow + pageSize;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public boolean isHasNext() {
		return hasNext;
	}
	public boolean isHasPrevious() {
		return hasPrevious;
	}
	public int getNextPage() {
		return nextPage;
	}
	public int getPageSize() {
		return pageSize;
	}
	public int getPreviousPage() {
		return previousPage;
	}
	public int getTotalPages() {
		return totalPages;
	}
	public int getTotalRowsAmount() {
		return totalRowsAmount;
	}
	public int getPageStartRow() {
		return pageStartRow;
	}
	public int getPageEndRow() {
		return pageEndRow;
	}
	public String description() {
		String description = "Total:" + this.getTotalRowsAmount() + " items "
				+ this.getTotalPages() + " pages,Current page:"
				+ this.currentPage + " Previous " + this.hasPrevious + " Next:"
				+ this.hasNext + " start row:" + this.pageStartRow
				+ " end row:" + this.pageEndRow;
		return description;
	}
	public void init() {
		// do some initialization work
	}
	@Override
	public KPaginationSupport clone() throws CloneNotSupportedException {
		return (KPaginationSupport) super.clone();
	}
	public int getMenuSize() {
		return menuSize;
	}
	public void setMenuSize(int menuSize) {
		this.menuSize = menuSize;
	}
}


----------------------

DAO层,其实不需要局限用Criteria查询的。查询好需要的数据后,构造bean类,如下。

   1.                         PaginationSupport ps = new PaginationSupport(items,
   2.                                 totalCount, pageSize, startIndex,
   3.                                 detachedCriteria);

附上完整的DetachedCriteria查询方法供参考。在网上找到的,然后参考改进了一下,因为找到的都存在BUG,下面是修正后的版本。测试,并且正常使用中。

    /**
      * @param detachedCriteria
      * @param pageSize
      * @param startIndex
      */
     public PaginationSupport findPageByCriteria(
             final DetachedCriteria detachedCriteria, final int pageSize,
             final int startIndex) {
         
         log.info("in findByPage...");
         
         return (PaginationSupport) getHibernateTemplate().execute(
                 new HibernateCallback() {
                   public Object doInHibernate(Session session)
                             throws HibernateException {
                         Criteria criteria = detachedCriteria
                                 .getExecutableCriteria(session);
                         CriteriaImpl impl = (CriteriaImpl) criteria;
                         // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作
                         Projection projection = impl.getProjection();
                         int totalCount = ((Integer) criteria.setProjection(
                                 Projections.rowCount()).uniqueResult())
                                 .intValue();
                         log.info("totalCount:" + totalCount);
                         // 将之前的Projection和OrderBy条件重新设回去
                         criteria.setProjection(projection);
                         if (projection == null) {
                             criteria
                                     .setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                         }
                         List items = criteria.setFirstResult(startIndex)
                                 .setMaxResults(pageSize).list();
                         PaginationSupport ps = new PaginationSupport(items,
                                 totalCount, pageSize, startIndex,
                                 detachedCriteria);
                         // Set default status
                         criteria.setFirstResult(0).setMaxResults(totalCount);
                         return ps;
                     }
                 });
     }


----------------------

view层使用struts标签,代码有点长,供参考。注意css效果。
注意,action的方法其实需要两个即可,一个是第一次搜索的时候查询方法。另外一个是跳转到任何一页的方法。就算向前向后这样的方法其实并不需要。

                                <!-- pagination menu begin by KennyLee 2008-9-16 -->
                               <logic:present name="pageController" scope="request">
                                   <tr>
                                        <td colspan="6">
                                            <div id="pagination_info">
                                                [共${pageController.totalRowsAmount} 个账号] ${pageController.currentPage}/${pageController.totalPages}页(每页显示${pageController.pageSize})
                                           </div>
                                            <div class="pagination">
                                                <logic:equal value="true" name="pageController"
                                                   property="hasPrevious">
                                                  <html:link action="/mailbox/controller/list/pre"
                                                       paramId="toPageGo" paramName="pageController"
                                                       paramProperty="previousPage"><Perv</html:link>
                                               </logic:equal>
                                               <logic:notEqual value="true" name="pageController"
                                                   property="hasPrevious">
                                                   <span class="disabled"><Perv</span>
                                               </logic:notEqual>
                                               <logic:iterate id="num" name="pageController"
                                                   property="pageMenuNum" indexId="index">
                                                   <logic:equal value="0" name="index">
                                                       <logic:equal value="2" name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link>
                                                       </logic:equal>
                                                       <logic:greaterThan value="2" name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link>
                                                           <span>...</span>
                                                       </logic:greaterThan>
                                                   </logic:equal>
                                                   <logic:equal value="${num}" property="currentPage"
                                                       name="pageController">
                                                       <span class="current">${pageController.currentPage}</span>
                                                   </logic:equal>
                                                   <logic:notEqual value="${num}" property="currentPage"
                                                       name="pageController">
                                                       <html:link
                                                           page="/mailbox/controller/list/current.jspx?toPageGo=${num}">${num}</html:link>
                                                   </logic:notEqual>
                                                   <logic:equal value="${pageController.menuSize-1}"
                                                       name="index">
                                                       <logic:equal value="${pageController.totalPages-1}"
                                                           name="num">
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link>
                                                       </logic:equal>
                                                       <logic:lessThan value="${pageController.totalPages-1}"
                                                           name="num">
                                                           <span>...</span>
                                                           <html:link
                                                               page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link>
                                                       </logic:lessThan>
                                                   </logic:equal>
                                               </logic:iterate>
                                               <logic:equal value="true" name="pageController"
                                                   property="hasNext">
                                                   <html:link action="/mailbox/controller/list/next"
                                                       paramId="toPageGo" paramName="pageController"
                                                       paramProperty="nextPage">Next></html:link>
                                               </logic:equal>
                                               <logic:notEqual value="true" name="pageController"
                                                   property="hasNext">
                                                   <span class="disabled">Next></span>
                                               </logic:notEqual>
                                           </div>
                                       </td>
                                   </tr>
                               </logic:present>
                             <!-- pagination menu end -->
  • 大小: 5.1 KB
分享到:
评论

相关推荐

    struts2+spring+hibernate分页查询

    综上所述,Struts2、Spring和Hibernate的整合使得开发者能够便捷地实现分页查询,从而优化Web应用的性能和用户体验。在实际项目中,需要根据具体需求和业务场景,选择合适的分页策略和实现方式,同时注意性能优化和...

    sh分页,增删改查

    **Struts分页** 在Struts中,实现分页通常通过Action类和自定义拦截器完成。Action类接收请求并调用业务逻辑,返回相应的结果页面。分页参数(如当前页数、每页条数)可以封装在ActionForm或者Action支持类...

    留言板代码定义.pdf

    在`list()`方法中,`DetachedCriteria.forClass(Leave.class)`创建了一个针对`Leave`类的查询,`criteria.addOrder(Order.desc("regtime"))`设置了按“regtime”字段降序排列。 6. **Pagination(分页)**: 代码...

    ### 2024年第一季度青岛房地产市场季度简报总结、市场综述

    2024年第一季度,青岛房地产市场经历了显著变化,总体呈现供需双降的趋势。一季度全市商品房新增10,721套,面积约152.04万平方米,同比下降29%;销量为14,936套,面积约200.85万平方米,同比下降38%,成交均价为14,204元/平方米,同比下降2%。土地市场方面,供应总量为39万平方米,同比减少7%,但成交面积为27万平方米,同比增长31%,楼面地价为6,625元/平方米,同比增长253%,土地出让金为17.61亿元,同比增长354%。二手房市场新增挂牌2.9万套,成交13,405套,132.21万平方米,累计挂牌51.70万套,挂牌均价17,800元/平方米。此外,青岛市出台多项政策支持房地产市场平稳健康发展,包括降低房贷利率、优化开发用地土地规划政策、支持房企融资等。这些政策旨在促进市场供需平衡,防止市场大起大落。

    Linux常用命令大全.markdown

    linux常用命令大全

    MATLAB代码,用于模拟具有无限半空间体积导体的电机单元电势(MUP),星号.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    空调销售网站策划案例.doc

    空调销售网站策划案例.doc

    全球6G技术大会2024年以用户为中心的6G接入网技术研究白皮书31页.pdf

    全球6G技术大会2024年以用户为中心的6G接入网技术研究白皮书31页.pdf

    简约专业风格毕业答辩模板47个

    简约专业风格毕业答辩模板是一系列专为追求简洁与高效表达的大学生设计的答辩文档模板,共47个。这些模板融合了经典的设计元素与现代审美,强调信息的清晰传递与视觉的整洁,旨在帮助学生在答辩中以最专业的面貌展示自己的研究成果。 每个模板都具备结构合理的布局,适用于各个学科和研究领域,从人文社科到自然科学,均能满足不同需求。简约风格的设计使得学生能够专注于内容本身,避免冗余信息的干扰,提升答辩的专业性和可信度。此外,模板中合理运用的色彩、字体和图表设计,不仅增强了视觉吸引力,也使信息更易于理解。 通过使用这些简约专业风格的毕业答辩模板,毕业生能够自信地呈现自己的学术成果,提升答辩的整体效果,为成功的学术交流打下坚实基础。这些模板是展示个人研究与风格的理想选择。

    【数据集和模型】ChatGPT文本二分类

    由 Epsilon Luoo 在 HC3-Chinese 的基础上进行了一些细微的修改和清洗

    数字人动作捕捉:MATLAB-Kinect骨骼数据实时插值算法.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    HI3519DV500 配置无线网依赖库以及编译脚本

    HI3519DV500 配置无线网依赖库以及编译脚本

    定制小米8-lineage22.1安卓15-fast功能项目线刷双版root 解锁bl后fast线刷

    资源说明; 1-----刷写前提是手机必须解锁bl先。而且会在fast模式刷写固件 2-----刷写方法与官方刷写步骤一样 3-----此固件为定制初始固件。可以在fast模式刷写 4-----属于适配固件。也许有个别bug。不接受请勿下载 5-----需要一定的刷机常识与动手能力的友友刷写。 6-----资源有可复制性。下载后不支持退。请知悉 7-----定制其他需求可以在csdn私信博主 博文参阅:https://csdn9.blog.csdn.net/article/details/143058308

    【机械臂路径规划】基于matlab快速探索随机树RRT和概率路网PRM串联机械臂路径规划【含Matlab源码 13167期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    世邦魏理仕:2021年西安房地产市场回顾与2022年展望.pdf

    世邦魏理仕:2021年西安房地产市场回顾与2022年展望

    Android Studio 2022.1.1和java编程语言yinyuebofangqi.zip

    Android Studio 2022.1.1和java编程语言yinyuebofangqi

    C知道对话分享图片下载

    C知道对话分享图片

    png-jpg-gif-webp-tiff等图片压缩工具基于nodejs的实现

    png-jpg-gif-webp-tiff等图片压缩工具基于nodejs的实现,绿色本地免安装,解压后运行exe文件,将图片文件或者包含图片的文件夹拖拽到软件界面即可压缩

    派对屋A1效果器电脑调音软件

    我们要了解什么是DSP(Digital Signal Processing)。DSP即数字信号处理,是一种利用数字计算方法对信号进行分析、变换和操作的技术。在汽车音响领域,DSP被广泛应用于改善音质,通过调整频率响应、延时、相位和增益等参数,使声音更加均衡、立体。 惠威是一款数字信号处理器,适用于那些希望升级原车音响系统但预算有限的用户。它通常拥有多个输入和输出接口,可以连接到汽车的音频源和扬声器,通过软件进行调音,使得声音能够适应不同的驾驶环境和听音偏好。 ,集成了先进的噪声抑制技术和强大的功率放大器,旨在为发烧友级别的车载音响系统提供卓越的性能。用户可以通过软件对整个系统的每一个细节进行优化,包括主动分频、时间校正等,以达到Hi-Fi级别的音乐享受。

    通信工程分包合同.docx

    通信工程分包合同.docx

Global site tag (gtag.js) - Google Analytics