面向对象的分页封装操作

来源:互联网 发布:江苏运时数据 杨平良 编辑:程序博客网 时间:2024/05/21 14:52

面向对象的分页封装操作

在写分页之前我们要知道分页需要的几个参数值,分别为总页数,总记录数,每页显示的记录数

因为是一个类的封装,所以要封装一个每页显示的信息,并用list集合显示,类名为Page.java,封装的属性分别为:

    public static final Integer PAGESIZE = 5;

    private Integer countPage;// 总页数

    private Integer countSize;// 总记录数

    private List list;// 每页显示的信息

我们可以在此类中类初始化的时候计算出总页数,并判断当前页,因为是封装的一个工具类,所以在使用的时候要根据不同的类查询出所对应的记录的总条数,这就要传一个参数,为表名。并在构造方法中算出总页数和总记录数。

// 封装分页的相关信息

    public static final Integer PAGESIZE = 5;

    private Integer countPage;// 总页数

    private Integer countSize;// 总记录数

    private List list;// 每页显示的信息

    // 封装当前页信息

    private Integer nowPage;

    // 表名做参数

    public Page(Integer nowPage, String tableName, String where) {

       this.where = where;

       Connection conn = (Connection) JdbcUtil.getConn();

       String sql = "select count(*) c from " + tableName + " " + where;

 

       try {

           PreparedStatement pstmt = conn.prepareStatement(sql);

           ResultSet rs = pstmt.executeQuery();

           if (rs.next()) {

              this.countSize = rs.getInt("c");

              this.countPage = this.countSize %this.PAGESIZE == 0 ? this.countSize

                     / this.PAGESIZE

                     : this.countSize / this.PAGESIZE + 1;

              if (nowPage <= 1) {

                  this.nowPage = 1;

              } else if (nowPage >= this.countPage) {

                  this.nowPage = this.countPage;

              } else {

                  this.nowPage = nowPage;

              }

           }

           JdbcUtil.realese(rs, pstmt);

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

 剩下的私有变量要生成get和set方法。

注:在拼接的时候要注意有空格,比如:

    tableName + " " + where;之间必须有空格

最终的目的是查询出当前页的信息并显示,在dao的超接口中添加一个方法,为:

//查询当前页信息的方法

    List<T> findNowPageInfo(int nowPage,int pageSize);

并在AdminsDaoImpl中实现,实现的是查询当前页的信息:

    public List<Admins> findNowPageInfo(int nowPage,int pageSize) {

       List<Admins> entities = new ArrayList<Admins>();

       conn = JdbcUtil.getConn();

       String sql = "select id,name,pass from admins limit ?,?";

       try {

           pstmt = conn.prepareStatement(sql);

           int index = 1;

           pstmt.setObject(index++, (nowPage - 1) * pageSize);

           pstmt.setObject(index++, pageSize);

           rs = pstmt.executeQuery();

           while (rs.next()) {

              Admins entity = new Admins();

              entity.setId(rs.getInt("id"));

              entity.setName(rs.getString("name"));

              entity.setPass(rs.getString("pass"));

              entities.add(entity);

           }

           JdbcUtil.realese(rs, pstmt);

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return entities;

}

下面来分析如何使用上面的方法了,当在点击查看管理员的事件时,会跳转到servlet层去处理,当第一次点击时,可以先设一个参数为1,通过给Page.java的类赋值,来调用查询某一页的记录并到到Page中的list集合中,并放到作用域中,代码如下:

public void findAll(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 获取当前页的信息

       String npage = request.getParameter("nowPage");

       int nowPage = 1;

       if ("".equals(npage) || npage == null) {

       } else {

           nowPage = Integer.parseInt(npage);

       }

       Page page = new Page(nowPage, "admins", where);

       List<Admins> entities = adminsService.findNowPageInfo(

              page.getNowPage(), Page.PAGESIZE, where);

       page.setList(entities);

       request.setAttribute("page", page);

    request.getRequestDispatcher("/WEB-INF/admin/listAdmins.jsp").forward(request, response);

}

当单击上一页、下一页,末页的时候,会传个参数到上面的servlet中并从数据库中查询出来,在jsp的页面中的代码为:

<div>

              <span> <a

                  href="${pageContext.request.contextPath}/adminsServlet.do?oper=all&nowPage=1">首页</a>

              </span>   

              <span> <a

                  href="${pageContext.request.contextPath}/adminsServlet.do?oper=all&nowPage=${page.nowPage-1}">上一页</a>

              </span>

              <span> <a

                  href="${pageContext.request.contextPath}/adminsServlet.do?oper=all&nowPage=${page.nowPage+1}">下一页</a>

              </span>

              <span> <a

                  href="${pageContext.request.contextPath}/adminsServlet.do?oper=all&nowPage=${page.countPage}">末页</a>

              </span>

              <span style="color: red;">

                  当前页是第${page.nowPage}页,总共${page.countSize}记录 </span>

           </div>

 

其实这样的分页也和以前没有什么区别,不同点就是它更加的面向对象了,运用的操作其实都一样。今天讲了一下,就分享一下吧!也是有收获滴!

原创粉丝点击