目录
通过jsp实现分页功能
回顾分页的sql语句
select * from (select a.*,rownum myid from news a) b where myid between ? and ?
首先需要声明几个变量:
每页最多展示的条数/页大小:pageSize = 5;
当前页码:pageIndex
每页开始的条数:start
每页结束的条数:end
分析逻辑:
页大小:pageSize
当前页码:pageIndex
页码 开始条数 结束条数
1 1=(1-1) * pageSize+1 5 = pageIndex * pageSize
2 6=(2-1) * pageSize+1 10
3 11=(3-1) * pageSize+1 15
......
dao方法
/**
* 带有模糊查询的分页方法,每页最多展示5条数据
* @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();
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;
}
/**
* 求news表里面数据可展示的总页码
* @return
* @throws Exception
*/
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;
}
处理数据servlet
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 {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取内置对象
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
//定义当前页码变量
int pageIndex = 1;//默认展示第一页的数据
//获取前台传来的页码变量
String myPageIndex = req.getParameter("pageIndex");
//把从前台获取的页码myPageIndex赋给当前页码pageIndex
if (null != myPageIndex) {
pageIndex = Integer.parseInt(myPageIndex);
}
NewsDao nd = new NewsDao();
//获取前台传来的模糊查询的关键字
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);
//把模糊查询str保存到 request 作用域里面
req.setAttribute("str", str);
//通过转发界面跳转到 admin 页面
req.getRequestDispatcher("/admin/admin.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
前端获取数据 传参
request.setCharacterEncoding("utf-8");
//调用查询所有新闻数据的方法
NewsDao nd = new NewsDao();
//获取request作用域里面的模糊查询关键字
String str = request.getAttribute("str").toString();
//获取news表里面数据可以展示的总页码
int maxPage = nd.getMaxPage(str);//调用求最大页码方法
//获取request作用域里面的listNews数据
List<News> listNews = (List)request.getAttribute("listNews");
//获取request作用域里面保存当前页码变量
int pageIndex = Integer.parseInt(request.getAttribute("pageIndex").toString());
最后,当点击翻页按钮的时候,跳转到加载数据的loadDataServlet里面,并且把页面变量传过
<p align="center">
<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>