个人博客项目(7) --- 分页查询所有文章

(一) 前端文章表

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全部文章列表</title>
    <script src="jquery-1.9.1.min.js"></script>
    <script>
        jQuery(function () {
            jQuery.getJSON("list",{},function (data) {
                if(data != null && data.succ == 1) {
                    //查询成功
                    var html = "";
                    for(var i = 0; i < data.list.length; i++) {
                        var art = data.list[i];

                        html += "<tr>\n" +
                            "                <td>"+art.id+"</td>\n" +
                            "                <td>"+art.title+"</td>\n" +
                            "                <td>"+art.username+"</td>\n" +
                            "                <td>"+art.createtime+"</td>\n" +
                            "                <td>"+art.rcount+"</td>\n" +
                            "            </tr>";
                    }
                    jQuery("#tab").append(html);
                }else {
                    alert("查询失败:"+data.msg);
                }
            });
        })
    </script>
</head>
<body>

    <div style="margin-top: 50px">
        <table id="tab" border="1" style="width: 80%" align="center">
            <tr>
                <td>编号</td>
                <td>标题</td>
                <td>作者</td>
                <td>发布时间</td>
                <td>阅读量</td>
            </tr>
        </table>
    </div>

</body>
</html>

(二) 新增VO层

实体类

  1. 基础数据类UserInfo、ArticleInfo
  2. VO(view object)层:展示层对象,是基础数据类的扩充
    在这里插入图片描述

因为我们需要把作者姓名也查询出来,所以需要联合查询,自然需要一个又有文章属性,也有用户的作者属性,就增加一个展示层对象。

package models.vo;

import models.ArticleInfo;

/**
 * Created with IntelliJ IDEA.
 * Description:增加作者属性
 * User: starry
 * Date: 2021 -04 -13
 * Time: 14:51
 */
public class ArticleInfoVO extends ArticleInfo {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

(三) 操作数据库进行联合查询

在ArticleInfoDao中添加新的方法

/**
     * 操作数据库查询文章及作者
     * @return
     * @throws SQLException
     */
    public List<ArticleInfoVO> getAllArticle() throws SQLException {
        Connection connection = DBUtils.getConnection();
        String sql = "select a.*,u.username from articleinfo a,userinfo u where a.uid = u.id";
        PreparedStatement statement = connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();
        List<ArticleInfoVO> list = new ArrayList<>();
        while(resultSet.next()) {
            ArticleInfoVO art = new ArticleInfoVO();
            art.setId(resultSet.getInt("id"));
            art.setTitle(resultSet.getString("title"));
            art.setUsername(resultSet.getString("username"));
            art.setCreatetime(resultSet.getDate("createtime"));
            art.setRcount(resultSet.getInt("rcount"));
            list.add(art);
        }
        DBUtils.close(resultSet,statement,connection);
        return list;
    }

(四) 编写servlet进行业务处理,响应给前端

package services;

import dao.ArticleInfoDao;
import models.vo.ArticleInfoVO;
import utils.ResultJSONUtils;

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.sql.SQLException;
import java.util.HashMap;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:所有文章列表
 * User: starry
 * Date: 2021 -04 -13
 * Time: 14:40
 */

@WebServlet("/list")
public class ListServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int succ = -1; // succ=1 表示操作成功
        String msg = ""; // 错误说明信息
        List<ArticleInfoVO> list = null;

        // 1.从前端获取参数

        // 2.调用数据库执行相应的业务逻辑
        ArticleInfoDao dao = new ArticleInfoDao();
        try {
            list = dao.getAllArticle();
            succ = 1;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 3.将上一步操作的结果返回给前端
        HashMap<String, Object> result = new HashMap<>();
        result.put("succ", succ);
        result.put("msg", msg);
        result.put("list",list);
        ResultJSONUtils.write(response, result);
    }
}

这样没有分页的查询已经做出来了
在这里插入图片描述
接下来我们就加上分页功能

(五) 构建正确的url地址参数

在这里插入图片描述
要想时间分页功能,首先要把url地址改成?p=n这样子,代表这是第n页

点击上一页或者下一页跳转到正确的url地址

  1. 增加上一页下一页跳转链接
  2. 设置全局变量page,编写操作页码函数
  3. 更新全局页码信息
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全部文章列表</title>
    <script src="jquery-1.9.1.min.js"></script>
    <script>

        //当前页码数
        var page = 1;
        //操作页码函数
        function mypage(type) {
            if(type == 1) {
                //上一页
                if(page > 1) {
                    location.href = "list.html?p="+(page-1);
                }else {
                    alert("已经在首页了");
                }
            }else {
                //下一页
                location.href = "list.html?p="+(page+1);
            }
        }

        //页面加载完成之后执行该函数
        jQuery(function () {
            //更新全局的页码信息
            var param = location.search;
            if(param != "") {
                //不在首页
                page = parseInt(param.split("=")[1]);
            }

            jQuery.getJSON("list",{
                "page":page,    //当前页码数
                "psize":2       //每页显示两条数据
            },function (data) {
                if(data != null && data.succ == 1) {
                    //查询成功
                    var html = "";
                    for(var i = 0; i < data.list.length; i++) {
                        var art = data.list[i];

                        html += "<tr>\n" +
                            "                <td>"+art.id+"</td>\n" +
                            "                <td>"+art.title+"</td>\n" +
                            "                <td>"+art.username+"</td>\n" +
                            "                <td>"+art.createtime+"</td>\n" +
                            "                <td>"+art.rcount+"</td>\n" +
                            "            </tr>";
                    }
                    jQuery("#tab").append(html);
                }else {
                    alert("查询失败:"+data.msg);
                }
            });
        })
    </script>
</head>
<body>

    <div style="margin-top: 50px; text-align: center" >
        <table id="tab" border="1" style="width: 80%" align="center">
            <tr>
                <td>编号</td>
                <td>标题</td>
                <td>作者</td>
                <td>发布时间</td>
                <td>阅读量</td>
            </tr>
        </table>
        <p></p>
        <a href="javascript:mypage(1)">上一页</a>
        <a href="javascript:mypage(2)">下一页</a>
    </div>

</body>
</html>

(六) 获取当前url中的页码,请求后端查询相应的数据

package services;

import dao.ArticleInfoDao;
import models.vo.ArticleInfoVO;
import utils.ResultJSONUtils;

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.sql.SQLException;
import java.util.HashMap;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:所有文章列表
 * User: starry
 * Date: 2021 -04 -13
 * Time: 14:40
 */

@WebServlet("/list")
public class ListServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int succ = -1; // succ=1 表示操作成功
        String msg = ""; // 错误说明信息
        List<ArticleInfoVO> list = null;

        // 1.从前端获取参数
        int page = Integer.parseInt(request.getParameter("page"));
        int psize = Integer.parseInt(request.getParameter("psize"));

        // 2.调用数据库执行相应的业务逻辑
        ArticleInfoDao dao = new ArticleInfoDao();
        try {
            list = dao.getAllArticleByPage(page,psize);
            succ = 1;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 3.将上一步操作的结果返回给前端
        HashMap<String, Object> result = new HashMap<>();
        result.put("succ", succ);
        result.put("msg", msg);
        result.put("list",list);
        ResultJSONUtils.write(response, result);
    }
}

(七) 操作数据库实现分页查询

在ArticleInfoDao类添加有分页查询功能函数

这里limit ?,?

  1. 偏移量——公式:(页码数page - 1)* 查询条数
  2. 查询条数——psize
    /**
     * 分页:
     * 操作数据库分页查询文章及作者
     * @param page
     * @param psize
     * @return
     * @throws SQLException
     */
    public List<ArticleInfoVO> getAllArticleByPage(int page, int psize) throws SQLException {
        Connection connection = DBUtils.getConnection();
        String sql = "select a.*,u.username from articleinfo a,userinfo u where a.uid = u.id limit ?,?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,(page-1)*psize);
        statement.setInt(2,psize);
        ResultSet resultSet = statement.executeQuery();
        List<ArticleInfoVO> list = new ArrayList<>();
        while(resultSet.next()) {
            ArticleInfoVO art = new ArticleInfoVO();
            art.setId(resultSet.getInt("id"));
            art.setTitle(resultSet.getString("title"));
            art.setUsername(resultSet.getString("username"));
            art.setCreatetime(resultSet.getDate("createtime"));
            art.setRcount(resultSet.getInt("rcount"));
            list.add(art);
        }
        DBUtils.close(resultSet,statement,connection);
        return list;
    }

这样我们就实现了简单分页的查询功能了!!!
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值