freemaker分页备忘
思路:定义一个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">« 上一页</span>
<#else>
<a href="javascript:void(0)" onclick="turnOverPage(${pageNo - 1})">« 上一页</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>…
</#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)>
…
</#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">下一页 »</span>
<#else>
<a href="javascript:void(0)" onclick="turnOverPage(${pageNo + 1})">下一页 »</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分页备忘的更多相关文章
- AngularJS之备忘与诀窍
译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的. ...
- ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘
本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...
- Angularjs ngTable使用备忘
项目中用到angularjs的表格ng-table,功能相当强大,像搜索.排序.checkbox.分页.每页表格显示数目等都有.API,demo什么的也只能参考官网了.这里做个备忘,哪天肯定还会用到. ...
- Linux基础之常用基本命令备忘
Linux基础之常用基本命令备忘 PWD 查询当前所在Linux上的位置 / 根目录 CD(change directory)切换目录 语法 CD /(注意添加空格) LS ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
随机推荐
- 软件测试 -- Bug等级划分规范
1. Blocker级别——中断缺陷 客户端程序无响应,无法执行下一步操作. 2. Critical级别――临界缺陷,包括: 功能点缺失,客户端爆页. 3. Major级别——较严重缺陷,包括: 功能 ...
- Objective-c开发中混合使用ARC
首选“Compile Sources”的位置: 选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了. ...
- python里面的几个编码函数
时不时的被编码折腾一下 >>> print urllib.quote('中国') %E4%B8%AD%E5%9B%BD >>> s = '%E4%B8%AD%E5% ...
- 利用百度地图API,在浏览器中找到自己的位置
首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation ...
- Java集合框架的知识总结(1)
说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析. 1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象 ...
- Design Tutorial: Inverse the Problem
Codeforces Round #270 D:http://codeforces.com/contest/472/problem/D 题意:给以一张图,用邻接矩阵表示,现在问你这张图能不能够是一棵树 ...
- Tolerance (定义发票允差)
(N) AP > Setup > Invoice > Tolerance (定义发票允差) 这里只对价格进行了设置,其他保持了默认.To set tolerance levels f ...
- Master Nginx(3) - Using the Mail Module
Basic proxy service Authentication service Combining with memcached Interpreting log files Operating ...
- POJ 2513 Colored Sticks 解题报告
第一次接触欧拉回路.虽然在离散数学里学过,敲代码还是第一次. 本题是说端点颜色相同的两根木棒可连接,能否将所有的木棒连成一条直线. 将颜色视为节点v,将木棒视为边e,构成图G.如果能找到一条一笔画的路 ...
- Guid 的几种形式
Guid.NewGuid().ToString()得几种格式显示 1.Guid.NewGuid().ToString("N") 结果为: 38bddf48f43c485 ...