`
zhujyy
  • 浏览: 6329 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用FreeMarker的宏来实现Struts2的分页显示

阅读更多
看到一些朋友在Struts2中,依然使用标签来实现分页显示,而在基于Struts2的开发中,可能很多朋友会采用FreeMarker模板来渲染表示层,那么对于采用FreeMarker进行渲染的页面来说,我在这里提出一种使用FreeMarker的宏来实现分页显示的作法,这种作法,我感觉更简单灵活。
貌似在网上也没找到类似的作法,所以,如果这种作法有什么隐患或性能问题,还请朋友们批评。

注:下面的代码只是示例性质的,难免有一些Bug或考虑不全之处存在,希望大家不必对代码本身过多要求,更多的是看一下这种作法是否可取。

首先,看一下使用方法。
在需要进行分页显示的文件中,引入分页显示的ftl库文件。
Xml代码

   1. <#import "*/common/pager.ftl" as pager> 

<#import "*/common/pager.ftl" as pager>



在需要显示分页列表的位置,加入以下代码,实现分页显示。
Java代码

   1. <@pager.p page=page totalpage=totalPage /> 

<@pager.p page=page totalpage=totalPage />



其中,“p”是宏的名字;“page=page”中的第一个page是宏的参数,第二个page是来自Action对象中的属性(带有 get/set方法的成员变量),page属性主要是标注当前要显示的页号,即第几页;同样的,“totalpage=totalPage”也是类似的,totalpage属性主要是告诉分页宏,总页数是多少。

经过上面两段代码,再配合在Action中取得要显示数据的总页数,就可以分页了。

接下来,我们看一下分面效果截图。




最后,我们看一下分页效果的处理文件“pager.ftl”中宏“p”是如何定义的。
Xml代码

   1. <#macro p page totalpage params='' maxsteps=6> 
   2.     <#assign ipage=page?number> 
   3.     <#if maxsteps <= 0> 
   4.         <#assign maxsteps=5> 
   5.     </#if> 
   6.     <#assign offset = ((ipage - 1) / maxsteps)?int> 
   7.     <#assign offsetLast = ((totalpage - 1) / maxsteps)?int> 
   8.      
   9.     <#-- url附加参数的判断 --> 
  10.     <#assign requestParams = ""> 
  11.     <#if (params?? && params != '')> 
  12.         <#assign requestParams = '&' + params> 
  13.     </#if> 
  14.      
  15.     <#-- 首页 --> 
  16.     <#if ipage gt 1> 
  17.         <a href="?page=1${requestParams}">&lt;&lt;</a> 
  18.     <#else> 
  19.         <span class="disabled">&lt;&lt;</span> 
  20.     </#if> 
  21.     <#-- 前组--> 
  22.     <#if offset gt 0> 
  23.         <a href="?page=${offset * maxsteps}${requestParams}">…</a> 
  24.     <#else> 
  25.         <span class="disabled">…</span> 
  26.     </#if> 
  27.     <#-- 当前组中的页号--> 
  28.     <#if (offset + 1) * maxsteps < totalpage> 
  29.         <#assign pagelist = (offset + 1) * maxsteps> 
  30.     <#else> 
  31.         <#assign pagelist = totalpage> 
  32.     </#if> 
  33.     <#if ipage gt 0 && ipage lte totalpage> 
  34.         <#list (offset * maxsteps + 1)..pagelist as num> 
  35.             <#if ipage != num> 
  36.                 <a href="?page=${num}${requestParams}">${num}</a> 
  37.             <#else> 
  38.                 <strong>${num}</strong> 
  39.             </#if> 
  40.         </#list> 
  41.     </#if> 
  42.     <#-- 下组 --> 
  43.     <#if offset lt offsetLast> 
  44.         <a href="?page=${(offset + 1) * maxsteps + 1}${requestParams}">…</a> 
  45.     <#else> 
  46.         <span class="disabled">…</span> 
  47.     </#if> 
  48.     <#-- 尾页 --> 
  49.     <#if ipage lt totalpage> 
  50.         <a href="?page=${totalpage}${requestParams}">&gt;&gt;</a> 
  51.     <#else> 
  52.         <span class="disabled">&gt;&gt;</span> 
  53.     </#if> 
  54.     <#-- 前一页 --> 
  55.     <#if ipage gt 1> 
  56.         <a href="?page=${ipage - 1}${requestParams}">前一页</a> 
  57.     <#else> 
  58.         <span class="disabled">前一页</span> 
  59.     </#if> 
  60.     <#-- 后一页 --> 
  61.     <#if ipage lt totalpage> 
  62.         <a href="?page=${ipage + 1}${requestParams}">后一页</a> 
  63.     <#else> 
  64.         <span class="disabled">后一页</span> 
  65.     </#if> 
  66. </#macro> 

<#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}">&lt;&lt;</a>
<#else>
<span class="disabled">&lt;&lt;</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}">&gt;&gt;</a>
<#else>
<span class="disabled">&gt;&gt;</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参数,调整分页显示时最多显示的页号数。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics