zoukankan      html  css  js  c++  java
  • JavaWeb学习(18):实现分页

    分页是什么?

    简单来说就是,内容太多,一个页面是放不下太多东西的,这时候分页闪亮登场。
    我们常见的 首页、上一页、下一页、尾页都是通过分页来实现的。
    

    实现方式:

    要实现分页,必须知道  某一页的 数据 从哪里开始 到哪里结束。
    值得注意的一点是:不同的数据库实现分页的sql语句不同,(本文主要介绍,MySql)
    
    页面大小:每页显示的数据量
    
    假设每页显示10条数据
    
    mysql分页:
    mysql:从0开始计数
    0		0		9
    1		10		19
    2		20		29
    n		n*10	      (n+1)*10-1
    
    结论:
    分页:
    第n页的数据:  第(n-1)*10+1条  -- 第n*10条
    MYSQL实现分页的sql:
    limit  开始,多少条
    第0页
        select * from student limit 0,10 ;
    第1页
        select * from student limit 10,10 ;
    第2页
        select * from student limit  20,10 ;
    第n页
        select * from student limit n*10,10
    
    mysql的分页语句:
    
    select * from student limit 页数*页面大小,页面大小
    

    实现分页的 5 个变量:

    5个变量(属性)			
    1.数据总数	100	103					 (查数据库,select count(*)..)									
    2.页面大小(每页显示的数据条数)20				          (用户自定义)
    3.总页数 							 (程序自动计算)
       	总页数 = 100/20  =数据总数/页面大小
       	总页数 = 103/20 = 数据总数/页面大小+1
            --->
            总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
    
    								
    4.当前页(页码)							 (用户自定义)								
    5.当前页的对象集合(实体类集合):每页所显示的所有数据 (10个人信息)
    List<Student>							  (查数据库,分页sql)	
    

    Code:

    本代码是在 优化三层 代码的基础上进行的修改,在此只附上修改部分的代码,其余部分参考 其他几篇文章。
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        
    <%@ page import = "java.util.List" %>
    <%@ page import = "org.entity.Student" %>
    <%@ page import = "org.entity.Page" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    		<% 
    			// 增加 一个标记,用作提示是否增加成功
    			String error = (String)request.getAttribute("error");
    			if(error != null ) {
    				if(error.equals("addError")){
    					out.print("增加失败");
    				} else if(error.equals("successAdd")){
    					out.print("增加成功");
    				}
    			}
    		%>
    		<!-- 表格布局实现显示用户的各个信息 -->
    		<table border = "1">
    			<tr>
    				<th>学号</th>
    				<th>姓名</th>
    				<th>年龄</th>
    				<th>性别</th>
    				<th>地址</th>
    				<th>操作</th>
    			</tr>
    		<!-- 因为用户是动态的,所以我们选择用循环进行动态添加 -->
    				<% 
    				
    					// 我们将实现分页的 5 个变量放到一个实体类中,那么前台获取的也是一个实体类
    					// request.getAttribute() 返回值是一个 Object的对象,所以在这里需要进行强制转换
    					Page p = (Page)request.getAttribute("pages");
    					
    					
    					for(Student student:p.getStudents()) {
    				%>	 
    					<tr>
    						<!-- 将学号设置成一个超链接,点击即可实现查看用户的详细信息 -->
    						<td> <a href = "QueryStudentStudent?sno=<%=student.getSno() %>"><%=student.getSno() %></a>  </td>
    						<td> <%=student.getName()%></td>
    						<td> <%=student.getAge() %></td>
    						<td> <%=student.getSex() %></td>
    						<td> <%=student.getSad() %></td>
    						<td> <a href = "DeleteStudentServlet?sno=<%=student.getSno()%>">删除 </a></td>
    					</tr>
    				 <% 
    				 	}
    					
    				 %>
    			
    		</table>
    		<!-- 超链接到 add.jsp 进行 增加用户 -->
    		<a href = "add.jsp">注册</a>
    		
    		<%
    			// Mysql 实现分页是从 0 开始的
    			// 首页时只显示 下一页和尾页
    			if(p.getCurrentPage() == 0) {
    		%>
    				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()+1 %>">下一页</a>
    				<a href = "queryStudentByPage?currentPage=<%=p.getTotalPage() - 1%>">尾页</a>
    		<% 
    			// 尾页时只显示上一页和首页
    			}else if(p.getCurrentPage() == p.getTotalPage() - 1) {
    		
    		%>
    				<a href = "queryStudentByPage?currentPage=0">首页</a>
    				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()-1 %>">上一页</a>
    		<% 
    			// 其余页面四个链接均显示
    			} else {
    		%>
    				<a href = "queryStudentByPage?currentPage=0">首页</a>
    				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()-1 %>">上一页</a>
    				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()+1 %>">下一页</a>
    				<a href = "queryStudentByPage?currentPage=<%=p.getTotalPage() - 1 %>">尾页</a>
    		<% 
    			}
    		
    		%>
    		
    		
    </body>
    </html>
    

    queryStudentByPage.java(Serlvet部分)

    package org.servlet;
    
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.entity.Page;
    import org.entity.Student;
    import org.service.IStudentService;
    import org.service.impl.StudentServiceImpl;
    
    
    @WebServlet("/queryStudentByPage")
    public class queryStudentByPage extends HttpServlet {
    	private static final long serialVersionUID = 1L;
       
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    			
    		IStudentService studentService = new StudentServiceImpl();
    		// 获取数据总数
    		int totalCount = studentService.getTotalCount();
    		String cPage = request.getParameter("currentPage");
    		// 第一次访问这个页面是 NULL
    		if(cPage == null) cPage = "0";
    		// 当前页面是第几页
    		int currentPage = Integer.parseInt(cPage);
    		// 页面大小
    		String pSize = request.getParameter("select");
    		if(pSize == null) pSize = "3";
    		int pageSize = Integer.parseInt(pSize);
    
    		// 用户的数据信息(根据页面查询学生)
    		List<Student> students = studentService.queryStudentPage(currentPage, pageSize);
    		
    		// 将 5 个变量封装成一个实体类(实际上 4 个变量就可以了,页面数量可以计算出来)
    		
    		Page p= new Page();
    		// 注意顺序
    		p.setCurrentPage(currentPage);
    		p.setTotalCount(totalCount);
    		p.setPageSize(pageSize);
    		p.setStudents(students);
    		// 将数据域放到 request 中,传输到前台,前台通过 Key 取 Value
    		request.setAttribute("pages", p);
    		
    		request.getRequestDispatcher("index.jsp").forward(request, response);
    	}
    
    	
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    
    }
    
    

    StudentServiceImpl(Service)

    添加下列方法(添加时先实现接口):
    
            public List<Student> queryStudentPage(int currentPage, int pageSize) {
    		return stu.queryStudentByPage(currentPage, pageSize);
    	}
    	@Override
    	// 获取数据总数
    	public int getTotalCount() {
    		return stu.getTotalCount();
    	}
    

    StudentDaoImpl(Dao)

     添加下列方法(添加时先实现接口):
    
    @Override
    	// 查询总数据量
    	public int getTotalCount() {
    		String sql = "select count(1) from student";
    		int count = DBUtil.getTotalCount(sql);
    		return count;
    	}
    
    	@Override
    	// 分页查询
    	public List<Student> queryStudentByPage(int currentPage, int pageSize) {
    		// 分页查询语句
    		// 第一个占位符:当前页面 * 页面大小
    		// 第二个占位符:页面大小
    		String sql = "select * from student limit ?,?";
    		// 当前页面和页面大小都是由前台传过来的
    		Object[] pstams = {currentPage * pageSize,pageSize};
    		List<Student> students = new  ArrayList<>();
    		ResultSet rs = DBUtil.excucateQuery(sql, pstams);
    		try {
    			while(rs.next()) { 
    				Student student = new Student(rs.getInt("sno"),rs.getString("sname"),rs.getInt("sage"),rs.getString("ssex"),rs.getString("sad"));
    				students.add(student);	
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		// 将查询结果返回到 Service
    		return students;
    	}
    

    Page(实体类--封装分页的 5 个变量)

    package org.entity;
    
    import java.util.List;
    
    //分页帮助类
    public class Page {
    //	当前页  currentPage
    	private int currentPage;
    //	页面大小 pageSize
    	private int pageSize ;
    
    //	总数据 totalCount
    	private int totalCount;
    //	总页数   totalPage
    	private int totalPage ;
    	
    //	当前页的数据集合  students
    	
    	private List<Student> students;
    
    	public Page() {
    	}
    
    	public Page(int currentPage, int pageSize, int totalCount, int totalPage, List<Student> students) {
    		this.currentPage = currentPage;
    		this.pageSize = pageSize;
    		this.totalCount = totalCount;
    		this.totalPage = totalPage;
    		this.students = students;
    	}
    
    	public int getCurrentPage() {
    		return currentPage;
    	}
    
    	public void setCurrentPage(int currentPage) {
    		this.currentPage = currentPage;
    	}
    
    	public int getPageSize() {
    		return pageSize;
    	}
    	/*
    	 * 总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
    	 * 
    	 * 当我们调换用了 数据总数的set() 和 页面大小的set()以后,自动计算出 总页数
    	 * 务必注意顺序:先set 数据总数   再set 页面大小
    	 */
    	public void setPageSize(int pageSize) {
    		this.pageSize = pageSize;
    		//自动计算出 总页数
    	
    //		总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
    		this.totalPage =this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:totalCount/this.pageSize+1; 
    	}
    
    	public int getTotalCount() {
    		return totalCount;
    	}
    
    	public void setTotalCount(int totalCount) {
    		this.totalCount = totalCount;
    	}
    
    	public int getTotalPage() {
    		return totalPage;
    	}
    
    	//给总页数赋值
    //	public void setTotalPage(int totalPage) {
    //		this.totalPage = totalPage;
    //	}
    
    	public List<Student> getStudents() {
    		return students;
    	}
    
    	public void setStudents(List<Student> students) {
    		this.students = students;
    	}
    	
    }
    
    

    其他部分:

    之前我们访问时面向的是查询全部,现在就需要改成访问查询分页的Servlet:
    例如在增加用户时,改成这个:
    

    其他修改,删除界面都需要改动,否则会出现 Null
    

    效果:

    访问时我们需要访问的是  queryStudentByPage
    

    首页:

    下一页:

    尾页:

    客官留步:

    如果疑问,可随时联系ME. 如需要源代码,欢迎随时联系ME.

  • 相关阅读:
    【配置属性】—Entity Framework 对应表字段的类型的设定配置方法
    EntityFrame Work 6 Code First 配置字段为varchar 类型
    Echarts xAxis boundaryGap
    JavaScript Array和string的转换
    SQL server :主键和外键
    SQL server :“增删改查” 之 “改”
    SQL server :“增删改查” 之 “删”
    SQL server :“增删改查” 之 “增”
    Oracle不能连接故障排除【TNS-12541:TNS:无监听程序】
    LNMP平台部署及应用
  • 原文地址:https://www.cnblogs.com/prjruckyone/p/12674619.html
Copyright © 2011-2022 走看看