通用分页

思维导图

 

一、通用后台分页

 所用jar包

 

类结构:

1.反射通用后台查询方法

(1)、普通的方法 

代码如下:

package com.ysq.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.entity.Book;
import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;
import com.ysq.util.StringUtils;

public class BookDao extends BaseDao<Book>{
	/**
	 * 简单的查询方法
	 * 思路:
	 * 	1.建立数据库连接
	 * 	2.预定义对象PrepareStatement
	 * 	3.查询结果集
	 * 	4.处理结果集
	 */

普通的
	public List<Book> list(Book book)throws Exception{
		List<Book> books=new ArrayList<Book>();
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname=book.getBname();
		//书籍名称模糊查询
		if(StringUtils.isNotBlank(bname)) {
			sql+=" and bname like '%"+bname+"%'";
		}
		Connection con = DBAccess.getConnection();
		PreparedStatement ps = con.prepareStatement(sql);
		ResultSet rs=ps.executeQuery();
		while(rs.next()) {
			books.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
		}
		return books;
	}
	
	}
	

缺点总结:需要写大量重复代码,系统中的查询功能越来越多,重复代码量变大

解决方案:

①、抽取变化部分作为参数:sql、Class

②、抽取公共的父类,把重复的代码剥离出来

BaseDao<T>是所有dao层的父类 

package com.ysq.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;


/**
 * 所有Dao层的父类
 * @author T440s
 *
 * @param <T>
 */
public class BaseDao<T> {
	public List<T> list(String sql,Class<T> clz)throws Exception{
		//不确定list集合中装的什么东西 子类Dao继承BaseDao<T>,子类传的是什么类那么list集合中放的就是什么
		List<T> list=new ArrayList<T>();
		Connection con = DBAccess.getConnection();
		PreparedStatement ps = con.prepareStatement(sql);
		ResultSet rs=ps.executeQuery();
		while(rs.next()) {
			//books.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
			/**
			 * 上面一行代码分析:
			 * 1.实例化了一个对象
			 * 2.从ResultSet的对象的属性获取值(bid)获取值,赋值给了前面的实例化的对象
			 * 3.把已经赋值了的对象添加到List集合中
			 */
			//实例化一个对象
			T t=clz.newInstance();
			//获取属性
			Field[] fields = clz.getDeclaredFields();
			for (Field f : fields) {
				f.setAccessible(true);
				f.set(t, rs.getObject(f.getName()));
			}
			list.add(t);
		}
		return list;
	}

(2)、继承父类的方法(代码量明显减少)

代码如下:

package com.ysq.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.entity.Book;
import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;
import com.ysq.util.StringUtils;

public class BookDao extends BaseDao<Book>{
	
	public List<Book> list2(Book book)throws Exception{
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname=book.getBname();
		//书籍名称模糊查询
		if(StringUtils.isNotBlank(bname)) {
			sql+=" and bname like '%"+bname+"%'";
		}
		return super.list(sql, Book.class);
	}

}

(3)、测试:

public static void main(String[] args) throws Exception{
		BookDao b=new BookDao();
		Book book=new Book();
		book.setBname("圣墟");
        //List<Book> list = bd.list(book);
		//List<Book> list=b.list2(book);
		for (Book book2 : list) {
			System.out.println(book2);
		}
	}

运行结果如下:

PageBean

1、 page=1        页码        视图层传递过来

2、rows=10         页大小      视图层传递过来

3、total=0       总记录数    后台查出来

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

package com.ysq.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import com.ysq.util.StringUtils;
/**
 * 分页工具类
 *
 */
public class PageBean {

	private int page = 1;// 页码

	private int rows = 10;// 页大小

	private int total = 0;// 总记录数

	private boolean pagination = true;// 是否分页

	private String url;// 保存上一次请求的URL

	private Map<String, String[]> paramMap = new HashMap<String, String[]>();// 保存上一次请求的参数

	/**
	 * 初始化pagebean ,保存上一次请求的重要参数
	 */
	public void setRequest(HttpServletRequest req) {
		// 1.1需要保存上一次请求的URL
		this.setUrl(req.getRequestURL().toString());
		// 1.2需要保存上一次请求的参数
		this.setParamMap(req.getParameterMap());
		// 1.3需要保存上一次请求的分页设置
		this.setPagination(req.getParameter("pagination"));
		// 1.4需要保存上一次请求的展示条数
		this.setRows(req.getParameter("rows"));
		// 1.5初始化的页码
		this.setPage(req.getParameter("page"));
	}

	public void setPage(String page) {
		// TODO Auto-generated method stub
		if(StringUtils.isNotBlank(page)) {
			this.setPage(Integer.valueOf(page));
		}
	}

	public void setRows(String rows) {
		// TODO Auto-generated method stub
		if(StringUtils.isNotBlank(rows)) {
			this.setRows(Integer.valueOf(rows));
		}
	}

	public void setPagination(String pagination) {
		// TODO Auto-generated method stub
//		只有在前台jsp填写了pagination=false,才代表不分页
		if(StringUtils.isNotBlank(pagination)) {
			this.setPagination(!"false".equals(pagination));
		}
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getParamMap() {
		return paramMap;
	}

	public void setParamMap(Map<String, String[]> paramMap) {
		this.paramMap = paramMap;
	}

	public PageBean() {
		super();
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return pagination;
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}

	/**
	 * 最大页
	 * 
	 * @return
	 */
	public int maxPage() {
		return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
	}

	/**
	 * 下一页
	 */
	public int nextPage() {
		// 如果当前页小于最大页,那就下一页为当前页加一,如果不小于,说明当前页就是最大页,那就无需加一
		return this.page < this.maxPage() ? this.page + 1 : this.page;
	}

	/**
	 * 上一页
	 * 
	 * @return
	 */
	public int previousPage() {
		return this.page > 1 ? this.page - 1 : this.page;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}

}

 2、通用的分页后台查询方法

代码如下:

BookDao:

package com.ysq.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.entity.Book;
import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;
import com.ysq.util.StringUtils;

public class BookDao extends BaseDao<Book>{
	
	/**
	 * 思考
	 * 在项目中大量的出现分页的需求
	 * 目的:
	 * 想要做一个通用的分页查询,子类继承父类,自带了分页功能,并且代码量较少
	 * 最终当碰到分页的需求的时候,要写少量代码
	 * 实现:
	 * 	1.MySQL如何分页
	 * 		分页通常有关键的因素:第page页、显示数目(rows)、符合查询条件的总记录数(total)
	 * 		-- sql=select * from t_mvc_book where bname like '%圣墟%' 
			-- pagesql=sql limit (page-1)*rows,rows
			-- countSql=select count(1)from(sql)t
			2.编码思路
				2.1原来list集合中返回的是符合条件的所有数据,现在我需要返回第page页的数据,那么意味着SQL要加工成pageSQL
				2.2需要分页,那么需要取出符合条件的总记录数,保存到pagebean中
					要得出共N页,那么必须求出总记录数:
				 	共N页的算法:total % rows==0 ? total/rows :total/rows+1
	 */
	
	/**
	 * 测试通用分页查询
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public List<Book> list3(Book book,PageBean pageBean)throws Exception{
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname=book.getBname();
		//书籍名称模糊查询
		if(StringUtils.isNotBlank(bname)) {
			sql+=" and bname like '%"+bname+"%'";
		}
		return super.executeQuery(sql,Book.class,pageBean);
	}
	
}

BassDao:

package com.ysq.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;


	/**
	 * 通用分页查询
	 * @param sql
	 * @param clz
	 * @return
	 * @throws Exception
	 */
	public List<T> executeQuery(String sql,Class<T> clz, PageBean pageBean)throws Exception{
		//不确定list集合中装的什么东西 子类Dao继承BaseDao<T>,子类传的是什么类那么list集合中放的就是什么
		List<T> list=new ArrayList<T>();
		Connection con = DBAccess.getConnection();
		PreparedStatement ps = null;
		ResultSet rs=null;
		/*
		 * 是否需要分页? 
		 * 无序分页(项目中的下拉框,查询条件教员下拉框 无需分页)
		 * 必须分页(项目中列表类需求、订单列表、商品列表、学生列表。。。)
		 */
		if(pageBean !=null&&pageBean.isPagination()) {
//			必须分页
			
			String countSQL=getCountSQL(sql);
			ps = con.prepareStatement(countSQL);
			rs=ps.executeQuery();
			if(rs.next()) {
				pageBean.setTotal(String.valueOf(rs.getObject(1)));
			}
//		-- sql = select * from t_mvc_book where bname like '%圣墟%'
//		-- pageSql= sql limit (n-1)*rows,rows	//对应某一页的数据
//		-- countSql=select count(1) from (sql) t	//符合条件的总记录数
			String pageSQL=getPageSQL(sql,pageBean);//符合条件的某一页数据
			ps = con.prepareStatement(pageSQL);
			rs = ps.executeQuery();
		}else {
//			不分页
			con = DBAccess.getConnection();
			ps = con.prepareStatement(sql);//符合条件的所有数据
			rs=ps.executeQuery();
		}
		while(rs.next()) {
			T t=clz.newInstance();
			Field[] fields = clz.getDeclaredFields();
			for (Field f : fields) {
				f.setAccessible(true);
				f.set(t, rs.getObject(f.getName()));
			}
			list.add(t);
		}
		return list;
	}
	
}

测试:

public static void main(String[] args) throws Exception{
		BookDao b=new BookDao();
		Book book=new Book();
		book.setBname("圣墟");
		//List<Book> list=b.list2(book);
		PageBean pageBean=new PageBean();
//		查第2页的数据
		pageBean.setPage(2);
//		项目开发中,下拉框的需求 不分页  模拟从JSP传递不分页的信息pagination=false
//		pageBean.setPagination(false);
		List<Book> list=b.list3(book, pageBean);
		for (Book book2 : list) {
			System.out.println(book2);
		}
	}

运行结果如下:

二、通用前台分页 

1、目标:

利用<y:page><y:page>标签,无需写任何js,html代码就可以完成分页

2、MySql分页

分页通常有关键因素:第page页、显示数目(rows)、符合查询条件的总记录数(total)

原生sql=select * from t_mvc_book where bname like '%圣墟%'

 pageSql=sql limit (n-1)*rows,rows 

countSql=select count(1) from (sql) t

package com.ysq.dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ysq.util.DBAccess;
import com.ysq.util.PageBean;


/**
 * 所有Dao层的父类
 * @author T440s
 *
 * @param <T>
 */
public class BaseDao<T> {
	
	/**
	 * 通用分页查询
	 * @param sql
	 * @param clz
	 * @return
	 * @throws Exception
	 */
	public List<T> executeQuery(String sql,Class<T> clz, PageBean pageBean)throws Exception{
		//不确定list集合中装的什么东西 子类Dao继承BaseDao<T>,子类传的是什么类那么list集合中放的就是什么
		List<T> list=new ArrayList<T>();
		Connection con = DBAccess.getConnection();
		PreparedStatement ps = null;
		ResultSet rs=null;
		/*
		 * 是否需要分页? 
		 * 无序分页(项目中的下拉框,查询条件教员下拉框 无需分页)
		 * 必须分页(项目中列表类需求、订单列表、商品列表、学生列表。。。)
		 */
		if(pageBean !=null&&pageBean.isPagination()) {
//			必须分页
			
			String countSQL=getCountSQL(sql);
			ps = con.prepareStatement(countSQL);
			rs=ps.executeQuery();
			if(rs.next()) {
				pageBean.setTotal(String.valueOf(rs.getObject(1)));
			}
//		-- sql = select * from t_mvc_book where bname like '%圣墟%'
//		-- pageSql= sql limit (n-1)*rows,rows	//对应某一页的数据
//		-- countSql=select count(1) from (sql) t	//符合条件的总记录数
			String pageSQL=getPageSQL(sql,pageBean);//符合条件的某一页数据
			ps = con.prepareStatement(pageSQL);
			rs = ps.executeQuery();
		}else {
//			不分页
			con = DBAccess.getConnection();
			ps = con.prepareStatement(sql);//符合条件的所有数据
			rs=ps.executeQuery();
		}
		while(rs.next()) {
			T t=clz.newInstance();
			Field[] fields = clz.getDeclaredFields();
			for (Field f : fields) {
				f.setAccessible(true);
				f.set(t, rs.getObject(f.getName()));
			}
			list.add(t);
		}
		return list;
	}
	/**
	 * 将原生SQL转换成符合条件的总记录数countSQL
	 * @param sql
	 * @return
	 */
	private String getCountSQL(String sql) {
//		countSql=select count(1)from(sql)t//符合条件的总记录数
		return "select count(1) from("+sql+") t";
	}
	
	/**
	 * 将原生SQL转换成pageSQL
	 * @param sql
	 * @param pageBean
	 * @return
	 */
	private String getPageSQL(String sql,PageBean pageBean) {
//		(this.page - 1) * this.rows;
//		pagesql=sql limit (page-1)*rows,rows
		return sql+" limit "+pageBean.getStartIndex()+","+pageBean.getRows();
	}
}

3、自定义JSP标签(page标签):

PageTag:

package com.ysq.tag;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.ysq.util.PageBean;

public class PageTag extends BodyTagSupport{
	private PageBean pageBean;//包含了所有分页相关的元素
	
	public PageBean getPageBean() {
		return pageBean;
	}

	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}

	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		//没有标签体,要输出内容
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return super.doStartTag();
	}

	private String toHTML() {
		StringBuffer sb=new StringBuffer();
		//隐藏的form表单 这个就是上一次请求下次重新发的奥义所在
		sb.append("<form action='"+pageBean.getUrl()+"' id='pageBeanForm' method='post'>");
		sb.append(" <input type='hidden' name='page'>");
//		上一次请求的参数
		Map<String, String[]> paramMap=pageBean.getParamMap();
		if(paramMap !=null&&paramMap.size()>0) {
			Set<Entry<String, String[]>> entrySet = paramMap.entrySet();
			for (Entry<String, String[]> entry : entrySet) {
//				参数名
				String key = entry.getKey();
//				参数值
				for (String value : entry.getValue()) {
//					上一次的请求的参数,再一次组装成了新的form表单
//					注意:page参数每次都会提交
					if(!"page".equals(key)) {
						sb.append(" <input type='hidden' name='"+key+"' value='"+value+"'>");
					}
				}
			}
		}
		sb.append("</form>");
		
		//分页条
		sb.append("<ul class='pagination justify-content-center'>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==1?"disabled":"")+"'><a class='page-link'");
		sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==1?"disabled":"")+"'><a class='page-link'");
		sb.append(" href='javascript:gotoPage("+pageBean.previousPage()+")'>&lt;</a></li>");
//		sb.append(" <li class='page-item'><a class='page-link' href='#'>1</a></li>");
//		sb.append(" <li class='page-item'><a class='page-link' href='#'>2</a></li>");
		sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pageBean.getPage()+"</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()?"disabled":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>&gt;</a></li>");
		sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()?"disabled":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.maxPage()+")'>尾页</a></li>");
		sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
		sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
		sb.append(" <li class='page-item go'><a class='page-link'");
		sb.append(" href='javascript:skipPage()'>确定</a></li>");
		sb.append(" <li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
		sb.append("</ul>");

		//分页执行的jsp代码
		sb.append("<script type='text/javascript'>");
		sb.append(" function gotoPage(page) {");
		sb.append(" 	document.getElementById('pageBeanForm').page.value = page;");
		sb.append(" 	document.getElementById('pageBeanForm').submit();");
		sb.append(" }");
		sb.append(" function skipPage() {");
		sb.append(" 	var page = document.getElementById('skipPage').value;");
		sb.append(" 	if (!page || isNaN(page) || parseInt(page) < 1 || parseInt(page) > "+pageBean.maxPage()+") {");
		sb.append(" 		alert('请输入1~"+pageBean.maxPage()+"的数字');");
		sb.append(" 		return;");
		sb.append(" 	}");
		sb.append(" 	gotoPage(page);");
		sb.append(" }");
		sb.append(" </script>");
		
		return sb.toString();
	}

}

4、标签库描述文件

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
  <description>ysq 1.1 core library</description>
  <display-name>ysq core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>ysq</short-name>
  <uri>http://jsp.veryedu.cn</uri> 
  <tag>
    <name>page</name>
    <tag-class>com.ysq.tag.PageTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>pageBean</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>  
  </tag>
</taglib>

Jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@taglib uri="http://jsp.veryedu.cn" prefix="y"%>
	<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link
	href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
	rel="stylesheet">
<script
	src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>书籍列表</title>
<style type="text/css">
.page-item input {
	padding: 0;
	width: 40px;
	height: 100%;
	text-align: center;
	margin: 0 6px;
}
.page-item input, .page-item b {
	line-height: 38px;
	float: left;
	font-weight: 400;
}
.page-item.go-input {
	margin: 0 10px;
}
</style>
</head>
<body>
	<form class="form-inline"
		action="${pageContext.request.contextPath }/book/search" method="post">
		<div class="form-group mb-2">
			<input type="text" class="form-control-plaintext" name="bname"
				placeholder="请输入书籍名称">
		</div>
		<button type="submit" class="btn btn-primary mb-2">查询</button>
	</form>

	<table class="table table-striped bg-success">
		<thead>
			<tr>
				<th scope="col">书籍ID</th>
				<th scope="col">书籍名</th>
				<th scope="col">价格</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach var="b" items="${books }">
				<tr>
					<td>${b.bid }</td>
					<td>${b.bname }</td>
					<td>${b.price }</td>
				</tr>
			</c:forEach>
		</tbody>
	</table>
	<y:page pageBean="${pageBean }"></y:page>
</body>
</html>

测试:

BookServlet:

package com.ysq.Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ysq.dao.BookDao;
import com.ysq.entity.Book;
import com.ysq.util.PageBean;
@WebServlet("/book/search")
public class BookServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		/**
		 * 痛点:
		 * 每次做分页需求的时候,都会有大量的重复的后台代码以及前台代码
		 * 	后台代码重复代码已解决
		 * 	前台重复代码问题:
		 * 		1.大量的前台HTML重复
		 * 		2.大量的前台JavaScript代码重复
		 * 目标:
		 * 	定义<y:page></y:page>标签,无需写任何的HTML以及js,就可以完成前端分页
		 * 分析:
		 * 	1.前台分页后一次请求相较于上一次,只不过是页码改变了
		 * 		1.1需要保存上一次请求的URL
		 * 		1.2需要保存上一次请求的参数  bname、price
		 * 		1.3需要保存上一次请求的分页设置  pagination
		 * 		1.4需要保存上一次请求的展示条数
		 * 		1.5初始化的页码
		 * 2.自定义JSP标签(page标签)
		 * 	定义pagebean 因为pagebean中包含了分页中所有的元素(page/rows/pagination/total/nextPage/previousPage/maxPage)
		 * 	
		 * 
		 * 前台JSP传递书名,后台接收
		 */
		BookDao bookDao=new BookDao();
		Book book=new Book();
		book.setBname(req.getParameter("bname"));
		PageBean pageBean=new PageBean();
		pageBean.setRequest(req);
		try {
			List<Book> list3 = bookDao.list3(book, pageBean);
			req.setAttribute("books", list3);
			req.setAttribute("pageBean", pageBean);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		req.getRequestDispatcher("/index.jsp").forward(req, resp);
//		作用:接收jsp页面传递到后台的参数值键值对也就说白了把parameterMap遍历可以拿到hoppy以及bname
//		Map<String, String[]> parameterMap=req.getParameterMap();
		
	}
}

运行结果如下:

 

 

  • 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、付费专栏及课程。

余额充值