Java web 笔记 分页功能

编辑器: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:

  1. 如果说从一个页面重定向到另一个页面如果使用重定向则获取不到数据,只有通过转发才能把数据带到下一个页面

  2. 如果通过重定向的话则会在重定向之前数据就会消失了

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%>]&nbsp;
          <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>

这样简单的分页就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值