jsp中分页技术的实现

匿名 (未验证) 提交于 2019-12-03 00:11:01

分页目的:为了防止服务器一次性将数据库全部数据读出,提高效率。(数据库数据以文件形式存在,从硬盘读取速度慢)

需要使用到限制查询,限制查询的两种表示方法:
limit n:从0开始查询n条数据
limit(n,m):
n―:偏移量(每页显示的第一条数据)
m―:分页量(每页显示的数据条数)

设计需考虑:
当前分页数:currentPage
分页量:pageSize
偏移量:offset
数据总条数:pageTotal
总页数:pages

偏移量:int offset = (currentPage -1)* pageSize;
总页数: int pages= (int)Math.ceil(total*1.0 /pageSize);

分页技术的具体实现如下:

  • servlet中的处理
  • service中的处理
  • dao层的处理
  • utils的处理
  • .jsp文件的处理

StudentServlet (get请求中分页实现关键代码)

 case "look":                  //int currentPage = 1;                 int currentPage = req.getParameter("p")==null?1:Integer.parseInt(req.getParameter("p"));//页码值                 int pageSize = 10;//分页量                 List<Student> list =  ssi.queryPage(currentPage,pageSize);//分页后的数据                  int total= ssi.queryTotal();//总条数                 int pages= (int)Math.ceil(total*1.0 /pageSize);//总页数                  req.setAttribute("currentPage",currentPage);                 req.setAttribute("pages",pages);                 req.setAttribute("list",list);                 req.getRequestDispatcher("/WEB-INF/sms/stu/list.jsp").forward(req,resp);                 break;

StudentServiceImpl中关键代码

    @Override     public List<Student> queryPage(int currentPage, int pageSize) {         //拿到偏移量:  起始位置     ,从0开始        int offset = (currentPage -1)* pageSize;          return sdi. selectPage(offset,pageSize);     }      @Override     public int queryTotal() {         return sdi.selectTotal();     }

StudentDaoImpl中关键代码

 @Override     public List<Student> selectPage(int offset, int pageSize) {         String sql = "select * from students limit ?,?";         BeanListHandler<Student> handler = new BeanListHandler(Student.class);         Integer[] args = {offset,pageSize};         return DBUtil.select(sql,handler,args);     }      @Override     public int selectTotal() {         String sql = "select count(*) from students";          ScalarHandler<Long> handler = new ScalarHandler<>();         Integer[] args = {};         return DBUtil.select(sql,handler,args);     }

DBUtil中对查询的操作

 public static <T> List<T>  select(String sql, BeanListHandler<T> beanListHandler, Object... args){         List<T> list = null;         try {             list =  runner.query(sql,beanListHandler,args);          } catch (SQLException e) {             e.printStackTrace();         }         return list;     }       //longǿתint     public static int  select(String sql, ScalarHandler<Long> scalarHandler, Object... args){         int num = 0 ;         try {             num =  (int)runner.query(sql,scalarHandler,args).intValue();          } catch (SQLException e) {             e.printStackTrace();         }         return num;     } 

list.jsp中对页码部分的设置,采用booystrap设置的分页框架

需注意的是:左右两边界限的判断
左边界限:当currentPage-1=0时 显示第一页,否则显示当前页currentPage-1;
右边界限:当currentPage+1>pages 时 显示最大页即Pages,否则显示当前页currentPage+1;
对当前页添加激活颜色

 <tr>                     <td colspan="7">                         <nav aria-label="Page navigation">                             <ul class="pagination">                                 <li>                                     <a href="?a=look&p=${currentPage-1 == 0?1:currentPage-1}" aria-label="Previous">                                         <span aria-hidden="true">&laquo;</span>                                     </a>                                 </li>                                 <c:forEach begin="1" end="${pages}" var="i">                                     <li class="${i==currentPage ? 'active':''}"><a href="?a=look&p=${i}">${i}</a></li>                                 </c:forEach>                                  <li>                                     <a href="?a=look&p=${currentPage+1 > pages? pages:currentPage+1}" aria-label="Next">                                         <span aria-hidden="true">&raquo;</span>                                     </a>                                 </li>                             </ul>                         </nav>                     </td>                 </tr>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!