浏览 7124 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-11
最后修改:2008-12-11
貌似在网上也没找到类似的作法,所以,如果这种作法有什么隐患或性能问题,还请朋友们批评。 注:下面的代码只是示例性质的,难免有一些Bug或考虑不全之处存在,希望大家不必对代码本身过多要求,更多的是看一下这种作法是否可取。 首先,看一下使用方法。 在需要进行分页显示的文件中,引入分页显示的ftl库文件。 <#import "*/common/pager.ftl" as pager> 在需要显示分页列表的位置,加入以下代码,实现分页显示。 <@pager.p page=page totalpage=totalPage /> 其中,“p”是宏的名字;“page=page”中的第一个page是宏的参数,第二个page是来自Action对象中的属性(带有get/set方法的成员变量),page属性主要是标注当前要显示的页号,即第几页;同样的,“totalpage=totalPage”也是类似的,totalpage属性主要是告诉分页宏,总页数是多少。 经过上面两段代码,再配合在Action中取得要显示数据的总页数,就可以分页了。 接下来,我们看一下分面效果截图。 最后,我们看一下分页效果的处理文件“pager.ftl”中宏“p”是如何定义的。 <#macro p page totalpage params='' maxsteps=6> <#assign ipage=page?number> <#if maxsteps <= 0> <#assign maxsteps=5> </#if> <#assign offset = ((ipage - 1) / maxsteps)?int> <#assign offsetLast = ((totalpage - 1) / maxsteps)?int> <#-- url附加参数的判断 --> <#assign requestParams = ""> <#if (params?? && params != '')> <#assign requestParams = '&' + params> </#if> <#-- 首页 --> <#if ipage gt 1> <a href="?page=1${requestParams}"><<</a> <#else> <span class="disabled"><<</span> </#if> <#-- 前组--> <#if offset gt 0> <a href="?page=${offset * maxsteps}${requestParams}">…</a> <#else> <span class="disabled">…</span> </#if> <#-- 当前组中的页号--> <#if (offset + 1) * maxsteps < totalpage> <#assign pagelist = (offset + 1) * maxsteps> <#else> <#assign pagelist = totalpage> </#if> <#if ipage gt 0 && ipage lte totalpage> <#list (offset * maxsteps + 1)..pagelist as num> <#if ipage != num> <a href="?page=${num}${requestParams}">${num}</a> <#else> <strong>${num}</strong> </#if> </#list> </#if> <#-- 下组 --> <#if offset lt offsetLast> <a href="?page=${(offset + 1) * maxsteps + 1}${requestParams}">…</a> <#else> <span class="disabled">…</span> </#if> <#-- 尾页 --> <#if ipage lt totalpage> <a href="?page=${totalpage}${requestParams}">>></a> <#else> <span class="disabled">>></span> </#if> <#-- 前一页 --> <#if ipage gt 1> <a href="?page=${ipage - 1}${requestParams}">前一页</a> <#else> <span class="disabled">前一页</span> </#if> <#-- 后一页 --> <#if ipage lt totalpage> <a href="?page=${ipage + 1}${requestParams}">后一页</a> <#else> <span class="disabled">后一页</span> </#if> </#macro> 对另外两个参数特别说明一下。 params:有时,我们分页的内容是通过查询获得的,或是分页中还有其他参数时,可以作为附加的参数附在分页URL后面。 maxsteps:目前的分页效果类似于.net中DataView的默认分页效果,默认当分页数超过六页时,最多显示六个页号。当然可以通过maxsteps参数,调整分页显示时最多显示的页号数。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-27
看了博主的几篇文章,写的都很棒。循环渐进,慢慢倒来。技术文笔值得欣赏。
|
|
返回顶楼 | |
发表时间:2009-05-27
这贴必须得回,谢谢表扬。
本来以为用FreeMarker的宏写分页只是我想到了,就写了个篇文章,没想到后来发现原来很多人都想到了,而且JavaEye上有个人比我早写了类似的文章,而且实现上更完美更完善。比较无奈。 |
|
返回顶楼 | |
发表时间:2009-05-27
和把逻辑写在一个JSP然后input做法是一样的
一直认为FreeMarker增加了逻辑操作是他最大的失误 |
|
返回顶楼 | |
发表时间:2009-05-27
最后修改:2009-05-27
结合DetachedCriteria实现分页是比较完美的,仿造.Net 的DataView,我也做过类似
已经用了一年多了,效果还不错,我把列分为模板列和绑定列,同时支持排序指定,分页是个附加组件,使用效果如下: <@xj.datagrid id="page" datasrc=page > <@xj.templatecolumn title="" width="8%"> <@xj.celleditbutton click="editUser.action?user=${rowdata.id}" title="编辑"/> </@xj.templatecolumn> <@xj.sequence title="编号" sort="id" width="5%"/> <@xj.column title="登录名" name="loginname" sort="loginname"/> <@xj.templatecolumn title="姓名" > <#if rowdata.info?exists && rowdata.info.realname?exists> ${rowdata.info.realname} <#else> </#if> </@xj.templatecolumn> <@xj.pager/> </@xj.datagrid> 回楼上的,其实也算不上逻辑操作呀,对数据进行分页显示属于展示层逻辑,不属于业务逻辑 |
|
返回顶楼 | |
发表时间:2009-05-27
KimShen 写道 和把逻辑写在一个JSP然后input做法是一样的
一直认为FreeMarker增加了逻辑操作是他最大的失误 我倒觉得FreeMarker做的恰如其分。 在ftl文件中写入一定的表示用逻辑,还是非常方便的。 结合FreeMarker自带的函数和逻辑处理,再加上Macro,FreeMarker在表示层的处理还是相当完美的, 并且一点也不会影响到业务逻辑,相反相当清晰。 直接用Jsp时,你就会陷入不知道哪个应该写Tag、哪个应该放到Jsp中处理、哪个应该在Action中处理的取舍中去。 Tag还是相当不爽的东西。 |
|
返回顶楼 | |
发表时间:2009-05-27
atianchen 写道 结合DetachedCriteria实现分页是比较完美的,仿造.Net 的DataView,我也做过类似
已经用了一年多了,效果还不错,我把列分为模板列和绑定列,同时支持排序指定,分页是个附加组件,使用效果如下: <@xj.datagrid id="page" datasrc=page > <@xj.templatecolumn title="" width="8%"> <@xj.celleditbutton click="editUser.action?user=${rowdata.id}" title="编辑"/> </@xj.templatecolumn> <@xj.sequence title="编号" sort="id" width="5%"/> <@xj.column title="登录名" name="loginname" sort="loginname"/> <@xj.templatecolumn title="姓名" > <#if rowdata.info?exists && rowdata.info.realname?exists> ${rowdata.info.realname} <#else> </#if> </@xj.templatecolumn> <@xj.pager/> </@xj.datagrid> 没用过,看样子不错。 atianchen 写道 回楼上的,其实也算不上逻辑操作呀,对数据进行分页显示属于展示层逻辑,不属于业务逻辑 支持 + 赞同 |
|
返回顶楼 | |