先说一下框架分页技术,在我们之前那个高校项目中使用DWZ实现的分页用了自定义标签使用起来也比较方便,除了DWZ很多框架已经给我们做好了分页我们需要做的仅仅是把一些分页参数传给我们的框架,俗话说你用别人的东西就得按着别人的来,得按着别人的框架进行布局了、传参了等等,这样灵活性大大降低,况且感觉使用框架频繁的一些软件一般是一些管理类型的,对界面的美观方便需求并不是很高,工整、能用就可以,然而呢,还有些界面需要灵活配置分页按钮、分页条等,这就需要把类似于这样的功能封装起来。
分页的模块很多人都在写都在用,大体上的思路是一致的也不是什么新的技术,不同的是看谁封装的更灵活对于本系统更好用这是不同的地方。在我们那个基础系统里面长海封装了一个分页,只要在页面上引入一个自定义标签即可,使得开发人员实现这个功能非常的容易。
分页需求:
1.同样一个分页模块如果拿到了别人系统里面是不是可以呢
2.分页样式经常更换(和界面分离,只等着美工画好界面给我就好)
3.接收一个后台查询出来的list对象或数组对象等
如果想要随意更换分页样式需要引入分页模板,其实就是一个html类型的文件以inc结尾,需要自己提前写好,下面是这个模板代码,利用模板真正做到了后台开发同美工分离,美工如果更换了前台样式后台不用改动一点代码就完成了
<span>总课程数:$page.total </span> <span>总页数:$page.totalPage </span> <span class="pag_01">当前第<a>$page.currentPageNumber</a>页</span> <span class="pag_02"><a href="#" onClick="changePage(1,$page.pageSize)">[首页]</a> <a href="#" onclick="changePage(${page.previousPageNumber},$page.pageSize)">[上一页]</a> <a href="#" onclick="changePage(eval($page.nextPageNumber),$page.pageSize)">[下一页]</a> <a href="#" onclick="changePage($page.totalPage,$page.pageSize)">[尾页]</a></span> <span id="tail_span">转到<input id="go_page" type="text" class="put_03" />页<input value="go" type="button" onclick="jumpPage($page.totalPage,$page.pageSize);"></span>
PageModel 类的代码
package com.zhjy.zydc.web.util; import java.util.ArrayList; import java.util.List; import java.util.Collections; import java.io.Serializable; import java.io.StringWriter; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.context.Context; import org.apache.velocity.app.Velocity; /** * @author lilongsheng * @return 描述显示结果集的页面 */ public class Page implements Serializable { //每一页显示几天记录 public static final int PAGE_SIZE = 8; public static final int PAGE_SIZE_SMALL = 5; public static final int PAGE_SIZE_NORMAL = 8; public static final int PAGE_SIZE_BIG = 8; public static final int PAGE_SIZE_BIGGER = 20; public static final int PAGE_SIZE_BIGGEST = 50; public static final int PAGE_NUMBER_FIRST = 1; /** * 空白页面 */ public static final Page EMPTY_PAGE = new Page(Collections.EMPTY_LIST, 0, false); /** * 结果集列表 */ List objects; /** * 开始记录号,从0开始 */ public int start; /** * 结束记录号 */ public int end; /** * 显示在页面开始记录号,从1开始 */ public int viewStart; /** * 显示在页面结束记录号 */ public int viewEnd; /** * 是否有上一页的开关 */ public boolean hasPrevious; /** * 上一页的页码 */ public int previousPageNumber; /** * 是否有下一页的开关 */ public boolean hasNext; /** * 下一页的页码 */ public int nextPageNumber; /** * 一共有多少行记录 */ public int total; /** * 一共有多少页 */ public int totalPage; /** * 当前是第几页 */ public int currentPageNumber; /** * 每页有多少行 */ public int pageSize; /** * 得到分页的起始纪录 * @param pageNo * @param max * @return */ public static int selectSavNo(int pageNo, int max) { int savNo = 0; savNo = (pageNo - 1) * max; return savNo; } /** * 构造器,创建一个页面,不分页 * @param: objects 结果集 */ public Page(List objects) { this.objects = new ArrayList(objects); this.currentPageNumber = 1; this.pageSize = objects.size(); this.total = objects.size(); if (total == 0) this.currentPageNumber = 0; else autoCalculate(); } /** * 构造器,创建页面 * @param: objects 结果集 * @param: s 开始记录号,从0开始 * @param: hasNext 是否有下一页的开关 */ public Page(List objects, int s, boolean hasNext) { this(objects,s,hasNext,0); } /** * 构造器,创建页面 * @param: objects 结果集 * @param: s 开始记录号,从0开始 * @param: hasNext 是否有下一页的开关 * @param: total 一共有多少行记录 */ public Page(List objects, int s, boolean hasNext, int total) { this(objects,s,PAGE_SIZE,hasNext,total); } /** * 构造器,创建页面 * @param: l 结果集 * @param: s 开始记录号,从0开始 * @param: size 每页有多少行 * @param: hasNext 是否有下一页的开关 * @param: total 一共有多少行记录 */ public Page(List objects, int s, int size, boolean hasNext, int total) { this.objects = new ArrayList(objects); this.currentPageNumber = s / size + 1; this.pageSize = size; this.total = total; System.out.println("查询出的总记录数是:"+total); if (total == 0) { System.out.println("查询出的总记录数是否为等于 0:"+total); this.currentPageNumber = 0; }else { System.out.println("是否执行了判断上一页、下一页:"); autoCalculate(); } } /** * 构造器,创建页面 * @param: objects 结果集 * @param: currentPageNumber 当前是第几页 * @param: pageSize 每页有多少行 * @param: total 一共有多少行记录 */ public Page(List objects, int currentPageNumber, int pageSize, int total) { this.objects = objects; this.currentPageNumber = currentPageNumber; this.pageSize = pageSize; this.total = total; if (total == 0) { this.currentPageNumber = 0; }else { autoCalculate(); } } /** * @author lls * @return 计算当前页号 * */ private void autoCalculate() { start = (currentPageNumber - 1) * pageSize; if(pageSize>this.objects .size()){ end = this.objects .size()-1; }else{ end = start + pageSize-1; } if (end >= total) { end = total - 1; } //显示在页面开始记录号,从1开始 viewStart = start + 1; //显示在页面结束记录号 viewEnd = end + 1; totalPage = (total + pageSize - 1) / pageSize; //如果当前页小于等于1 if (currentPageNumber <= 1) { //不能再上一页,并设置当前页为1 hasPrevious = false; currentPageNumber = 1; } else if(hasPrevious) { //当前页号减一 currentPageNumber = currentPageNumber - 1; } //如果当前页号大于等于总页数 if (currentPageNumber >= totalPage) { //设置下一页不可用 hasNext = false; System.out.println(currentPageNumber); currentPageNumber = totalPage; System.out.println(currentPageNumber); } else if(hasNext){ //当前页号加一 currentPageNumber = currentPageNumber + 1; } } /** * 获得结果集 * @return: List 结果集 */ public List getList() { return this.objects; } /** * 获得显示在页面的开始记录号,从1开始 * @return: int 显示在页面的开始记录号 */ public int getViewStart() { return viewStart; } /** * 获得显示在页面的结束记录号 * @return: int 显示在页面的结束记录号 */ public int getViewEnd() { return viewEnd; } /** * 是否有下一页 * @return: boolean 是否有下一页的开关 */ public boolean hasNextPage() { return hasNext; } /** * 是否有上一页 * @return: boolean 是否有上一页的开关 */ public boolean hasPreviousPage() { return hasPrevious; } /** * 获得上一页的页码 * @return: int 上一页的页码 */ public int getPreviousPageNumber() { return previousPageNumber; } /** * 获得下一页的页码 * @return: int 下一页的页码 */ public int getNextPageNumber() { return nextPageNumber; } /** * 获得结果集中记录总行数 * @return: int 一共有多少行记录 */ public int getTotal() { return total; } /** * 获得总页数 * @return: int 一共有多少页 */ public int getTotalPage() { return totalPage; } /** * 获得当前页码 * @return: int 当前页码 */ public int getCurrentPageNumber() { return currentPageNumber; } /** * 获得每页多少行记录 * @return: int 页大小 */ public int getPageSize() { return pageSize; } /** * 获得下一页在结果集中开始的记录号,从0开始 * @return: int 下一页在结果集中开始的记录号 */ public int getStartOfNextPage() { return start + PAGE_SIZE; } /** * 获得上一页在结果集中开始的记录号,从0开始 * @return: int 下一页在结果集中开始的记录号 */ public int getStartOfPreviousPage() { return Math.max(start - PAGE_SIZE, 0); } /** * 根据页号和记录数得到起始记录 * @param pageNo * @param pageSize * @return */ public static int getStartNumber(int pageNo, int pageSize) { int startNumber = 0; startNumber = (pageNo - 1) * pageSize; return startNumber; } /** * hidden条件 * @param result */ private void getHiddenInfo(StringBuffer result){ result.append("<input type=\"hidden\" name=\"pageNumber\">"); result.append("<input type=\"hidden\" name=\"pageSize\">"); } /** * @tuthod :lilongsheng * @param StringBuffer * @result js字符串 */ private void getJavaScript(StringBuffer result){ //js代码开始标记 result.append("<SCRIPT LANGUAGE=\"JavaScript\">"); //上一页、下一页等按钮的点击事件,该事件同模板中的对应 result.append(" function changePage(pageNumber,pageSize)") .append("{") .append(" document.forms[0].pageNumber.value = pageNumber;") .append(" document.forms[0].pageSize.value = pageSize;") .append(" document.forms[0].submit(); ") .append("}"); //跳转按钮的点击事件 result.append(" function jumpPage(totalPage,pageSize)") .append("{") .append(" var pageNumber = parseFloat(document.getElementById(\"go_page\").value);") .append(" if (pageNumber > totalPage){") .append(" pageNumber = totalPage;}") .append(" if (pageNumber < 1){") .append(" pageNumber = 1;}") .append(" document.forms[0].pageNumber.value = pageNumber;") .append(" document.forms[0].pageSize.value = pageSize;") .append(" document.forms[0].submit();") .append("}"); //js代码结尾标记 result.append("</SCRIPT>"); } /** * @parameter 按钮模板的名称 * @return 页面跳转按钮和相应的按钮的的js事件 */ public String getPageBar_(String t_name)throws Exception{ //存储字符串 StringBuffer result = new StringBuffer(); //网页面上加载js代码,分为对应上一页、下一页等按钮的点击事件 getJavaScript(result); //hidden getHiddenInfo(result); //分页按钮“上一页”“下一页”等从模板中加载 Template template = Velocity.getTemplate("WEB-INF/classes/"+t_name,"utf-8"); Context context = new VelocityContext(); context.put("page", this); StringWriter writer =new StringWriter(); template.merge(context,writer); writer.flush(); result.append(writer.toString()); return result.toString(); } }
该分页类中有个getPageBar_(string t_name)方法,这个方法完成了动态加载分页模板并打印到页面上,用着很方便,一些按钮的单击等事件也是通过pagemodel类写到页面上,可以说界面上只需要引入一个pageModel即可完成分页所有的功能,其余的代码一点不用写了,大大提高了开发效率。
工作感悟:
工作时对某些知识理解的要深刻、理解的到位一些,毕竟给你一个东西如果你理解是模棱两可的,那你就不能写出东西来不知道除了错误不知道怎么去改正,工作中学习的新知识相比在学校的确很少,很很多事情需要做拿不出几天时间来专门学习什么,如果想学习也只能晚上下班后利用自己的时间扩展学习一下,也感觉自己需要学习的东西还很多,正在学习中……
数据分页模块系列 (二) 完美封装PageModel实现分页模块,码迷,mamicode.com