目录
1. 通用分页功能
制作好的分页栏效果
1.1 总体思路
1.2 后台分页数据查询
3.3.1 处理流程
2.实现
编写dao层调用模板
准备一个Servlet
3.4.3 过滤器解决中文乱码问题
封装分页标签
1. 通用分页功能
制作好的分页栏效果
1.1 总体思路
1) 为了提高查询性能及节约网络流量,每次只查询指定的记录数,而不是全部,在数量比较大时很有用
2)当点击下一页或指定页面的数据时,将带着所有的查询条件,再次执行查询
分页信息实体
用于存储和传递分页参数,主要内容如下:
- 页码,从页面传递过来
- 每页行数,从也能传递过来
- 总记录数, 从数据库中统计得到
- 是否分页, 如果为false,则查询所有记录
- 另外提供上页,下页,总页数等计算
1) 为了提高查询性能及节约网络流量,每次只查询指定的记录数,而不是全部,在数量比较大时很有用
2)当点击下一页或指定页面的数据时,将带着所有的查询条件,再次执行查询
分页信息实体
用于存储和传递分页参数,主要内容如下:
- 页码,从页面传递过来
- 每页行数,从也能传递过来
- 总记录数, 从数据库中统计得到
- 是否分页, 如果为false,则查询所有记录
- 另外提供上页,下页,总页数等计算
参考实现:
package com.zking.page.utils;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
public class PageBaen {
private int total;//总页数
private Integer page=1;//翻页页数
private Integer row=5; //分页数
private boolean pagination=true; //是否分页
private String url; //跳转地址
private Map ms;//保存所有访问地址
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getRow() {
return row;
}
public Integer getIndex(){
if(this.page>this.maxPage()){
this.page=this.maxPage();
}
if(this.page<1){
this.page=1;
}
return (this.getPage()-1)*this.getRow();
}
public void setRow(Integer row) {
this.row = row;
}
public boolean isPagination() {
return pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map getMs() {
return ms;
}
public void setMs(Map ms) {
this.ms = ms;
}
@Override
public String toString() {
return "PageBaen{" +
"total=" + total +
", page=" + page +
", row=" + row +
", pagination=" + pagination +
", url='" + url + ''' +
", ms=" + ms +
'}';
}
public int maxPage(){
return total%row==0?total/row:total/row+1;
}
public int prevPage(){
return page-1<1?page:page-1;
}
public int nexPage(){
return page+1 > maxPage()? page: page+1;
}
//接受请求
public void setRequest(HttpServletRequest req){
String page = req.getParameter("page");
if(StringUtils.isNotBlank(page)){
setPage(Integer.valueOf(page));
}
String rows = req.getParameter("rows");
if(StringUtils.isNotBlank(rows)){
setRow(Integer.parseInt(rows));
}
String pagination1 = req.getParameter("pagination");
if(StringUtils.isNotBlank(pagination1)){
setPagination(Boolean.parseBoolean(pagination1));
}
//第一次访问数据获取跳转地址
url=req.getRequestURL().toString();
//获取前台查询参数
ms=req.getParameterMap();
//保存分页实体对象传前台
req.setAttribute("pb",this);
}
}
1.2 后台分页数据查询
3.3.1 处理流程
1) 查询满足条件的总记录数
2) 查询满足条件的当前页的数据
3) 上两个步骤的查询条件要一致
流程图:
2.实现
1.为了简化数据库操作 ,我们封装一个DButils工具类
1,1配置文件
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/db_myshow?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true accout=root password=123456可以直接放在 src文件下 如果创建文件夹请配置文件夹为源码目录否则无效
package com.zking.page.utils;
import java.sql.*;
import java.util.Properties;
public class DBUtils{
private static Properties p;
static {
p=new Properties();
try {
p.load(DBAccess.class.getResourceAsStream("/jdbc.properties"));
Class.forName(p.getProperty("driver"));
}catch (Exception e){
e.printStackTrace();
}
}
public static Connection getconn(){
Connection conn=null;
try {
conn= DriverManager.getConnection(p.getProperty("url"),p.getProperty("accout"),p.getProperty("password"));
} catch (SQLException e) {
throw new RuntimeException(e);
}
return conn;
}
public static void close(Connection con) {
close(con, null, null);
}
public static void close(PreparedStatement ps) {
close(null, ps, null);
}
public static void close(ResultSet rs) {
close(null, null, rs);
}
public static void close(Connection con, PreparedStatement ps, ResultSet rs) {
try {
if (con != null && !con.isClosed()) {
con.close();
}
if (ps != null)
ps.close();
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(DBAccess.getconn());
System.out.println("你好呀");
}
}
通用分页查询模板类:
package com.zking.page.utils;
import com.zking.page.entity.TBook;
import org.apache.commons.beanutils.ConvertUtils;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public final class BaseDao {
//工具类不可继承
private BaseDao(){
}
public static List excuteQuery(String sql, Class clz, PageBaen page,Object...obj){
List lsit=new ArrayList<>();
PreparedStatement ps=null;
ResultSet rs=null;
Connection conn = DBAccess.getconn();
if(page!=null && page.isPagination()){//判断是否分页
//填充总页数
setTotal(sql,page,obj);
sql += " limit "+page.getIndex()+","+page.getRow();
}
try {
ps=conn.prepareStatement(sql);
for (int i=0;i tBooks =BaseDao.excuteQuery("select * from t_book where true ", TBook.class,pageBaen);
tBooks.forEach(System.out::println);
}
}
编写dao层调用模板
public static boolean isNotBlank(Object obj) {
return !Optional.ofNullable(obj).orElse("").equals("");
}
public List listBook(String name, PageBaen pb) {
String sql="select * from t_book where true and bname like ?";
name=isNotBlank(name)?name:"";
List tBooks = BaseDao.excuteQuery(sql, TBook.class, pb,"%"+name+"%");
return tBooks;
}
准备一个Servlet
准备一个servlet用于处理请求,获取数据库中的数据,并转发到结果显示页面。
package com.zking.page.servlet;
import com.zking.page.dao.impl.BookDaoImpl;
import com.zking.page.entity.TBook;
import com.zking.page.utils.PageBaen;
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 java.io.IOException;
import java.util.List;
@WebServlet("/BooklistServlet")
public class BooklistServlet 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");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String strName = req.getParameter("strName");
PageBaen pb=new PageBaen();
//接收前台给我们的分页
pb.setRequest(req);
List tBooks = new BookDaoImpl().listBook(strName, pb);
req.setAttribute("booklist",tBooks);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
3.4.3 过滤器解决中文乱码问题
@WebFilter("
for (int i = statc; i <= end; i++) {
if(pb.getPage()==i){
sb.append("
");
}else{
sb.append(" ");
}
}
sb.append("");
sb.append("2) 标签库描述tld文件中添加paging标签
page //请改成自己类的全路径名com.zking.page.tags.PageTag empty pb true true
3) 使用分页标签
首先在页面中引入标签
<%@ taglib prefix="z" uri="com.lkf.zking.lork" %>
分页调用 自己封装forEach 还有tld 文件编写 请看(2条消息) 自定义标签库_嘴强程序员的博客-CSDN博客
<%@ page import="com.zking.page.utils.PageBaen" %><%--
Created by IntelliJ IDEA.
User: lkf
Date: 2022/7/7
Time: 18:01
To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="z" uri="com.lkf.zking.lork" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
| 编号 | 书名 | 价格 |
| ${c.bid} | ${c.bname} | ${c.price} |
没有完善 测试时切记先运行 servlet 不然pb是空的 会报异常
暑期编程PK赛 得CSDN机械键盘等精美礼品!


