编辑器:idea
数据库:Oracle
浏览器:谷歌
要实现这种功能:带有模糊查询的分页
Oracle分页sql语句
select * from (select a.*,rownum myid from news a)b where myid between ? and ?;
每页最多展示的条数/总页数 : pageSize = 5;
当前页码 : pagelndex
每页开始的条数 : start
每页结束的条数 : end
公式:
页码 开始条数 结束条数
1 1=(页码-1)pageSize 5=当前页码每页最多展示的条数
2 6=(页码-1)pageSize 10=当前页码每页最多展示的条数
3 11=(页码-1)pageSize 15 =当前页码每页最多展示的条数
方法:1模糊查询和分页
/**
* 带有模糊查询和分页的方法
* @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 tb_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.obj(con, rs, ps);
return listNews;
}
方法2:查询总数据量:
/**
* 求tb_news表里数据可展示的总页码
* @return
* @throws Exception
*/
public int getMaxPage(String str) throws Exception{
/*
计算总页数
如果有11条
3页
总数据: rows
页大小: pageSize=5
最大页码: maxPage
maxPage=rows/pageSize
if(rows%pageSize!=0){//有余数<pageSize
maxPage++;//多加一页
}
10/5=2
11/5=2
怎么判断有余数
if(11%5!=0){
2++;
}
*/
con=DBhelper.getcon();
sql="select count(0) from tb_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.obj(con, rs, ps);
return maxPage;
}
可以把获取的数据集合listNews报错到request作用域里面
session.setAttribute(“a”,“1”)
session.getAttribute(“a”)
request的语法和session一样并且都是返回object
request.setAttribute(“a”,“1”)
request.getAttribute(“a”)
区别:
session:
只要在有效期内它可以在页面随意跳转,与转发和重定向没有一点关系
request:
-
如果说从一个页面重定向到另一个页面如果使用重定向则获取不到数据,只有通过转发才能把数据带到下一个页面
-
如果通过重定向的话则会在重定向之前数据就会消失了
request:
优点:
如果往request里面保存数据它不会把数据一直传递下去,它的安全性高
比如在A.jsp重定向到B页面那就只有B页面能获取数据其他页面获取不到
package com.zking.servlet;
import com.zking.dao.NewsDao;
import com.zking.entity.News;
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 java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class pagingServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//设置编码
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);
}
//新闻dao类
NewsDao nd = new NewsDao();
//获取内置对象
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保存到
req.setAttribute("pageIndex",pageIndex);
//把模糊查询关键字str传到前端
req.setAttribute("str",str);
//通过转发到主界面
req.getRequestDispatcher("/admin/admin.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
JSP页面代码:
<%--
翻页:
当点击翻页按钮的时候,跳转到加载数据的pagingServlet里面,并将页码变量传过去
--%>
<p align="center">
<a href="<%=request.getContextPath()%>/pagingServlet.do?str=<%=str%>&pageIndex=1">首页</a>
<a href="<%=request.getContextPath()%>/pagingServlet.do?str=<%=str%>&pageIndex=<%=pageIndex>1?-1:1 %>">上一页</a>
当前页数:[<%=pageIndex%>/<%=maxPage%>]
<a href="<%=request.getContextPath()%>/pagingServlet.do?str=<%=str%>&pageIndex=<%=pageIndex<maxPage?pageIndex+1:maxPage %>">下一页</a>
<a href="<%=request.getContextPath()%>/pagingServlet.do?str=<%=str%>&pageIndex=<%=maxPage %>">末页</a>
</p>
这样简单的分页就完成了