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

自定义分页加标签封装

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

自定义分页加标签封装

目录

1. 通用分页功能

制作好的分页栏效果

1.1 总体思路

1.2 后台分页数据查询

3.3.1 处理流程

 2.实现

编写dao层调用模板

准备一个Servlet

3.4.3 过滤器解决中文乱码问题

  封装分页标签


1. 通用分页功能

制作好的分页栏效果

1.1 总体思路

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("
  • [" + pb.getPage() + "/" + pb.maxPage() + "]
  • "); sb.append("
  • "); sb.append("
  • 数据量:" + pb.getTotal() + "
  • "); sb.append("
  • "); sb.append(""); sb.append("
  • "); sb.append(""); sb.append("
    "); sb.append(""); sb.append(""); // 将查询的参数放到表单中 Map ps = pb.getMs(); if(ps!=null){ for (String s : ps.keySet()) { // 已经吧page和rows单独放到一个输入框中 // 如果是page和rows不生成输入框了 if (s.equals("page") || s.equals("rows")) continue; // habit=看书&habit=打游戏 // s -> habit // strs -> [看书,打游戏] String[] strs = ps.get(s); for (String st : strs) { // // sb.append(""); } } } sb.append(""); sb.append(""); return sb.toString(); } }

    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机械键盘等精美礼品!

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

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

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