1.分页是什么?
分页(Paging):即有很多数据,我们就需要分页来分割数据,可提高整体运行性能,增强用户使用体验需求等
不使用分页将遇到的问题:
客户端问题:数据太多影响用户的体验感且也不方便操作查找,甚至出现加载太慢的问题。
服务器问题:数据太多会造成内存溢出,且对服务器的性能也不友好。
2.如何实现分页?2.1:分页的实现方式
利用Oracle数据库自带的rownum关键字来实现分页:
select * from (select a.*,rownum myid from 表名) b where myid between ? and ?;
2.2:所需变量totalCount:总数据条数,因数据库的数据可以变化,因此该数据需要从后台获取。totalPage:总页数,因总数据是从数据库中查询出来的,因此每页多少条数据都知道,所以要从后台获取。list: 每页数据,从后台获取的。currentPage:当前页,从前台获取,因每次用户需要点击不同的页数,传递过来的数据都是不一样的rows:每页放多少条数据,前后台都可获取,建议从后台获取start:首页end:末页
2.3:设计变量总页数 = 总条数 % 页面大小 == 0 ? 总条数 / 页面大小 : 总条数 / 页面大小 + 1
首页:start = (pageIndex - 1) * pageSize + 1;
末页:end = pageIndex * pageSize; || 尾页 = 总条数 % 页面大小 == 0 ? 总条数 - 页面大小 : 总条数 - 总条数 % 页面大小
上一页 = 当前页 - 1 > = 1 ? 当前页 - 1 : 1
下一页 = 当前页 + 1 <= 总页? 当前页 + 1 : 总页
2.4:编写dao包里面的分页方法public List2.5:设计Servlet包里面的加载数据页面query(int pageIndex,String str) throws Exception{ int pageSize=5;//页大小 int start=(pageIndex-1)*pageSize+1;//每页开始数据条数 int end=pageIndex* pageSize;//每页结束的数据条数 listNews=new ArrayList<>(); con=DBhelper.getCon(); sql="select * from (select a.*,rownum myid from news a where a.sid like '%"+str+"%') b where myid between ? and ?"; ps=con.prepareStatement(sql); ps.setInt(1, start); ps.setInt(2, end); rs=ps.executeQuery(); while(rs.next()) { news=new News(rs.getInt("nid"),rs.getInt("sid"),rs.getString("title"),rs.getString("author"), rs.getString("summary"),rs.getString("content"),null); listNews.add(news); } DBhelper.closeObj(con, ps, rs); return listNews; } public int getMaxPage(String str) throws Exception{ con =DBhelper.getCon(); sql="select count(0) from news where sid like '%"+str+"%'"; ps=con.prepareStatement(sql); rs=ps.executeQuery(); if(rs.next()){ maxPage=rs.getInt(1)/5; if(rs.getInt(1)%5!=0) { maxPage++; } } DBhelper.closeObj(con, ps, rs); return maxPage; }
public class LoaDataServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
// 1.设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//定义当前页码变量
int pageIndex=1;//默认展示第一页的数据
//获取前台传来的页码变量
String myPageIndex= req.getParameter("pageIndex");
// 2.获取out内置对象
PrintWriter out = resp.getWriter();
HttpSession session=req.getSession();
NewsDao nd = new NewsDao();
//把从前台获取的页码myPageIndex赋给当前页码pageIndex
if(null!=myPageIndex) {
pageIndex=Integer.parseInt(myPageIndex);
}
//获取前台传来的模糊查询关键字
String str=req.getParameter("str");
if(null==str) {
str="";
}
//调用分页方法
List listNews = nd.query(pageIndex,str);
//把获取到的数据集合listNews,保存到request作用域里面
req.setAttribute("listNews", listNews);
//把当前页码pageIndex保存到
req.setAttribute("pageIndex", pageIndex);
//把模糊查询关键字保存到request作用域里面
req.setAttribute("str", str);
//通过转发跳转到admin页面request作用域里面
req.getRequestDispatcher("/admin/admin.jsp").forward(req, resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.6:界面代码
<%
NewsDao nd = new NewsDao();
request.setCharacterEncoding("utf-8");
//获取request作用域里面的模糊查询关键字
String str=request.getAttribute("str").toString();
//获取news表里面数据可以展示的总页码
int maxPage = nd.getMaxPage(str);
//获取request作用域里面的listNews数据
List listNews = (List) request.getAttribute("listNews");
//获取request作用域里面把偶才能的当前页码变量
int pageIndex = Integer.parseInt(request.getAttribute("pageIndex").toString());
%>
-----------------------------------------------------------------------------------------
/loaDataServlet.do?str=<%=str %>&pageIndex=1">首页
/loaDataServlet.do?str=<%=str %>&pageIndex=<%=pageIndex > 1 ? pageIndex - 1 : 1%>">前一页
当前页数:[<%=pageIndex%>/<%=maxPage%>]
/loaDataServlet.do?str=<%=str %>&pageIndex=<%=pageIndex < maxPage ? pageIndex + 1 : maxPage%>">下一页
/loaDataServlet.do?str=<%=str %>&pageIndex=<%=maxPage%>">末页



