JSP交互---分页查询(条件分页查询)

本文介绍了如何实现JSP中的分页查询功能,特别是针对带有查询条件的分页。当用户名为空时,查询所有用户;输入特定字符如'史'时,查询包含该字符的用户,并在翻页时保持查询条件。详细步骤包括创建分页工具类PageBean,用户表数据持久化层中添加条件查询和分页方法,业务逻辑层的分页查询实现,以及新建用于查询用户的servlet UserListServlet。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
如上图所示:
                  1). 用户名为空串时,点击查询—–>查询所有用户
                  2). 用户名输入 ” 史 ” 点击查询—–>查询的是名字中带 ” 史 ” 的用户并且点击下一页或上一页依旧查询的是名字中带 ” 史 ” 的用户.
                  3). 用户查询不存在的用户不会出现异常,

处理后的页面结构

<form method="post" action="UserListServlet">
        用户名:<input name="name" class="input-text" type="text" value="${requestScope.name}">
                            &nbsp;&nbsp;&nbsp;&nbsp;
               <input value="查 询" type="submit">
</form>
<table class="list">
                <tbody>
                    <tr>
                        <td width="70" height="29"><div class="STYLE1" align="center">编号</div>
                        </td>
                        <td width="80"><div class="STYLE1" align="center">用户名</div>
                        </td>
                        <td width="80"><div class="STYLE1" align="center">用户账号</div>
                        </td>
                        <td width="100"><div class="STYLE1" align="center">性别</div>
                        </td>
                        <td width="100"><div class="STYLE1" align="center">年龄</div>
                        </td>
                        <td width="150"><div class="STYLE1" align="center">电话</div>
                        </td>
                        <td width="150"><div class="STYLE1" align="center">权限</div>
                        </td>
                    </tr>

                    <c:forEach var="user" items="${requestScope.pb.list }" varStatus="row">
                        <tr>
                            <td height="23"><span class="STYLE1">${user.id }</span></td>
                            <td>
                                <span class="STYLE1"> 
                                   <a href="UserViewServlet?userId=${user.id}"> ${user.name } </a>
                                </span>
                            </td>   

                            <td><span class="STYLE1"> ${user.loginName } </span></td>
                            <td><span class="STYLE1"> ${user.gender==1?"男":"女" }</span></td>
                            <td><span class="STYLE1"> 2</span></td>
                            <td><span class="STYLE1">${user.phone }</span></td>
                            <td><span class="STYLE1"> ${user.type==1?"管理员":"普通员工"} </span>
                            </td>
                        </tr>

                    </c:forEach>

                </tbody>

            </table>
<a href="UserListServlet?pageNo=1&name=${requestScope.name}">首页</a>
<a href="UserListServlet?pageNo=${requestScope.pb.previous}&name=${requestScope.name}">上一页</a>
<a href="UserListServlet?pageNo=${requestScope.pb.next}&name=${requestScope.name}">下一页</a>
<a href="UserListServlet?pageNo=${requestScope.pb.totalPage}&name=${requestScope.name} ">末页</a>
当前第${requestScope.pb.pageNo }页 , 总页数:${requestScope.pb.totalPage} , 总条数:${requestScope.pb.count}

一、 新建PageBean 工具类 ( 分页工具类 )

* 参考 http://blog.youkuaiyun.com/qq_39316096/article/details/78260816 内第一步*

这里重新 写下PageBean的 setCount( )方法

/**
     * 设置总条数 (根据总条数  对 PageBean 进行其他数据设置)
     * @param count
     */
    public void setCount(Integer count) {
        this.count = count;
        //设置总页数
        //如果count(查询结果的总条数)为0 的时候  设置总页数totalPage为1 pageNo的值也为1
        //不进行判断的话容易造成 count=0时-->totalPage=0-->pageNo=0--->start=-2(造成SQL语句异常)
        if(count==0){
            totalPage=1;
        }else{
            totalPage=count%pageSize==0?count/pageSize:count/pageSize+1;
        }

        //验证页号 
        if (pageNo<0) {
            pageNo=1;

        }else if(pageNo>totalPage){
            pageNo=totalPage;
        }

        //确认当前页上页的页号
        if(pageNo>1){
            previous=pageNo-1;
        }else{
            previous=1;
        }
        //确认当前页下页的页号
        if (pageNo<totalPage) {
            next=pageNo+1;
        } else {
            next=pageNo;
        }
        //计算当前页内容  在Mysql 的分页查询起始行
        start = (pageNo - 1) * pageSize;

2、在UserMysqlImpl—–>用户表的数据持久化层 中添加方法

添加2个方法 : 根据条件查询多少条用户 和 根据条件 进行分页查询

/**
 根据姓名 模糊查询 总共有多少条用户
*/
public int getUserCount(String name) {
        //设置变量  储存多少条用户
        int count =0;
        //生成SQL 语句
        String sql = "select count(*) from smbms_user ";
        //创建集合  储存查询参数
        List params = new ArrayList();
        //判定传入的参数 在不为空和不是空串时 进行SQL语句拼接-----添加参数到集合
        if(name!=null&&!name.equals("")){
            sql+="where name like ?";
            params.add("%"+name+"%");
        }
        // 生成 Object 填充数据--------把集合中的数据转成数据形式
        Object[] obj = params.toArray();
        //调用BaseDao(数据库工具类)的通用查询方法----传入参数
        rs = executeQuery(sql, obj);
        try {
            //如果结果有内容(条数)进行 取值 复制
            if (rs.next()) {
                count=rs.getInt(1);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 关闭连接
        closeAll(rs, ps, con);
        return count;
    }
    /**
     * 分页查询
     * 根据 姓名 模糊查询所有 用户
     * String name 是查询条件(可以多个)
     * int start 是查询的起始行(pageNo-1)*pageSize
     * int pageSize 是一页需要显示的条数
     * @return  返回一个当前页需显示的 数据集合
     */
    public List<User> getAll(String name,int start,int pageSize) {
        //新建集合 储存需返回的数据
        List<User> list = new ArrayList<User>();
        // 生成SQL语句
        String sql = "select * from smbms_user ";
        //创建集合  储存查询参数
        List params = new ArrayList();
        //对条件 进行判定----拼接sql语句 储存查询参数 (多个条件进行多次判断)
        if(name!=null&&!name.equals("")){
            sql+="where name like ?";
            params.add("%"+name+"%");
        }
        //拼接 分页查询的sql 语句---储存查询参数 start  pageSize
        sql+="limit ?,?";
        params.add(start);
        params.add(pageSize);
        //把集合储存的查询参数 转换成数组
        Object[] obj=params.toArray();
        // 调用 通用的查询方法
        // 接受 查询结果
        rs = executeQuery(sql, obj);
        try {
            while (rs.next()) {
                //如果有下一行  取出数据 ---创建实体类
                User user = new User(rs.getInt("user_id"),
                        rs.getString("name"), rs.getString("loginname"),
                        rs.getString("loginpwd"),  rs.getInt("gender"),rs.getDate("birthDate"),
                        rs.getString("phone"), rs.getString("address"),
                        rs.getInt("user_type"));
                //把 实体类(对象) 添加到集合
                list.add(user);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 关闭连接
        closeAll(rs, ps, con);
        return list;
    }

3、在UserServiceImpl—–>用户表的业务逻辑类 中添加分页查询方法

/**
     * 根据姓名 name 分页查询
     * 获取当前页用户
     * @return 
     */
    public PageBean getUserByNameLimit(String name,int pageNo) {
        //新建 分页类的 实例
        PageBean pb = new PageBean();

        //写入当前页号(先写入页号)
        pb.setPageNo(pageNo);

        //调用数据持久化层的----->(根据姓名 模糊查询 总共有多少条用户)方法
        //写入PageBean(分页工具类) 的count(总条数)属性
        pb.setCount(umi.getUserCount(name));

        //调用数据持久化层的----->(根据 姓名 模糊查询 当前页的所有 用户)方法
        // (是一个list集合) 写入PageBean(分页工具类) 的list(当前页展示数据集合)属性 
        pb.setList(umi.getAll(name,pb.getStart(), pb.getPageSize()));
        return pb;  
    }

4、新建查询 用户的 servlet—–>UserListServlet

只重写 doPost( ) 方法—–省略 字符集过滤器 和 session 过滤器

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取页号
        //默认 初始值为1
        int pageNo = 1;
        //从页面获取页号 数据
        if (request.getParameter("pageNo") != null) {
            pageNo = Integer.parseInt(request.getParameter("pageNo"));

        }
        //从页面获取 name 数据(要查询的姓名)
        String name = request.getParameter("name");

        //创建User业务类的实例  
        UserServiceImpl usi = new UserServiceImpl();
        //当前页数据---->调用User业务类的 (根据 姓名 当前页页号 获取当前页的用户)方法
        PageBean pb = usi.getUserByNameLimit(name,pageNo);
        //把分页工具类 pb  传到页面       
        request.setAttribute("pb", pb);
        //把查询的 名字(查询条件)  返回页面
        request.setAttribute("name", name);
        request.getRequestDispatcher("/jsp/userList.jsp").forward(request,
                response);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值