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 ...
随机推荐
- CSS3 animation的steps方式过渡
animation默认以ease方式过渡,它会在每个关键帧之间插入补间动画,所以动画效果 是连贯性的.除了ease,linear.cubic-bezier之类的过渡函数都会为其插入补间. 但有些效果不 ...
- C#变成数据导入Excel和导出Excel
excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...
- [转载]初学C#之list
C# List<T>用法 所属命名空间:System.Collections.Generic public class List<T> : IList<T>, IC ...
- Linux系统备份与还原
在使用Ubuntu之前,相信很多人都有过使用Windows系统的经历.如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后重启电脑进入备份工具提供的 ...
- IgnoreRoute——注册路由
routes.IgnoreRoute("home/about"); 这句话,当Route遇到Home/About的Url时,这段URL将被忽略. 效果图 需要注意的是这里route ...
- ZOJ 3713 In 7-bit
点我看题目 题意 : 这个题的英文叙述真的是太强了,真不知道哪里来的英文,完全看不懂,看了两个小时没弄懂真正的题意.就是给你一个字符串,先输出长度,但是长度要用二进制表示出来,二进制的低7位左边如果没 ...
- [jobdu]把数组排成最小的数
这道题见过,就是把相加的结果作为比较来排序就行了.注意的是comp函数里面要用const引用.而且c++里的字符串直接操作(读入和相加)也很方便. #include <iostream> ...
- 这些小众软件让你的效率提升N倍!(必备,收藏)
大部分的我们,电脑买来之后,软件越装越多,电脑越来越卡,导致工作的效率也是越来越低. 同时还可能长期处于软件安装完又卸载的无限恶性循环中.提高工作效率是我们利用电脑办公的一大优势,安装好的软件更是可以 ...
- File List()列出文件目录
import java.io.File; public class FileTest { public static void main(String[] args) { File myFile = ...
- JNI编程(二) —— 让C++和Java相互调用(1)
自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...