javaweb 实现分页的小案例

一、准备工作

1.1 创建一个数据库 dbok 创建一张数据表 用于展示分页数据,表的sql脚本如下:

-- 员工管理
create table emp (
     id int unsigned primary key auto_increment comment 'ID',
     username varchar(20) not null unique comment '用户名',
     password varchar(32) default '123456' comment '密码',
     name varchar(10) not null comment '姓名',
     gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
     image varchar(300) comment '图像',
     job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
     entrydate date comment '入职时间',
     dept_id int unsigned comment '部门ID',
     create_time datetime not null comment '创建时间',
     update_time datetime not null comment '修改时间'
) comment '员工表';

INSERT INTO emp(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
    (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
    (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
    (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
    (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
    (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
    (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
    (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
    (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
    (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
    (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
    (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
    (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
    (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
    (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
    (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
    (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
    (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

1.2  创建一个数据库工具类 DbUtil.java

package cn.webrx.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DbUtil {
    private String driver = "com.mysql.cj.jdbc.Driver";
    private String url = "jdbc:mysql:/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=PRC";
    private String user = "root";
    private String password = "";
    private Connection conn = null;

    public DbUtil() {
        try {
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
        connect(url, user, password);
    }

    public void connect(String url, String user, String password) {
        try {
            this.conn = DriverManager.getConnection(url, user, password);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 定义一个方法 记录查询的总记录数
    public int count(String sql,Object... params){
        List<Map<String,Object>> list=query(sql,params);
        String s1 = list.get(0).get("cc").toString();
        int count=Integer.parseInt(s1);
        return  count;
    }
   // 查询每一条数据 两个参数 第一个为sql语句 第二个为要传递的参数
    public List<Map<String, Object>> query(String sql, Object... params) {
        List<Map<String, Object>> list = new ArrayList<>();
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            int i = 0;
            // 将要传递的数组遍历 并将值传递给?占位符
            for (Object p : params) {
                ps.setObject(++i,p);
            }
            // 将查询的每一条结果集放到一张临时表格里
            ResultSet rs = ps.executeQuery();
            ResultSetMetaData md = rs.getMetaData();
            while (rs.next()) {
                Map<String, Object> map = new HashMap<>();
                for (int j = 1; j <= md.getColumnCount(); j++) {
                    //System.out.println(md.getColumnLabel(j));//表的列别名,如果没有别名则是列名
                    //System.out.println(md.getColumnName(j)); //表的列名
                    String label = md.getColumnLabel(j);
                    map.put(label, rs.getObject(j));
                }
                list.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
     // 此方法可以进行删除操作的方法 第二个参数代表第preparestatement 里的给里面的占位符? 赋的值
    public int execute(String sql, Object... params) {
        int rows = 0;
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            int i = 0;
            for (Object p : params) {
                ps.setObject(++i, p);
            }
            rows = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rows;
    }


    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

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

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Connection getConn() {
        return conn;
    }

    public void setConn(Connection conn) {
        this.conn = conn;
    }
}

1.3 t.jsp

<%@ page import="cn.webrx.util.DbUtil" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<!DOCTYPE html >
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Bootstrap 实例</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
  <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
  <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
  <style>
    .container{
      margin-top: 30px;
    }
    #a1{
      flood-color: black;
      font-size: larger;
      text-align: center;
      margin-top: 20px;
    }

  </style>
</head>
<body>
<div id="a1">
  <h2>
    员工管理系统
  </h2>
</div>
<div class="container">
  <table class="table">
    <thead>
    <tr>
      <th>用户名</th>
      <th>作者</th>
      <th>性别</th>
      <th>入职时间</th>
      <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <%
      // 获取数据库连接
      DbUtil db=new DbUtil();
      // 根据删除链接传递的name 删除数据
      if(request.getParameter("name")!=null){
        db.execute("delete from emp where username=? ",request.getParameter("name"));
      }

      // 定义当前页 通过链接传递的值 如果没有传递值 就默认当前页为第一页 否则传递的页数就是当前页数
        int currpage = request.getParameter("p") == null ? 1 : Integer.parseInt(request.getParameter("p"));

//       int currpage=request.getParameter("p")==null? 1 : Integer.parseInt(request.getParameter("p"));
      // 定义每页展示几条数据
       int pagesize=4;
       // 查看总共有几条记录数 用于分页条件
//       int recordcount=db.count("select count(*) from user");
         int recordcount = db.count("select count(*) cc from emp");

      // 总页数 拿总页数除以每页展示的数据 除不尽也要分一页
       int pagecount=recordcount%pagesize==0? recordcount/pagesize:recordcount/pagesize+1;
       // 做个判断 如果当前页数<1让当前页数等于1 如果当前页数>最大页数 就让当前页数=最大页数
       if(currpage<=1) currpage=1;
       if(currpage>pagecount) currpage=pagecount;
       // 调用方法 进行查询每一条数据 并进行分页处理
      List<Map<String, Object>> list = db.query("select username,name,gender,entrydate from emp limit ?,?", currpage * pagesize - pagesize, pagesize);
      for (Map<String, Object>  m: list) {

       %>
<%--      将遍历出的数据放到表格中   jsp 表达式表示 在效果上=out.print 所以在jsp表达式中 不能添加 out.print --%>
    <tr>
      <td>
          <%=m.get("username")%>
      </td>
      <td>
          <%=m.get("name")%>
      </td>
      <td>
          <%=m.get("gender")%>
      </td>
      <td>
          <%=m.get("entrydate")%>
      </td>
        <td>
            <a href="?name=<%=m.get("username")%>&p=<%=currpage%>" onclick="return confirm('是不是要删除?')" class="btn btn-sm btn-danger">删除</a>
            <a href="" onclick="return confirm('是否要修改')"  class="btn btn-sm btn-primary">修改</a>
        </td>
    </tr>
    <%
      }
    %>
    </tbody>
  </table>
</div>
<br>
<ul class="pagination pagination-lg justify-content-center" id="a2" colspan="100">
  <%
//       给页数链接设置参数
      out.print(String.format("<li class=\"page-item\"><a class=\"page-link\" href=\"?p=%d\">首页</a></li>", 1));
      out.print(String.format("<li class=\"page-item\"><a class=\"page-link\" href=\"?p=%d\">上页</a></li>", currpage - 1));
      // 因为第几页不能是超链接 所以将a替换成 一个span 无任何实意的标签
      out.print(String.format("<li class=\"page-item\"><span class=\"page-link\" href=\"?p=%d\">第%d页</span></li>", currpage - 1,currpage));
      out.print(String.format("<li class=\"page-item\"><a class=\"page-link\" href=\"?p=%d\">下页</a></li>", currpage + 1));
      out.print(String.format("<li class=\"page-item\"><a class=\"page-link\" href=\"?p=%d\">末页</a></li>", pagecount));
  %>
</ul>
</body>
</html>

二、页面效果 (只完成了分页和删除效果)

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现分页模糊查询需要使用到数据库的查询语句和Java的分页处理函数。下面给出一个简单的示例代码,实现了在Javaweb项目中使用MySQL数据库进行分页模糊查询。 首先,我们需要在JSP页面中添加一个表单,用于输入查询关键字和选择查询范围。如下所示: ```html <form action="search.jsp" method="get"> <input type="text" name="keyword"> <select name="range"> <option value="title">标题</option> <option value="content">内容</option> </select> <input type="submit" value="查询"> </form> ``` 接下来,在后台的servlet中处理查询请求。我们需要使用MySQL的LIKE运算符进行模糊查询,并且使用LIMIT语句进行分页。示例代码如下: ```java String keyword = request.getParameter("keyword"); String range = request.getParameter("range"); // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); // 构造SQL语句 String sql = "SELECT * FROM mytable WHERE " + range + " LIKE ? LIMIT ?, ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, "%" + keyword + "%"); stmt.setInt(2, (page - 1) * pageSize); stmt.setInt(3, pageSize); // 执行查询 ResultSet rs = stmt.executeQuery(); while (rs.next()) { // 处理查询结果 } ``` 在上面的代码中,我们使用了PreparedStatement对象来构造SQL语句,并且通过设置参数的方式来防止SQL注入攻击。同时,我们使用了LIMIT语句来进行分页处理,其中page和pageSize分别表示当前页码和每页的记录数。 最后,我们需要在JSP页面中显示查询结果,并且添加上一页和下一页的链接。示例代码如下: ```html <% // 获取查询结果 List<Result> results = (List<Result>) request.getAttribute("results"); int page = (int) request.getAttribute("page"); int total = (int) request.getAttribute("total"); // 显示查询结果 for (Result result : results) { // 显示每一条记录 } // 显示分页链接 if (page > 1) { out.println("<a href='search.jsp?page=" + (page - 1) + "&keyword=" + keyword + "&range=" + range + "'>上一页</a>"); } if (page < total) { out.println("<a href='search.jsp?page=" + (page + 1) + "&keyword=" + keyword + "&range=" + range + "'>下一页</a>"); } %> ``` 在上面的代码中,我们首先获取查询结果、当前页码和总页数等信息。然后,我们根据页码和查询关键字构造上一页和下一页的链接,并且在页面上显示出来。注意,我们需要根据当前页码来判断上一页和下一页是否可用。同时,我们需要将查询关键字和查询范围传递给下一页,以便查询结果的持续展示。 以上就是一个简单的Javaweb分页模糊查询的实现方法。当然,实际项目中还需要考虑到性能、安全性等问题,这里只是给出了一个简单示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天的接口写完了吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值