通用分页(二)

案例:
分页三要素
后台:

  • entity
  • dao

视图层
效果图
分页三要素
page=1 页码 视图层传递过来
rows=10 页大小 视图层传递过来
total=0 总记录数 后台查出来

pagination=true 是否分页 视图层传递过来

getStartIndex() 基于MySql数据库分页,获取分页开始标记
(page-1)*rows
实体类(entity)
属性、get/set方法,toString

private  int sid;
	private String sname;
	private String sname_pinyin;
	private int age;
	private String remark;
	
	public Student() {
		
	}

	public int getSid() {
		return sid;
	}

	public void setSid(int sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
		this.sname_pinyin = PinYinUtil.toPinyin(this.sname);
	}

	public String getSname_pinyin() {
		return sname_pinyin;
	}

	public void setSname_pinyin(String sname_pinyin) {
		this.sname_pinyin = sname_pinyin;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sname_pinyin=" + sname_pinyin + ", age=" + age
				+ ", remark=" + remark + "]";
	}

dao包
增删改查方法,其中以分页查为重点只放了分页的代码

public List<Student> find(Student student,PageBean pageBean){
		List<Student> studentList = new ArrayList<Student>();
		 //where 1=1 为后面的模糊查询做准备, 作用是生成where子句
		String sql ="select * from t_student  where 1=1"; 
		if(StringUtils.isNotBlank(student.getSname())) {
			sql+=" and  (sname like '%"+ student.getSname() +"%' or sname_pinyin like '%" +student.getSname()+ "%')";
		}
				
		return this.executeQuery(sql, pageBean,new Callback<Student>() {

			@Override
			public List foreach(ResultSet rs) throws SQLException {
				List<Student> studentList = new ArrayList<Student>();
				Student s = null;
				while(rs.next()) {
					s=new Student();
					s.setSid(rs.getInt("sid"));
					s.setSname(rs.getString("sname"));
					s.setSname_pinyin(rs.getString("sname_pinyin"));
					s.setAge(rs.getInt("age"));
					s.setRemark(rs.getString("remark"));
					studentList.add(s);
				}		
				return studentList;
			}
		});

baseDao(匿名接口)
把callback接口当做是内部接口,这个接口只做分页的时候使用

public static interface Callback<k> {
		public List<k> foreach(ResultSet rs) throws SQLException;
	}

	
	
		/**
		 * 通用分页查询
		 * @param sql 普通sql
		 * @param pageBean 分页工具类
		 * @return  集合
		 */
	public List<k> executeQuery(String sql,  PageBean pageBean,Callback<k> callBack){
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		if(null !=pageBean && pageBean.isPagination()) {
			//1、查询满足条件的总记录数
			try {
				con=DBAccess.getConnection();
				String  countSql = this.getCountSql(sql);	
				ps = con.prepareStatement(countSql);
				System.out.println(countSql);
				rs=ps.executeQuery();
				if(rs.next()) {
					int total = rs.getInt(1);
					pageBean.setTotal(total);
				}			
			} catch (Exception e) {
				throw new  RuntimeException(e);
			}finally {
				DBAccess.close(null, ps, rs);//这里没有关闭
			}
		}
		//2、查询指定页码并满足条件的记录数
				try {
					//con = null!=con ?con:DBAccess.getConnection();
					if(con==null) {
						con = DBAccess.getConnection();
					}
					String pageSql = sql;
					if(null!= pageBean && pageBean.isPagination()) {
					 pageSql = this.getPageSql(sql, pageBean);
					}
					ps = con.prepareStatement(pageSql);
					System.out.println(pageSql);
					rs = ps.executeQuery();
					return callBack.foreach(rs);
				} catch (Exception e) {
					throw new  RuntimeException(e);
				}finally {
					DBAccess.close(con, ps, rs);
				}	
				
			
	}
	
	
	/**
	 * 将一个普通的sql转换成查询全部的sql
	 */
	public String  getCountSql(String sql) {
		return "select count(*) from ("+sql+") t1";
	}
	
	/**
	 * 将一个普通的sql转换成支持分页的sql
	 */
		public String  getPageSql(String sql,PageBean pageBean) {
			return sql+ " limit "+pageBean.getStartIndex()+", "+pageBean.getRows()+"";
		}

视图层(PageTag)

private PageBean pageBean;
	
	public PageTag() {
		super();
	}

	public PageBean getPageBean() {
		return pageBean;
	}

	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}
	
	@Override
	public int doStartTag() throws JspException {
		try {
			//输出
			JspWriter out= this.pageContext.getOut();	
			
			out.println(this.toHtml());
			//跳过标签体
			return SKIP_BODY;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public String toHtml()throws Exception  {
		StringBuffer bf = new StringBuffer();
		if(null==pageBean || !pageBean.isPagination()) {
			return bf.toString();
		}
		//使用隐藏域,保存 请求及参数
		//1、生成分页相关按钮		
		bf.append("<div style='text-align:center;font-size: 16px'>\r\n" + 
				"		当前第"+pageBean.getPage()+"页,&nbsp;&nbsp;共"+pageBean.getMaxPage()+"页,&nbsp;&nbsp;共"+pageBean.getTotal()+"条	&nbsp;&nbsp;\r\n" + 
				"		<a href='javascript:doForward(1)'>首页</a> &nbsp;\r\n" + 
				"		<a href='javascript:doForward("+pageBean.getPreviousPage()+")'>上一页</a>&nbsp;\r\n" + 
				"		<a href='javascript:doForward("+pageBean.getNextPage()+")'>下一页</a>&nbsp;\r\n" + 
				"		<a href='javascript:doForward("+pageBean.getMaxPage()+")'>尾页  </a>&nbsp;\r\n" + 
				"		<input id='numTxt' type=\"text\" style='text-align: center;font-size: 16px;width: 30px' >\r\n" + 
				"		<a href='javascript:doSkip()'>GO</a>\r\n" + 
				"	</div>");
		
		//2、生成分页的表单
		bf.append("<form id ='pageForm'  action='"+this.pageBean.getUrl()+"' method='post'>");
		bf.append("<input type='hidden' name='page'>");
		Map<String,String[]> parameterMap=	pageBean.getParameterMap();
		for(Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
			String name = entry.getKey();
			if("page".equals(name)) {//抛上一次的页码
				continue;//跳转到下一次循环
			}
			String[] value = entry.getValue();
			for(int i = 0; i<value.length;i++) {
				bf.append("<input type='hidden' name='"+ name +"' value='"+ value[i] +"'>");
			}
		}
		bf.append("</form>");
		
		//3、动态生成js代码
		bf.append("<script type='text/javascript'>");
		bf.append(" function doForward(page){");
		bf.append("  var f = document.getElementById('pageForm');");
		bf.append("  f.page.value = page;");
		bf.append("  f.submit();");
		bf.append("}");
		bf.append("");
		bf.append(" function doSkip(){");
		bf.append("  var num = document.getElementById('numTxt').value;");
		bf.append("  if(!num || isNaN(num)||!/^[0-9]+$/.test(num)||parseInt(num)<=0||parseInt(num)>"+pageBean.getMaxPage()+"){");
		bf.append("   alert(\"请输入1~"+pageBean.getMaxPage()+"之间的数字\");");
		bf.append("   return;");
		bf.append("  }");
		bf.append(" doForward(num);");
		bf.append("}");
		bf.append("</script>");
		
		return bf.toString();

效果图
在这里插入图片描述
注意:不能将分页表单嵌套到其它表单中,否则不能提交表单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于PHP分页中的page通用分页函数split_page()的使用以及实现原理,我可以给您一些解释和建议。 首先,page通常是指当前页码,也就是用户当前所在的页数。在分页中,我们通常需要知道当前页码以及每一页所显示的数据条数,然后根据这两个参数计算出数据的起始位置,从而进行数据的分页显示。通用分页函数split_page()则是一个可以适用于不同情境下的分页函数,它可以根据传入的参数自动计算出数据的起始位置和页码等信息,并将分页链接和页码显示等工作封装起来,方便我们在不同的页面中调用和使用。 在使用分页函数时,我们需要传入的参数通常包括数据总条数、每页显示的条数、当前页码以及分页链接等信息。分页函数则会根据这些参数计算出数据的起始位置,并生成相应的分页链接和页码显示等内容。其中,分页链接通常包括上一页、下一页、首页和末页等链接,以及一些页码链接,方便用户进行点击选择。 至于具体的实现原理,分页函数通常会通过计算总页数和当前页的位置,然后根据当前页所在的位置生成相应的分页链接和页码显示。在生成分页链接时,我们可以使用PHP中的链接生成函数,将参数传入链接中,从而生成相应的链接地址和参数。在生成页码显示时,我们通常需要根据不同的情境进行不同的处理,比如在当前页码前后加上一些省略号或者直接显示完整的页码等。 总之,分页函数是一个比较常用的功能,它可以帮助我们在不同的页面中方便地进行数据的分页显示,从而提高用户体验和数据展示效果。如果您需要在自己的项目中使用分页函数,建议可以先了解一下PHP中的分页函数实现原理和使用方法,然后根据自己的需求进行相应的定制和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值