根据上次的新闻发布展示页面效果,进行分页操作:
分页实现:
实现数据的分页显示,需要以下几个关键步骤:
①确定每页显示的总页数
②计算显示的总页数
③编写SQL语句
一.页面效果图
1、创建util包,Page类,定义相关属性并进行封装:
package cn.news.util; import java.util.List; import cn.news.entity.NewsDetail; public class Page { //当前页 private int pageIndex; //页面记录数 private int pageSize; //本业显示真实数据 private List<NewsDetail> list; //总页数 private int totalPages; //总记录数 private int totalRecords; public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List<NewsDetail> getList() { return list; } public void setList(List<NewsDetail> list) { this.list = list; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; } }
2、在Dao实现类NewsDetailDaoImpl定义获取新闻当前页的数据的方法getonePage,并植入两个参数pageIndex, pageSize
@Override public List<NewsDetail> getonePage(int pageIndex, int pageSize) throws Exception { List<NewsDetail> list=new ArrayList<NewsDetail>(); String sql="select top "+pageSize+" * from newsDetails where newsId not in(select top "+(pageIndex-1)*pageSize+" newsId from newsDetails)"; ResultSet rs=executeQuery(sql); if(rs!=null) { while(rs.next()) { NewsDetail news=new NewsDetail(); news.setNewsId(rs.getInt("newsId")); news.setNewsTitle(rs.getString("newsTitle")); news.setNewsContent(rs.getString("newsContent")); news.setNewsCreateDate(rs.getDate("newsCreateDate")); news.setNewsAuthor(rs.getString("newsAuthor")); news.setNewsCategoryId(rs.getInt("newsCategoryId")); list.add(news); } } return list; }
3、在NewsServlet类中把数据传递给Jsp页面
package cn.news.servlet; 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 cn.news.entity.NewsDetail; import cn.news.impl.NewsDetailDaoImpl; import cn.news.util.Page; public class NewsServlet extends HttpServlet { /** */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } /** */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //实例化dao NewsDetailDaoImpl dao=new NewsDetailDaoImpl(); try { Page page=new Page(); //默认3条数据 int pageSize=3; page.setPageSize(pageSize); //当前页 int myindex=1; String pageIndex=request.getParameter("pageIndex"); if(pageIndex!=null&&(!pageIndex.equals(""))) { myindex=Integer.parseInt(pageIndex); }else { myindex=1; } //当前页赋值 page.setPageIndex(myindex); int mytotalPages=0; int totalPages=dao.getAllCount(); if(totalPages%pageSize==0) { mytotalPages=totalPages/pageSize; } else { mytotalPages=totalPages/pageSize+1; } page.setTotalPages(mytotalPages); //泛型数据 List<NewsDetail> list= dao.getonePage(page.getPageIndex(), pageSize); page.setList(list); request.setAttribute("list", page); request.getRequestDispatcher("/index.jsp").forward(request, response); //List<NewsDetail> list=dao.getAllNews(); } catch (Exception e) { e.printStackTrace(); } } }
4、在index.jsp页面得到泛型集合,并获取当前页数和下一页
<% Page page2=(Page)request.getAttribute("list"); for(NewsDetail item:page2.getList()) { %> <li><a href='newspages/news_read.jsp'><%=item.getNewsTitle() %></a><span><%=item.getNewsCreateDate() %></span></li> <% } %> <p align="right"> 当前页数:[<%=page2.getPageIndex() %>/<%=page2.getTotalPages() %>] <a href="<%=path %>/servlet/NewsServlet?pageIndex=<%=page2.getPageIndex()+1%>">下一页</a> <a href="#">末页</a> </p> </ul>