刚把上一篇Spring+Struts+Hibernate实现类似google的分页效果整理完,开始写下今天的主题文章,在freemarker下实现对分页的控制,其实最开始的打算是,直接调用以前写好的一个类库,然后再freemarker中调用自定义的标签来实现的,但是想想,算了,都写到这个份上了,还是直接写一个算了,对于以后的修改更为方便,恩,随着对freemarker的使用越来越频繁,真是发现这个东西太棒了,使view简化的不能再简化了,哈哈,偶喜欢。
代码部分很简洁,说下大致的处理流程:
运行环境是:Struts2+spring+ibatis
然后由ibatis–>spring–>struts2,再有struts2经过result到ftl文件,ftl文件中处理就可以了,具体的过程代码不再展示,这个很easy,也没什么展示的,无非就是dao,service,action之类的,写过来写过去没啥意思,把主要对分页处理的部分贴上来给大家看看。
代码中,pageCount,pageAfterNum,pageBeforeNum三项的值,是在后台设置上的,在系统启动时写入到applications中,所以可以不用任何获取就能直接使用,其他的话,要么经过request获取,要么就是计算得出的。好了,不扯了,直接贴上来好勒。
<#-- 分页 -->
<#macro pagePrint totalCount>
<#-- 获取相关参数,并把所有参数转换为数字类型,另外从applications中获取的也需要转换到数值型
当前页:indexPage,
总页数:totalPage,
当前页前显示页数:afterNum,
当前页后显示页数:beforeNum,
条件:where
-->
<#--获取当前页,如果没有当前页,则设置indexPage为1-->
<#assign indexPage = (request.getParameter('indexPage')!1)?eval />
<#assign totalPage = 1 />
<#assign afterNum = 1 />
<#assign beforeNum = 1 />
<#--获取参数,如果参数为null,则设置参数为空-->
<#assign where = (request.queryString!"") />
<#--处理条件中的indexPage参数,因每次都会自动获取indexPage,则需要截取掉该字符串,replace("","",""),最后一项r代表使用正则表达式替换-->
<#assign where = (where?replace("indexPa(.*?)&","","r"))>
<#assign pageCount = pageCount?eval />
<#assign pageAfterNum = pageAfterNum?eval />
<#assign pageBeforeNum = pageBeforeNum?eval />
<#--首先判断总页数-->
<#if totalCount % pageCount == 0>
<#assign totalPage = totalCount/pageCount>
<#else>
<#assign totalPage = totalCount/pageCount+1>
</#if>
<#--判断当前页前应显示多少数字-->
<#if indexPage lte pageAfterNum>
<#assign afterNum = indexPage - 1>
<#else>
<#assign afterNum = pageAfterNum>
</#if>
<#--判断当前页后应显示多少数字-->
<#assign beforeNum = indexPage + pageBeforeNum>
<#if beforeNum gt totalPage>
<#assign beforeNum = totalPage>
</#if>
<#--打印代码-->
<div id="pagePrint">
<span>共${totalCount}条/每页${pageCount}条</span>
<#--判断是否为第一页,如果不是第一页,则显示首页字样-->
<#if indexPage!=1>
<a href="?indexPage=1&${where}">首页</a><a href="?indexPage=${indexPage - 1}&${where}">上一页</a>
</#if>
<#--打印当前页码前显示的页码数-->
<#list afterNum..0 as i>
<#--判断是否到了0页,如果到,则退出-->
<#if i=0><#break></#if>
<a href="?indexPage=${indexPage-i}&${where}">${indexPage-i}</a>
</#list>
<#--打印当前页码-->
<span>${indexPage}</span>
<#--打印当前页码后显示的页码数-->
<#list (indexPage + 1)..beforeNum as i>
<#--判断当前页码是否大于了最终页,如果大于,则退出-->
<#if i gt beforeNum><#break></#if>
<a href="?indexPage=${i}&${where}">${i}</a>
</#list>
<#--判断是否到了最后一页,如果不是,则显示下一页,末页字样-->
<#if indexPage!=totalPage>
<a href="?indexPage=${indexPage + 1}&${where}">下一页</a><a href="?indexPage=${totalPage}&${where}">末页</a>
</#if>
</div>
<#--
测试输出:
totalPage:${totalPage}
afterNum:${afterNum}
beforeNum:${beforeNum}
-->
</#macro>
使用的时候直接<@pagePrint totalCount=200 />就可以了,传递的参数totalCount就是总记录数。
其实针对这段可以再分解开的,懒得弄了,告一段落,等到完全OK,做下期工作的时候再来整理吧,欢迎探讨,欢迎拍砖,欢迎XX。恩,你也可以到这里来转转,看下另外一篇关于分页的文章,不过建议还是不要看了,因为。。。算了,我还是看看吧。:)