javaWeb_08(分页)

一、数据库分页:

1、要实现分页要用到伪列 rownum
2、伪列不能作用于大于符号 也不能作用于between...and
3、因此,将伪列-->明列(实列) 实际上就是取个别名

万能公式:
(pageIndex-1)*pageSize+1------pageIndex*pageSize

--先编号,后排序
select * from (
select a.nid,a.nbt,a.nzz,rownum as rid from tb_xw a where nbt like '%王%' order by nid desc
) b where b.rid between 1 and 5

--理应先排序 后编号
select * from(
select a.*,rownum as rid from (
select nid,nbt,ntp from tb_xw where nbt like '%%'  order by nid desc
) a
) b where b.rid between 6 and 10

二、javaWeb的分页:

分页显示的步骤: 确定每页显示的数据数量, 计算显示的页数, 编写SQL语句. 

dao方法:

/**
	 * 分页第一版
	 * @param pageIndex 第几页
	 * @return 新闻的集合
	 */
	public List<News> getAll(int pageIndex){
		List<News> ls=new ArrayList<News>();
		int pageSize =5;
		int a=(pageIndex-1)*pageSize+1;
		int b=pageIndex*pageSize;
		try {
			con=DBHelper.getCon();//创建连接
			String sql="select * from (\r\n" + 
					"select a.nid,a.nbt,a.nzz,rownum as rid from tb_xw a  order by nid desc\r\n" + 
					") b where b.rid between ? and ?";//定义sql语句
			ps=con.prepareStatement(sql);//获得执行对象
			//给占位符赋值
			ps.setInt(1, a);
			ps.setInt(2, b);
			rs=ps.executeQuery();//获取结果集
			//遍历结果集
			while(rs.next()) {
				//实例化一个新闻对象
				News n=new News();
				//給对象赋值
				n.setNid(rs.getInt(1));
				n.setNbt(rs.getString(2));
				n.setNzz(rs.getString(3));
				//加到集合中 勿忘
				ls.add(n);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.myClose(con, ps, rs);
		}
		return ls;
	}
	
	/**
	 * 分页第二版
	 * @param pageIndex  第几页
	 * @return 新闻的集合
	 */
	public List<News> getAll(int pageIndex,int pageSize){
		List<News> ls=new ArrayList<News>();
		//公式 找规律
		int a=(pageIndex-1)*pageSize+1;
		int b=pageIndex*pageSize;
		try {
			con=DBHelper.getCon();//创建连接
				String sql="select * from(\r\n" + 
						"select a.*,rownum as rid from (\r\n" + 
						"select nid,nbt,ntp from tb_xw  order by nid desc\r\n" + 
						") a\r\n" + 
						") b where b.rid between ? and ?";//定义sql语句
				
			
			ps=con.prepareStatement(sql);//获得执行对象
			//给占位符赋值
			ps.setInt(1, a);
			ps.setInt(2, b);
			rs=ps.executeQuery();//获取结果集
			//遍历结果集
			while(rs.next()) {
				//实例化一个新闻对象
				News n=new News();
				//給对象赋值
				n.setNid(rs.getInt(1));
				n.setNbt(rs.getString(2));
				n.setNzz(rs.getString(3));
				//加到集合中 勿忘
				ls.add(n);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.myClose(con, ps, rs);
		}
		return ls;
	}
	
	
	
	
	/**
	 * 带模糊查询的分页
	 * @param pageIndex 第几页
	 * @param pageSize 每页多少条记录
	 * @param xl  选择的标题
	 * @param te 关键字
	 * @return 新闻的集合
	 */
	public List<News> getAll(int pageIndex,int pageSize,String xl,String te){
		List<News> ls=new ArrayList<News>();
		//公式 找规律
		int a=(pageIndex-1)*pageSize+1;
		int b=pageIndex*pageSize;
		try {
			con=DBHelper.getCon();//创建连接
			String sql="";
			if(xl!=null) {
				 sql+="select * from(\r\n" + 
						"select a.*,rownum as rid from (\r\n" + 
						"select nid,tid,nbt,nzz from tb_xw where "+xl+" like '%"+te+"%'  order by nid desc\r\n" + 
						") a\r\n" + 
						") b where b.rid between ? and ?";//定义sql语句
				
			}else {
				 sql+="select * from(\r\n" + 
						"select a.*,rownum as rid from (\r\n" + 
						"select nid,tid,nbt,nzz from tb_xw   order by nid desc\r\n" + 
						") a\r\n" + 
						") b where b.rid between ? and ?";//定义sql语句
			}
			
			ps=con.prepareStatement(sql);//获得执行对象
			//给占位符赋值
			ps.setInt(1, a);
			ps.setInt(2, b);
			rs=ps.executeQuery();//获取结果集
			//遍历结果集
			while(rs.next()) {
				//实例化一个新闻对象
				News n=new News();
				//給对象赋值
				n.setNid(rs.getInt(1));
				n.setNbt(rs.getString(2));
				n.setNzz(rs.getString(3));
				//加到集合中 勿忘
				ls.add(n);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.myClose(con, ps, rs);
		}
		return ls;
	}
	
	/**
	 * 获取总行数
	 * @param str 表名等
	 * @return  行数
	 */
	public int getRows(String str) {
		int n=0;
		try {
			con=DBHelper.getCon();
			String sql="select count(*) from "+str;
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();
			if(rs.next()) {
				n=rs.getInt(1);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.myClose(con, ps, rs);
		}
		return n;
	}

界面的:

<%
    
    request.setCharacterEncoding("utf-8");//这转译不了就用下面的破碎重组
    //取模糊查询的关键字
    String title=request.getParameter("title");
    
    if(title==null){
    	title="";//相当于查询全部
    }
     String xl=request.getParameter("xx");
   
    
    //破碎重组 用title.getBytes()拿到的字节数组,  用它以前的编码方式: iso-8859-1 将title破碎成字节数组,再用utf-8重组成字符串
    //title=new String(title.getBytes("iso-8859-1"),"utf-8");
    //jdbc连接Oracle 查询新闻的信息:新闻编号 标题 作者
    
        //地址栏传参: ?键=值&键=值
        
        //调用方法
        NewsDao nd=new NewsDao();
        int pageIndex=1;//当前的页码
        int pageSize=5;
        //接收pid
        String pid=request.getParameter("pid");
        if(pid!=null){//说明点击了"首页,上一页,下一页,末页"
        	pageIndex=Integer.parseInt(pid);//改变页码
        }
        //计算最大页面
        //拿到总行数
         int rows=nd.getRows("tb_xw where "+xl+" like '%"+title+"%'");//15
         int max=rows/pageSize;//15/5=3
         if(rows%pageSize!=0){//除不尽=有余数
             max++;//多加一页
        	 
         }
        /*
                           分析: 
             1、拿到总行数 15
             2、计算页码 15/5=3
             3、特殊清空 15/5=3   +1--> 除不尽就+1
        */
        
        List<News> ls= nd.getAll(pageIndex, pageSize, xl, title);
        //循环遍历
        for(News n:ls){
        	
    %>
      <li><a href="/q4/news/read.jsp?nid=<%=n.getNid()%>"><%=n.getNbt() %></a> <span> 作者: <%=n.getNzz() %> &#160;&#160;&#160;&#160;
       <a href='/q4/news/update.jsp?nid=<%=n.getNid()%>'>修改</a> &#160;&#160;&#160;&#160; 
       <a href='/q4/news/dodelete.jsp?nid=<%=n.getNid() %>' onclick='return clickdel()'>删除</a> </span>
      </li>
      <%
          }
      
      %>
      <p align="right"> 当前页数:[<%=pageIndex %>/<%=max %>]&nbsp;
      <a href="admin.jsp?pid=1&xx=<%=xl %>&title=<%=title %>">首页</a>
       <a href="admin.jsp?pid=<%=pageIndex>1?pageIndex-1:1%>&xx=<%=xl %>&title=<%=title %>">上一页</a> 
       <a href="admin.jsp?pid=<%=pageIndex<max?pageIndex+1:max %>&xx=<%=xl %>&title=<%=title %>">下一页</a>
       <a href="admin.jsp?pid=<%=max %>&xx=<%=xl %>&title=<%=title %>">末页</a> </p>
    </ul>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb 中实现分页功能,你可以按照以下步骤进行操作: 1. 首先,在页面上显示数据的地方,需要获取总记录数。你可以通过数据库查询语句或其他方式获取到总记录数。 2. 然后,确定每页显示的记录数和当前页码。你可以设定一个固定的每页记录数,比如每页显示 10 条记录。当前页码可以通过用户点击页面上的页码按钮或其他方式获取。 3. 计算总页数。将总记录数除以每页记录数,然后向上取整即可得到总页数。 4. 计算当前页的起始记录索引。通过当前页码和每页记录数来计算起始记录索引。假设每页显示 10 条记录,当前页码为 1,则起始记录索引为 0;当前页码为 2,则起始记录索引为 10,依此类推。 5. 编写 SQL 查询语句,使用 LIMIT 关键字来限制查询结果的范围。例如,在 MySQL 中可以使用以下语句来实现分页查询: ```sql SELECT * FROM your_table LIMIT start_index, page_size; ``` 其中,`start_index` 是起始记录索引,`page_size` 是每页记录数。 6. 执行查询并将结果展示在页面上。 7. 在页面上显示分页导航条,包括上一页、下一页、首页、末页等按钮。根据当前页码和总页数来确定按钮的状态和链接。 8. 处理用户点击分页按钮的请求。根据用户点击的按钮类型(上一页、下一页、首页、末页等),计算新的当前页码,然后重新执行查询并更新页面内容。 通过以上步骤,你就可以在 JavaWeb 中实现分页功能了。当然,具体的实现方式可能会根据你使用的框架或工具有所不同,但基本思路是一样的。祝你成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值