为什么需要分页?
因为我们要把数据库成千上万条的数据一页一页的展现给用户,而不是长短不一的展示给用户,这就是需要分页的原因。
package com.zking.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.zking.dao.NewsDao;
import com.zking.entity.News;
/**
* 分页数据加载界面
* @author 14916
*
*/
public class LoadDataServlet 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");
// 把从前台获取的页码myPageIndex赋给当前页码pageIndex
if(null != myPageIndex) {
pageIndex = Integer.parseInt(myPageIndex);
}
//调用模糊查询方法获取数据
NewsDao nd = new NewsDao();
// 2.获取内置对象
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
//获取前台传来的模糊查询关键字
String str = req.getParameter("str");
if(null == str) {
str = "";
}
//调用分页的方法
List<News> listNews = nd.query(pageIndex,str);
// 把获取的数据集合listnews 保存到request作用域里
req.setAttribute("listNews", listNews);
// 把当前页码pageIndex保存到 request作用域里
req.setAttribute("pageIndex", pageIndex);
//把模糊查询关键字保存到request作用域里面
req.setAttribute("str", str);
// 使用转发转发到amdin.jsp里
req.getRequestDispatcher("/admin/admin.jsp").forward(req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 求news表里面数据可展示的总页码
* @return str 模糊查询字段的数据有几条
* @throws Exception
*/
public int getMaxPage(String str) throws Exception{
con = DBhelper.getCon();
sql = "select count(0) from news where title 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;
}
/**
* 模糊查询分页的方法,每页最多展示五条数据
* @param pageIndex 当前页码
* @param str 模糊查询关键字
* @return
* @throws Exception
*/
public List<News> 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();
//我使用的是Oracle
sql = "select * from (select a.*,rownum myid from news a where a.title 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;
}
<a href="<%=request.getContextPath()%>/loadDataServlet.do?str=<%=str %>&pageIndex=1">首页</a>
//这里可以看到我在下一页和上一页使用了三元运算符;
<a href="<%=request.getContextPath()%>/loadDataServlet.do?str=<%=str %>&pageIndex=<%=pageIndex>1?pageIndex-1:1 %>">上一页</a>
当前页数:[<%=pageIndex %>/<%=maxPage %>]
<a href="<%=request.getContextPath()%>/loadDataServlet.do?str=<%=str %>&pageIndex=<%=pageIndex<maxPage?pageIndex+1:maxPage%>">下一页</a>
<a href="<%=request.getContextPath()%>/loadDataServlet.do?str=<%=str %>&pageIndex=<%=maxPage%>">末页</a> </p>