数据分页模块系列 (二) 完美封装PageModel实现分页模块

        先说一下框架分页技术,在我们之前那个高校项目中使用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="#" οnclick="changePage(${page.previousPageNumber},$page.pageSize)">[上一页]</a>
					 <a href="#" οnclick="changePage(eval($page.nextPageNumber),$page.pageSize)">[下一页]</a>
					 <a href="#" οnclick="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" οnclick="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即可完成分页所有的功能,其余的代码一点不用写了,大大提高了开发效率。


              工作感悟:

               工作时对某些知识理解的要深刻、理解的到位一些,毕竟给你一个东西如果你理解是模棱两可的,那你就不能写出东西来不知道除了错误不知道怎么去改正,工作中学习的新知识相比在学校的确很少,很很多事情需要做拿不出几天时间来专门学习什么,如果想学习也只能晚上下班后利用自己的时间扩展学习一下,也感觉自己需要学习的东西还很多,正在学习中……


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
在 Django 中实现前后端分离的分页功能模块可以通过以下步骤进行: 1. 后端实现: - 创建一个 Django 视图函数,用于处理分页请求。可以使用 Django 的内置分页器类 `Paginator` 来实现分页功能。 - 在视图函数中,获取前端传递过来的当前页码和每页显示的数量。可以通过 `request.GET` 获取 GET 请求中的参数。 - 使用 `Paginator` 类对数据进行分页,并获取当前页的数据。 - 将分页结果和当前页码等信息封装成 JSON 格式返回给前端。 2. 前端实现: - 在前端页面中,通过 AJAX 或者其他方式发送分页请求到后端视图函数。 - 在接收到后端返回的 JSON 数据后,解析数据并渲染到页面上,显示分页结果。 - 创建前端的分页组件,包括上一页、下一页、跳转等功能,以便用户进行翻页操作。 下面是一个简单的示例代码: 后端实现(views.py): ```python from django.core.paginator import Paginator from django.http import JsonResponse def get_paginated_data(request): data = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10'] paginator = Paginator(data, 3) # 每页显示3条数据 page_number = request.GET.get('page') # 获取当前页码,默认为1 page_obj = paginator.get_page(page_number) current_page = page_obj.number total_pages = paginator.num_pages items = page_obj.object_list response_data = { 'current_page': current_page, 'total_pages': total_pages, 'items': items, } return JsonResponse(response_data) ``` 前端实现(JavaScript): ```javascript function getPaginatedData(page) { $.ajax({ url: '/get_paginated_data/', type: 'GET', data: {page: page}, success: function (response) { // 解析后端返回的 JSON 数据 var current_page = response.current_page; var total_pages = response.total_pages; var items = response.items; // 渲染数据到页面上 // ... }, error: function (xhr, status, error) { console.log(error); } }); } // 页面加载完成后,获取第一页的数据 $(document).ready(function () { getPaginatedData(1); }); // 翻页按钮点击事件 $('.pagination-button').click(function () { var page = $(this).data('page'); getPaginatedData(page); }); ``` 以上代码仅为示例,具体的实现方式可能因项目需求而有所不同。你可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李龙生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值