思路:定义一个freemaker宏,接收参数。然后在freemaker页面上import这个文件,把参数传进来在server端渲染。

分页标签:pager.ftl

<#-- 自定义的分页指令。
属性说明:
pageNo 当前页号(int类型)
pageSize 每页要显示的记录数(int类型)
toURL 点击分页标签时要跳转到的目标URL(string类型)
pageCount 总页码数(int类型)
method 查询方法的类型(GET/POST)
recordCount 总记录数(int类型)
使用方式:
<#if recordCount??>
<#import "/pager.ftl" as p>
<@p.pager pageNo=1 pageSize=10 recordCount=13 pageCount=2 toURL="xxxxx/queryXXX" method="get"/>
</#if>
--> <#macro pager pageNo pageSize recordCount pageCount toURL method>
<#-- 定义局部变量pageCount保存总页数 -->
<#if recordCount==0><#return/></#if>
<#-- 输出分页样式 -->
<style type="text/css">
.pagination {padding: 5px;float:right;font-size:12px;}
.pagination a, .pagination a:link, .pagination a:visited {padding:2px 5px;margin:2px;border:1px solid #aaaadd;text-decoration:none;color:#006699;}
.pagination a:hover, .pagination a:active {border: 1px solid #ff0000;color: #000;text-decoration: none;}
.pagination span.current {padding: 2px 5px;margin: 2px;border: 1px solid #ff0000;font-weight: bold;background-color: #ff0000;color: #FFF;}
.pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}
</style>
<#-- 页号越界处理 -->
<#if (pageNo > pageCount)>
<#assign pageNo=pageCount>
</#if>
<#if (pageNo < 1)>
<#assign pageNo=1>
</#if>
<#-- 输出分页表单 -->
<div class="pagination">
<form method="${method}" action="" name="qPagerForm">
<#-- 把请求中的所有参数当作隐藏表单域(无法解决一个参数对应多个值的情况) -->
<#list RequestParameters?keys as key>
<#if (key!="page" && RequestParameters[key]??)>
<input type="hidden" name="${key}" value="${RequestParameters[key]}"/>
</#if>
</#list>
<input type="hidden" name="page" value="${pageNo}"/>
<span>共${recordCount}条记录,</span>
<span>当前第<b>${pageNo}/${pageCount}</b>页</span>
<#-- 上一页处理 -->
<#if (pageNo == 1)>
<span class="disabled">&laquo;&nbsp;上一页</span>
<#else>
<a href="javascript:void(0)" onclick="turnOverPage(${pageNo - 1})">&laquo;&nbsp;上一页</a>
</#if>
<#-- 如果前面页数过多,显示... -->
<#assign start=1>
<#if (pageNo > 4)>
<#assign start=(pageNo - 1)>
<a href="javascript:void(0)" onclick="turnOverPage(1)">1</a>
<a href="javascript:void(0)" onclick="turnOverPage(2)">2</a>&hellip;
</#if>
<#-- 显示当前页号和它附近的页号 -->
<#assign end=(pageNo + 1)>
<#if (end > pageCount)>
<#assign end=pageCount>
</#if>
<#list start..end as i>
<#if (pageNo==i)>
<span class="current">${i}</span>
<#else>
<a href="javascript:void(0)" onclick="turnOverPage(${i})">${i}</a>
</#if>
</#list>
<#-- 如果后面页数过多,显示... -->
<#if (end < pageCount - 2)>
&hellip;
</#if>
<#if (end < pageCount - 1)>
<a href="javascript:void(0)" onclick="turnOverPage(${pageCount - 1})">${pageCount-1}</a>
</#if>
<#if (end < pageCount)>
<a href="javascript:void(0)" onclick="turnOverPage(${pageCount})">${pageCount}</a>
</#if>
<#-- 下一页处理 -->
<#if (pageNo == pageCount)>
<span class="disabled">下一页&nbsp;&raquo;</span>
<#else>
<a href="javascript:void(0)" onclick="turnOverPage(${pageNo + 1})">下一页&nbsp;&raquo;</a>
</#if>
</form>
<script language="javascript">
function turnOverPage(no){
var qForm=document.qPagerForm;
if(no>${pageCount}){no=${pageCount};}
if(no<1){no=1;}
qForm.page.value=no;
qForm.action="${toURL}";
qForm.submit();
}
</script>
</div>
</#macro>

使用示例:user.ftl

在这个freemaker页面上引入分页标签,后台查询一个pageBean,pageBean里面有页码信息、pageBean.result放着用户列表。

<html>
<head>
<title>FreeMarker自定义分页标签使用示例</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
你好, <b>${message}</b><br/>
<hr/><br/>
<table width="100%" border="1">
<tr>
<td width="50%">用户代码</td>
<td width="50%">用户姓名</td>
</tr>
<#list pageBean.result as eachUser>
<tr>
<td width="50%"><#if eachUser.idNumber ??>${eachUser.idNumber}</#if></td>
<td width="50%"><#if eachUser.nickName ??>${eachUser.nickName}</#if></td>
</tr>
</#list>
</table>
<div id="pager">
<#import "/pager.ftl" as p>
<!--#if recordCount??-->
<@p.pager pageNo=pageBean.pageNo pageSize=pageBean.pageSize recordCount=pageBean.totalCount pageCount=pageBean.maxPage toURL="xxxx/queryUser" method="get"/>
<!--/#if-->
</div>
</body>
</html>

pageBean对象:

 package com.hjb.platform.base.model;

 import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Page {
//页面大小
private Integer pageSize;
//当前页码
private Integer pageNo;
//查询开始条数
private Integer minRows;
//查询截至条数
private Integer maxRows;
//最大页码数
private Integer maxPage;
//总记录数
private int totalCount;
//所有记录
private List<?> result;
//页面上的查询条件
private Map<String,Object> parm = new HashMap<String,Object>(); public Page() {
} public void calculateRows() {
if (pageSize == null || pageSize == 0) {
this.pageSize = 10;
}
if (pageNo == null || pageNo == 0) {
this.pageNo = 1;
}
this.minRows = (pageNo - 1) * pageSize;
this.maxRows = pageNo * pageSize;
if (this.totalCount % this.pageSize == 0) {
this.maxPage = this.totalCount / this.pageSize;
} else {
this.maxPage = (this.totalCount / this.pageSize) + 1;
} } public Map<String,Object> getAllParms(){
this.parm.put("minRows", minRows);
this.parm.put("maxRows", maxRows);
return this.parm;
} //getter setter }

前台表单参数都放到parm这个Map中,在service中调用calculateRows()方法,会自动计算本次查询的开始、截至条数。然后把这个pageBean.getAllParms()这个map传给mybatis去查询分页。查到一个list,把list塞到pageBean的result里。然后把这个查询到的pageBean放到modelAndView中,view名字就是user.ftl,最后controller返回就行。

当然,我们项目中最后没有采用这种方法。主要是使用起来比较麻烦。

最终我们使用了javascript的分页标签。(如smartpaginator.js等一些优秀的分页标签很容易使用,当然,如果前端功力深厚可以自己写一个js的分页标签)

freemaker分页备忘的更多相关文章

  1. AngularJS之备忘与诀窍

    译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的. ...

  2. ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘

    本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...

  3. Angularjs ngTable使用备忘

    项目中用到angularjs的表格ng-table,功能相当强大,像搜索.排序.checkbox.分页.每页表格显示数目等都有.API,demo什么的也只能参考官网了.这里做个备忘,哪天肯定还会用到. ...

  4. Linux基础之常用基本命令备忘

    Linux基础之常用基本命令备忘 PWD   查询当前所在Linux上的位置 /         根目录 CD(change directory)切换目录  语法 CD /(注意添加空格)   LS ...

  5. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  6. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  7. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  8. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  9. [备忘] Automatically reset Windows Update components

    这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...

随机推荐

  1. 软件测试 -- Bug等级划分规范

    1. Blocker级别——中断缺陷 客户端程序无响应,无法执行下一步操作. 2. Critical级别――临界缺陷,包括: 功能点缺失,客户端爆页. 3. Major级别——较严重缺陷,包括: 功能 ...

  2. Objective-c开发中混合使用ARC

    首选“Compile Sources”的位置: 选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了. ...

  3. python里面的几个编码函数

    时不时的被编码折腾一下 >>> print urllib.quote('中国') %E4%B8%AD%E5%9B%BD >>> s = '%E4%B8%AD%E5% ...

  4. 利用百度地图API,在浏览器中找到自己的位置

    首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation ...

  5. Java集合框架的知识总结(1)

    说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析. 1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象 ...

  6. Design Tutorial: Inverse the Problem

    Codeforces Round #270 D:http://codeforces.com/contest/472/problem/D 题意:给以一张图,用邻接矩阵表示,现在问你这张图能不能够是一棵树 ...

  7. Tolerance (定义发票允差)

    (N) AP > Setup > Invoice > Tolerance (定义发票允差) 这里只对价格进行了设置,其他保持了默认.To set tolerance levels f ...

  8. Master Nginx(3) - Using the Mail Module

    Basic proxy service Authentication service Combining with memcached Interpreting log files Operating ...

  9. POJ 2513 Colored Sticks 解题报告

    第一次接触欧拉回路.虽然在离散数学里学过,敲代码还是第一次. 本题是说端点颜色相同的两根木棒可连接,能否将所有的木棒连成一条直线. 将颜色视为节点v,将木棒视为边e,构成图G.如果能找到一条一笔画的路 ...

  10. Guid 的几种形式

    Guid.NewGuid().ToString()得几种格式显示 1.Guid.NewGuid().ToString("N") 结果为:       38bddf48f43c485 ...