栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通用分页`

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用分页`

通用分页核心思路:

1、 为了提高查询性能及节约网络流量,每次只查询指定的记录数,而不是全部,在数量比较大时很有用
2、当点击下一页或指定页面的数据时,将带着所有的查询条件,再次执行查询
讲简单点就是将上一次查询请求再发一次,只不过页码变了

先在MySQL数据库创建表

 

结构:

导入jar包,jstl标签库jar包,以及mysql jar包

后端代码:

DBHelper.java

package com.zking.bookStore.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


public class DBHelper {
	private static String driver;
	private static String url;
	private static String user;
	private static String password;

	static {// 静态块执行一次,加载 驱动一次
		try {
			InputStream is = DBHelper.class
					.getResourceAsStream("config.properties");

			Properties properties = new Properties();
			properties.load(is);

			driver = properties.getProperty("driver");
			url = properties.getProperty("url");
			user = properties.getProperty("user");
			password = properties.getProperty("pwd");

			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	
	public static Connection getConnection() {
		try {
			Connection conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	public static void close(ResultSet rs) {
		if (null != rs) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Statement stmt) {
		if (null != stmt) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Connection conn) {
		if (null != conn) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		close(rs);
		close(stmt);
		close(conn);
	}

	public static boolean isOracle() {
		return "oracle.jdbc.driver.OracleDriver".equals(driver);
	}

	public static boolean isSQLServer() {
		return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
	}
	
	public static boolean isMysql() {
		return "com.mysql.jdbc.Driver".equals(driver);
	}

	public static void main(String[] args) {
		Connection conn = DBHelper.getConnection();
		DBHelper.close(conn);
		System.out.println("isOracle:" + isOracle());
		System.out.println("isSQLServer:" + isSQLServer());
		System.out.println("isMysql:" + isMysql());
		System.out.println("数据库连接(关闭)成功");
	}
}

config.properties 

#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=tiger


#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=123


#sql2000
#driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:microsoft:sqlserver://localhost:1433;databaseName=unit6DB
#user=sa
#pwd=888888


#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/t275?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=123



 EncodingFilter.java

package com.zking.bookStore.utils;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class EncodingFilter implements Filter {

	private String encoding = "UTF-8";// 默认字符集

	public EncodingFilter() {
		super();
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		// 中文处理必须放到 chain.doFilter(request, response)方法前面
		res.setContentType("text/html;charset=" + this.encoding);
		if (req.getMethod().equalsIgnoreCase("post")) {
			req.setCharacterEncoding(this.encoding);
		} else {
			Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
			Set set = map.keySet();// 取出所有参数名
			Iterator it = set.iterator();
			while (it.hasNext()) {
				String name = (String) it.next();
				String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
				for (int i = 0; i < values.length; i++) {
					values[i] = new String(values[i].getBytes("ISO-8859-1"),
							this.encoding);
				}
			}
		}

		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
		if (null != s && !s.trim().equals("")) {
			this.encoding = s.trim();
		}
	}

}

 StringUtils.java

package com.zking.bookStore.utils;

public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}

	
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}

}

PageBean
页码,从页面传递过来——page
每页行数,从也能传递过来——rows
总记录数, 从数据库中统计得到——total
是否分页, 如果为true,则分页——pagination
查询参数, 点击上一页或下一页时需要及携带用户输入的所有查询参数——url
另外提供上页,下页,总页数等计算


PageBean.java

package com.zking.bookStore.utils;


import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class PageBean {
	
	//分页三要素
	
	private int page = 1; //页码  默认为1
	
	private int rows = 10; //页大小 默认为10
	
	private int total = 0; //总记录数  默认为0
	
	private boolean pagination = true; //是否分页  默认为分页
	
	private String url;  //保存请求路径
	
	private Map map; //存放请求参数,用于生成隐藏域中的元素
	
	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page) {//如果页码不为空
			this.page=Integer.parseInt(page);
		}
	}
	
	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows) {//如果页大小不为空
			this.rows=Integer.parseInt(rows);
		}
	}
	
	public int getTotal() {
		return total;
	}

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

	public boolean isPagination() {
		return pagination;
	}

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

	public void setPagination(String pagination) {
		if(null!=pagination) {
			this.pagination=Boolean.parseBoolean(pagination);
		}
	}
	
	public String getUrl() {
		return url;
	}

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

	public Map getMap() {
		return map;
	}


	public void setMap(Map map) {
		this.map = map;
	}


	public PageBean() {
		// TODO Auto-generated constructor stub
	}
	
	
	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
				+ ", url=" + url + ", map=" + map + "]";
	}

	
	public int getStartIndex() {
		return (this.page-1)*this.rows;
	}
	
	
	public void setRequest(HttpServletRequest req) {
		String page = req.getParameter("page");
		String rows = req.getParameter("rows");
		String pagination = req.getParameter("pagination");
		
		String url = req.getRequestURI();
		Map map = req.getParameterMap();
		
		//设置到pageBean中
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		
		this.setUrl(url);
		this.setMap(map);
	}
	
	
	public int getPrePage() {
		int prePage = this.page-1;
		if(this.page==1) {
			prePage = this.page;
		}
		return prePage;
		//return this.page - 1 > 0 ? this.page - 1 : 1;
	}
	
	
	public int getNextPage() {
		int nextPage = this.page+1;
		if(this.page==getMaxPage()) {
			nextPage = getMaxPage();
		}
		return nextPage;
		//return this.page + 1 > getMaxPage() ? getMaxPage() : this.page + 1;
	}
	
	
	public int getMaxPage() {
		int maxPage = this.total/this.rows;
		if(this.total%this.rows!=0) {
			maxPage++;
		}
		return maxPage;
		
		

	}
}

Book.java

package com.zking.bookStore.entity;

import java.io.Serializable;

public class Book implements Serializable{

	
	private static final long serialVersionUID = 6883813152865156475L;
	
	private Integer id;
	private String bookName;
	private Float price;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public Float getPrice() {
		return price;
	}
	public void setPrice(Float price) {
		this.price = price;
	}
	public Book() {
		// TODO Auto-generated constructor stub
	}
	public Book(Integer id, String bookName, Float price) {
		this.id = id;
		this.bookName = bookName;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Book [id=" + id + ", bookName=" + bookName + ", price=" + price + "]";
	}
	
}

 BookDAO.java

package com.zking.bookStore.dao;

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

import com.zking.bookStore.base.BaseDAO;
import com.zking.bookStore.entity.Book;
import com.zking.bookStore.utils.DBHelper;
import com.zking.bookStore.utils.PageBean;
import com.zking.bookStore.utils.StringUtils;

public class BookDAO extends BaseDAO{
	
	private Connection con = null;
	private PreparedStatement ps = null;
	private ResultSet rs =  null;
	
	
	public void addBook(Book book) {
		try {
			String sql = "INSERT INTO t_book(book_name,price) VALUES(?,?)";
			//获取数据库连接对象
			con = DBHelper.getConnection();
			ps=con.prepareStatement(sql);
			ps.setString(1, book.getBookName());
			ps.setFloat(2, book.getPrice());
			ps.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			DBHelper.close(con, ps, null);
		}
	}
	
	
	public void delBook(Book book) {
		try {
			String sql = "DELETE FROM t_book WHERe id=?";
			//获取数据库连接对象
			con = DBHelper.getConnection();
			ps=con.prepareStatement(sql);
			ps.setInt(1, book.getId());
			ps.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			DBHelper.close(con, ps, null);
		}
	}
	
	public void editBook(Book book) {
		try {
			String sql = "UPDATE t_book SET book_name=?,price=?  WHERe id=? ";
			//获取数据库连接对象
			con = DBHelper.getConnection();
			ps=con.prepareStatement(sql);
			ps.setString(1, book.getBookName());
			ps.setFloat(2, book.getPrice());
			ps.setInt(3, book.getId());
			ps.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			DBHelper.close(con, ps, null);
		}
	}
	
	public Book loadBook(Book book) {
		try {
			String sql = " SELECT id,book_name,price FROM t_book WHERe id=? ";
			//获取数据库连接对象
			con = DBHelper.getConnection();
			ps = con.prepareStatement(sql);
			ps.setInt(1, book.getId());
			rs = ps.executeQuery();
			Book b = null;
			if(rs.next()) {
				b = new Book();
				b.setId(rs.getInt("id"));
				b.setBookName(rs.getString("book_name"));
				b.setPrice(rs.getFloat("price"));
			}
			return b;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			DBHelper.close(con, ps, rs);
		}
	}
	
	public List listBook(Book book,PageBean pageBean) {
		
		String sql = " SELECt id,book_name,price FROM t_book WHERe 1=1 ";
		
		//模糊查询
		if(StringUtils.isNotBlank(book.getBookName())) {
			sql += " AND book_name LIKE '%"+book.getBookName()+"%'";
		}
		
		return this.executeQuery(sql, pageBean, new CallBack() {

			@Override
			public List forEachRs(ResultSet rs) throws Exception {
				List listBook = new ArrayList<>();
				Book b = null;
				while(rs.next()) {
					b = new Book();
					b.setId(rs.getInt("id"));
					b.setBookName(rs.getString("book_name"));
					b.setPrice(rs.getFloat("price"));
					listBook.add(b);
				}
				return listBook;
			}
		});
		
	}	
}

测试点击BookDAO鼠标右键New--->Other-->输入junit Test Case-->点Next-->勾选如图所示

点击Next-->勾选如图所示

点击Finish

调用BookDAO方法即可

package com.zking.bookStore.dao;

import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.zking.bookStore.entity.Book;
import com.zking.bookStore.utils.PageBean;

public class BookDAOTest {
	
	private BookDAO bookDAO;
	private Book book;
	@Before
	public void setUp() throws Exception {
		bookDAO = new BookDAO();
		book = new Book();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testAddBook() {
		for (int i = 1; i < 101; i++) {
			book.setBookName("孙悟空三打白骨精第"+i+"回");
			book.setPrice(66f);
			bookDAO.addBook(book);
		}
	}

	@Test
	public void testDelBook() {
			book.setId(1);
			bookDAO.delBook(book);
	}

	@Test
	public void testEditBook() {
		book.setId(2);
		book.setBookName("弼马温");
		book.setPrice(9.9f);
		bookDAO.editBook(book);
	}

	@Test
	public void testLoadBook() {
		book.setId(2);
		Book loadBook = bookDAO.loadBook(book);
		System.out.println(loadBook);
	}

	@Test
	public void testListBook() {
		book.setBookName("1");
		PageBean pageBean = new PageBean();
		pageBean.setPage(2);
		pageBean.setRows(5);
		List listBook = bookDAO.listBook(book,pageBean);
		for (Book b : listBook) {
			System.out.println(b);
		}
	}
}

测试如图所示: 点击方法右键找到Run As-->JUnit  Test

BaseDAO.java 

package com.zking.bookStore.base;

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

import com.zking.bookStore.utils.DBHelper;
import com.zking.bookStore.utils.PageBean;

public class BaseDAO {
	
	
	public interface CallBack{
		public List forEachRs(ResultSet rs) throws Exception;
	}
	
	
	
	
	public List executeQuery(String sql,PageBean pageBean,CallBack callBack) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//1.获取数据库连接
			conn = DBHelper.getConnection();
			
			//2.查询符合条件的总记录数
			if(null!=pageBean && pageBean.isPagination()) {//如果分页工具类不为空  并且pagination为true,则分页
				//将普通的sql语句转换成查询总记录数的sql语句
				String countSql = this.getCountSql(sql);
				ps = conn.prepareStatement(countSql);
				rs = ps.executeQuery();
				if(rs.next()) {
					int total = rs.getInt(1);
					//将查询的总记录数放到工具类 pageBean中
					pageBean.setTotal(total);
				}
				DBHelper.close(null, ps, rs);
				
			}
			
			//3.查询符合条件并且分页的记录
			if(null!=pageBean && pageBean.isPagination()) {//如果分页工具类不为空  并且pagination为true,则分页
				//将普通的sql语句转换成查询符合条件并且分页的sql语句
				sql = this.getPageSql(sql, pageBean);
			}
			
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			//遍历rs
			
			return callBack.forEachRs(rs);
			
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			DBHelper.close(conn, ps, rs);
		}
			
		
	}
	
	
	private String getCountSql(String sql) {
		String countSql = "SELECt COUNT(*) FROM ("+sql+")t1 ";
		return countSql;
	}
	
	
	private String getPageSql(String sql,PageBean pageBean) {
		String pageSql = sql + " LIMIT "+pageBean.getStartIndex()+","+pageBean.getRows();
		return pageSql;
	}
	
}

BookServlet.java 

package com.zking.bookStore.action;

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.zking.bookStore.dao.BookDAO;
import com.zking.bookStore.entity.Book;
import com.zking.bookStore.utils.PageBean;
@WebServlet("/bookservlet")
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 {
		//设置编码
		req.setCharacterEncoding("utf-8");
		
		//获取请求参数
		String bookName = req.getParameter("bookName");
		
		//获取请求参数 ,设置到pageBean中
		PageBean pageBean = new PageBean();
		
		String requestURI = req.getRequestURI();
		
//		Map parameterMap = req.getParameterMap();
//		System.out.println(requestURI);
		
		pageBean.setRequest(req);
		
		Book book = new Book();
		book.setBookName(bookName);
		
		BookDAO bookDAO = new BookDAO();
		
		
		List listBook = bookDAO.listBook(book, pageBean);
		
		req.setAttribute("listBook", listBook);
		
		req.setAttribute("pageBean", pageBean);
		
		//转发
		req.getRequestDispatcher("/book.jsp").forward(req, resp);
	}
	
	
}

 前端代码:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	/bookservlet">查询书本

book.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@taglib prefix="z" uri="/zking" %> 




Insert title here




	
	
书名:
编号 书名 价格
${b.id } ${b.bookName } ${b.price }
<%--
--%> <%-- < 第${pageBean.page }页/总共${pageBean.total }条记录 首页  上一页  下一页  末页     跳转  --%> <%-- ${pageBean }--%>

 PageTag.java

写一个标签助手类拼接前端代码

package com.zking.bookStore.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.zking.bookStore.utils.PageBean;

public class PageTag extends BodyTagSupport {
	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 {
		JspWriter out = pageContext.getOut();
		try {
			out.println(toHtml());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return super.doStartTag();
	}
	
	
	private String toHtml() {
		//pageBean为空或者 不分页
		if(null==pageBean || !pageBean.isPagination()) {
			return "";
		}
		StringBuilder sb = new StringBuilder();
		//拼接form表单
		
		sb.append("
"); sb.append(""); //参数列表 Map map = pageBean.getMap(); String name =null; String[] values = null; // bookName = '不短命' hobby="篮球" hobby="足球" page="2" Set> entrySet = map.entrySet(); for (Entry entry : entrySet) { name = entry.getKey(); if(name.equals("page")) { continue; } values = entry.getValue(); for (String value : values) { // // // sb.append(""); } } sb.append(""); //拼接div部分 sb.append(""); sb.append("第"+pageBean.getPage()+"页/总共"+pageBean.getMaxPage()+"页,共"+pageBean.getTotal()+"条记录 "); //首页 上一页 if(pageBean.getPage()!=1) { sb.append("首页 rn" + " 上一页 "); }else { sb.append("首页 上一页 "); } //末页 下一页 if(pageBean.getPage()!=pageBean.getMaxPage()) { sb.append("下一页 rn" + " 末页 "); }else { sb.append("下一页 末页 "); } //跳转页 sb.append(" "); sb.append("GO"); sb.append(""); //拼接js sb.append(""); return sb.toString(); } }

z.tld  配置自定义标签




	
	1.0
	
	1.2
	
	l
	
	/zking

	
		
		page
		
		com.zking.bookStore.tag.PageTag
		
		empty
		
		
			
			pageBean
			
			true
			
			true
		
	

效果图: 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/946321.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号