总结之java web实现分页功能(一)

网页开发离不开分页,分页如何实现呢

  • 可以看一下百度的分页有什么功能
    这里写图片描述

  • 上一页、下一页、10页按钮、一页显示10条信息

定义一个 PageResult类专门返回分页所需信息##

public class PageResult {
    //满足条件的总记录数
    private int count;
    //当前页数
    private int pageNo;
    //每页显示的条数
    private int pageSize;
    //总页数
    private int pageCount;
    //内容
    private uLt reslts;  
 //get和set方法省了

}

看看数据库提供了什么分页功能

SELECT * FROM user ORDER BY userId ASC limit 1,10

这表示从第一个开始,一共有十个。看见数据库提供的功能,可以更清楚的写页面分页
写一个分页的方法传入第几页,和一页显示多少条,
可以根据第几页和每页条数知道开始的第几条(PageNo-1)*pageSize

public List<User> getUserListPage(int PageNo, int pageSize) {
    List<User> users =new ArrayList<User>();
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        conn = DBConnectionUtil.CreateConnection();
        String sql = "SELECT * FROM user ORDER BY userId ASC limit ?,?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1,(PageNo-1)*pageSize);
        ps.setInt(2,pageSize);
        rs = ps.executeQuery();
        while (rs.next()) {
            User user = new User();
            user.setUserId(rs.getInt("userid"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            users.add(user);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBConnectionUtil.closeAll(rs, ps, conn);
    }

    return users;

}

  • 后台的分页就实现了,可以写个测试类调用分页方法看看是否存在错误 无误后,开始向页面传值了。
  • 写个分页信息显示的Servlet的 我们写了个PageResult现在可以用起来了
  • 一开始加载页面是肯定没有传值所有默认开始为1,每页10条 把值都赋给PageResult
  • 注意总页数是总条数除以每页数,有余数进一
@WebServlet(name = "UsersServlet",urlPatterns = {"/userPage"})
public class UsersServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int pageNo =1;
    int pageSize =10;
    String pageNoStr =request.getParameter("pageNO");
    String pageSizeStr =request.getParameter("pageSize");
    if(pageNoStr!=null){
        pageNo=Integer.valueOf(pageNoStr);

    }
    if(pageSizeStr!=null){
        pageSize=Integer.parseInt(pageSizeStr);
    }


    UserService userService =new UserServiceImpl();
    List<User> users =userService.getUserListPage(pageNo,pageSize);
    int count =userService.getUsersCount();

    PageResult pageResult =new PageResult();
    pageResult.setPageNo(pageNo);
    pageResult.setPageSize(pageSize);
    pageResult.setResults(users);
    pageResult.setCount(count);
    if (count%pageSize!=0){
        pageResult.setPageCount(count/pageSize);
    }else {
        pageResult.setPageCount(count/pageSize+1);
    }

    response.setCharacterEncoding("UTF-8");
    System.out.println(pageResult);
    request.setAttribute("pageResult",pageResult);
    try {
        request.getRequestDispatcher("/users.jsp").forward(request,response);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

数据都传输到页面了,现在需要页面处理数据

  • 对PageResult中。Results遍历得到页面信息 Index.index 只能显示页面条数序号,全部信息的序号要加上前面的总条数
    ${(pageResult.pageNo-1)*pageResult.pageSize+index.index}

    ###下面的分页操作需要一些逻辑,和代码拼接 ###
    如果页数很多会显示不全,所有我们只取10个页码
    页码的内容是变化的
    上一页和下一页就比较简单的可以实现了参数上加一,减一

  • 开始页数int start =pageNO-5<= 0?1:pageNO-5;

  • 结束页数 int end= start+10大于pageCount? start+10: pageCount;

<table>
    <tr>

        <td>序号</td>
        <td>username</td>
        <td>password</td>
        </tr>

    <c:forEach var="user" items="${pageResult.results}" varStatus="index">
        <tr>

            <td>${(pageResult.pageNo-1)*pageResult.pageSize+index.index}</td>
            <td>${user.username}</td>
            <td>${user.password}</td>
         </tr>
    </c:forEach>
</table>

<%
    PageResult pageResult = (PageResult) request.getAttribute("pageResult");
    int pageNO =pageResult.getPageNo();
    int pageCount =pageResult.getPageCount();

    int start =pageNO-5<= 0?1:pageNO-5;
    int end= start+10<pageCount? start+10: pageCount;

    if(pageNO >1){
        %>
        <a href="userPage?pageNO=1">首页</a>
        <a href="userPage?pageNO=<%=pageNO-1%>">上一页</a>

    <%
    }
    for(int i=start;i<end;i++){
        %>
    <a style="color:<%=(i==pageNO?"red":"")%>" href="userPage?pageNO=<%=i%>">第<%=i%>页</a>
<%
    }
    if(pageNO<pageCount){
         %>
        <a href="userPage?pageNO=<%=pageNO+1%>">上一页</a>
        <a href="userPage?pageNO=<%=pageCount%>">首页</a>
       <%
    }
%>
<form action="userPage">
    第<input type="text"name="pageNO" value="${pageResult.pageNo}">页
    <input type="submit" value="确定">
</form>
一共有<span>${pageResult.count}</span>

###归根结底分页功能的实现逻辑上很简单,后端把分页信息封装在一个对象中,把对象给前端,前端处理信息显示并个分页按钮herf赋上url+页码参数 点击再次请求服务器就可以了 ###

猜你喜欢

转载自blog.csdn.net/IManiy/article/details/82709532
今日推荐