Hibernate+Freemarker分页控件实现
2015-11-27 15:30
387 查看
传到前端的Page
public class Page<T> implements Serializable { private static final long serialVersionUID = 1L; private List<T> contents; private int pageSize; private int totalSize; private int curPage; public Page(int curPage, int totalSize, int pageSize, List<T> contents) { this.curPage = curPage; this.totalSize = totalSize; this.pageSize = pageSize; this.contents = contents; } public List<T> getContents() { return contents; } public void setContents(List<T> contents) { this.contents = contents; } public int getTotalPages() { return totalSize / pageSize + 1; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getCurPage() { return curPage; } public void setCurPage(int curPage) { this.curPage = curPage; } public int getTotalSize() { return totalSize; } public void setTotalSize(int totalSize) { this.totalSize = totalSize; } }
后端实现
解析URL,得到第几页的数据,填充到model data中。@Controller public class ExampleController { //例如http://localhost:8088/javaweb/example/page_3.html, @RequestMapping(value = { "/example/page{pageNo}.html", "/example/page_{pageNo}.html" }) public String page(@PathVariable("pageNo") int pageNo, Map<String, Object> map) { if (pageNo <= 0) pageNo = 1; FrontUtil.frontPageData(map, pageNo, "/javaweb/example/page_"); return "example/page"; } }
Freemarker自定义指令
public class ContentPageDirective implements TemplateDirectiveModel { // private Version version = new Version("2.3.23"); private DefaultObjectWrapperBuilder defaultObjectWrapperBuilder = new DefaultObjectWrapperBuilder( new Version("2.3.23")); @Inject private ContentDao contentDao; @Override public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // TODO Auto-generated method stub try { int pageNo = FrontUtil.getPageNo(env); Page<Content> page = contentDao.getPage(pageNo); env.setVariable("page", defaultObjectWrapperBuilder.build().wrap(page)); if (body != null) { body.render(env.getOut()); } } catch (ClientException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
前端实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>分页</title> </head> <body> <@cms_content_page> <ul><#list page.contents as content> <li>${content.title}</li> </#list> </ul> 总共${page.totalSize}条记录 ${page.curPage}/${page.totalPages}页 <#assign href="/javaweb/example/page_"> <a href="${href + "1" + ".html"}">首页</a> <#if (page.curPage > 1) > <a href="${href + (page.curPage - 1) + ".html"}">上一页</a> <#else> <a href="${href + page.curPage + ".html"}">上一页</a> </#if> <#if page.curPage < page.totalPages> <a href="${href + (page.curPage + 1) + ".html"}">下一页</a> <#else> <a href="${href + page.curPage + ".html"}">下一页</a> </#if> <a href="${href + page.totalPages + ".html"}">尾页</a> </@cms_content_page> </body> </html>
Hibernate关键实现
public class PageableBaseDao<T> extends AbstractBaseDao<T> implements Pageable<T> { @Override public Page<T> getPage(int curPage) throws ClientException { // TODO Auto-generated method stub if (curPage < 1) { throw new ClientException("page number should large than 0"); } int totalSize = getCount(); int pageSize = PageConstant.SIZE_PER_PAGE; Criteria criteria = getSession().createCriteria(entityClass); criteria.setFirstResult((curPage - 1) * pageSize); criteria.setMaxResults(pageSize); List contents = criteria.list(); return new Page<T>(curPage, totalSize, pageSize, contents); } }
截图
访问http://localhost:8088/javaweb/example/page_3.html相关文章推荐
- more、less 和 most 的区别
- 十万条Access数据表分页的两个解决方法
- sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 高效的mysql分页方法及原理
- asp又一个分页的代码例子
- SqlServer 2000、2005分页存储过程整理第1/3页
- ADO存取数据库时如何分页显示
- 透彻掌握ASP分页技术很详细的分析
- 一条SQL语句搞定Sql2000 分页
- 分页 SQLServer存储过程
- 实现SQL分页的存储过程代码
- sql分页查询几种写法
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)
- mysql 分页优化解析
- 用ODBC的分页显示
- jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
- 一步步打造漂亮的新闻列表(无刷新分页、内容预览)第一步
- asp.net利用后台实现直接生成html分页的方法
- asp.net中如何调用sql存储过程实现分页
- 浅谈基于SQL Server分页存储过程五种方法及性能比较