JSP和servlet的分页查询
2016-03-21 00:00
190 查看
摘要: 有时查询大量的数据时,需要分页来查询避免一次查询太多数据而使速度太慢并且页面信息量太庞大。
1 介绍
由于在项目里采用的是分层的设计,所以这里包括dao,业务组件,servlet等。这里使用mysql,每种dbms的分页查询可能不一样。2 dao
@Override public List<T> readByLimit(int pageNo, int countPerPage,String sortColumn,int sortType) throws DaoException { if(pageNo != 0 && countPerPage != 0) { Connection connection = null; PreparedStatement pstm = null; ResultSet set = null; try { connection = C3P0Util.getConnection(); String sql = "select * from "+table_name; if(sortType == IGenericDao.ASC)//判断升序还是降序 { sql = sql+" order by "+sortColumn+" asc limit ?,?;"; } else { sql = sql+" order by "+sortColumn+" desc limit ?,?;"; } pstm = connection.prepareStatement(sql); int start = (pageNo - 1) * countPerPage;//起始条数 pstm.setInt(1,start); pstm.setInt(2, countPerPage); set = pstm.executeQuery(); /** * 创建对象列表 */ if(set != null) { List<T> list = new ArrayList<>(); Class tempType = type; while(set.next()) { Object temp = tempType.newInstance();//实例化一个类用于获取field的值 Field[] fields = tempType.getDeclaredFields(); for(int i=0;i<fields.length;i++) { fields[i].setAccessible(true);//设置field可访问 fields[i].set(temp, set.getObject(fields[i].getName()));//设置field的值 } list.add((T)temp); } return list; } throw new DaoException("Empty result"); } catch (Exception e) { e.printStackTrace(); throw new DaoException("Query Error"); } finally{ C3P0Util.close(connection, pstm, set); } } else { throw new DaoException("Arguments Error"); } }
3 业务方法
@Override public List<News> getNewsByPage(int pageNo, int countPerPage) throws ServiceException { try { List<News> newsList = newsDao.readByLimit(pageNo, countPerPage, "publishTime", IGenericDao.DESC); return newsList; } catch (DaoException e) { e.printStackTrace(); throw new ServiceException(e.getMessage()); } }
4 servlet
package com.lin.news.controller; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lin.news.domain.News; import com.lin.news.exception.ServiceException; import com.lin.news.service.impl.NewsServiceImpl; import com.lin.news.service.intf.INewsService; public class LoadAllNewsController extends HttpServlet { private static final long serialVersionUID = 1L; private INewsService newsService = new NewsServiceImpl(); public static final int COUNT_PER_PAGE = 10;//每页显示的条数 //@SuppressWarnings("null") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Integer pageNo = Integer.parseInt(request.getParameter("pageNo"));//获得当前页数 request.setAttribute("pageNo", pageNo); try { //List<News> newsList = newsService.getAllNews(); List<News> newsList = newsService.getNewsByPage(pageNo, COUNT_PER_PAGE); request.setAttribute("newsList", newsList); /** * 得到最后一页的页数 */ Integer endPage = newsService.count(); if(endPage % COUNT_PER_PAGE == 0) { endPage = endPage / COUNT_PER_PAGE; } else { endPage = endPage / COUNT_PER_PAGE + 1; } request.setAttribute("endPage", endPage); } catch (ServiceException e) { e.printStackTrace(); } finally{ request.getRequestDispatcher("/WEB-INF/admin/rootIndex.jsp").include(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
4 JSP
在翻页的超链接里面把当前页数作为参数传递给servlet即可。<div class="col-md-12 column"> <!-- 新闻列表 --> <c:choose> <c:when test="${newsList != null && newsList.size() != 0 }"> <table class="table"> <thead> <tr> <th>新闻标题</th> <th>发布时间</th> <th>城市</th> <th>分类</th> <th>编辑</th> <th>是否审核</th> </tr> </thead> <tbody> <c:forEach items="${newsList }" var="news"> <c:choose> <c:when test="${news.examined == 0 }"> <tr class="error"> </c:when> <c:when test="${news.examined == 1 }"> <tr class="success"> </c:when> </c:choose> <td><a href="root/newsDescription?id=<c:out value="${news.id}"/>"><c:out value="${news.title }"></c:out></a></td> <td><fmt:formatDate value="${news.publishTime }" pattern="yyyy年MM月dd日 HH:mm:SS" /></td> <td><c:out value="${news.city }"></c:out></td> <td><c:choose> <c:when test="${news.category == 1 }">社会</c:when> <c:when test="${news.category == 2 }">国际</c:when> <c:when test="${news.category == 3 }">军事</c:when> <c:when test="${news.category == 4 }">娱乐</c:when> <c:when test="${news.category == 5 }">时尚</c:when> <c:when test="${news.category == 6 }">科技</c:when> <c:when test="${news.category == 7 }">财经</c:when> <c:when test="${news.category == 8 }">体育</c:when> <c:when test="${news.category == 9 }">旅游</c:when> <c:when test="${news.category == 10 }">美食</c:when> <c:when test="${news.category == 11 }">汽车</c:when> <c:when test="${news.category == 12 }">教育</c:when> <c:when test="${news.category == 13 }">其他</c:when> </c:choose></td> <td><a href="root/listNewsByEditorId?id=<c:out value="${news.editorId }"/>"><c:out value="${news.editor }"></c:out></a></td> <td><c:choose> <c:when test="${news.examined == 0 }">未审核</c:when> <c:otherwise>已审核</c:otherwise> </c:choose></td> </tr> </c:forEach> </tbody> </table> <hr> <p align="center"> <a href="root/loadAllNews?pageNo=1" class="btn btn-default">第一页</a> <a <c:if test="${pageNo == 1 }">onclick="return disabled()"</c:if> href="root/loadAllNews?pageNo=<c:out value="${pageNo - 1}"/>" class="btn btn-default">上一页</a> <a <c:if test="${pageNo == endPage }">onclick="return disabled()"</c:if> href="root/loadAllNews?pageNo=<c:out value="${pageNo +1}"/>" class="btn btn-default">下一页</a> <a href="root/loadAllNews?pageNo=<c:out value="${endPage }"/>" class="btn btn-default">最后一页</a> <script type="text/javascript"> function disabled() { return false } </script> </p> </c:when> <c:otherwise> <h3>没有新闻</h3> </c:otherwise> </c:choose> </div>