alt

alt

一、为什么要分页?
  • 客户端: 如果数据量太多,都显示在同一个页面的话,会因为页面太长严重影响到用户的体验,也不便于操作,也会出现加载太慢的问题。
  • 服务端: 如果数据量太多,可能会造成内存溢出,而且一次请求携带的数据太多,对服务器的性能也是一个考验。
二、分页优点
  • 数据清晰直观
  • 不受数据量限制
  • 页面不再冗长
三、分页如何实现?
  • 分页前:返回全部的学生信息集合List,页面读取
select * from stu
  • 分页后:按照要求的页面大小进行返回,每次翻页的时候只从数据库里检索出本页需要的数据
四、分页查询---limit关键字
  • 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
  • 例子
-- 查询展示前10条数据
SELECT * FROM employee LIMIT 10;
-- 查询第一页数据,展示10条
SELECT * FROM employee LIMIT 0, 10;
-- 查询第6-15条数据
SELECT * FROM employee LIMIT 5, 10;  # Retrieve rows 6-15

分页规律:

-- 查询第一页数据,展示10条
SELECT * FROM employee LIMIT 0, 10;
-- 查询第二页,展示10条
SELECT * FROM employee LIMIT 10, 10;
-- 查询第三页,展示10条
SELECT * FROM employee LIMIT 20, 10;
-- 查询第N页,,展示10条
SELECT * FROM employee LIMIT (n-1)*10, 10;
SELECT * FROM employee LIMIT (pageNo-1)*pageSize , pageSize;

五、功能实现

alt

1、获取指定大小的学生数据集合的方法---StudentDao

2、计算显示数据的总数量的方法---StudentDao

#count函数

select count(1) from stu;

count(id),count(1),count(*)

3、计算页数---单独声明一个工具类,便于复用

4、页面展示、超链接(丐中丐版本)

  • 四个超链接
  • 一个文本框
  • 一个按钮
  • 文字+三个变量

相关代码:

   //分页获取学生信息列表
    public List<Student> getPageList(int pageNo,int pageSize){
        List<Student> stuList=new ArrayList<Student>();
        //select * from tableName where 条件 limit (当前页码-1)*页码容量,页面容量
        //limit用法:第一个参数指的是要开始的地方,第二个参数指每页显示多少条数据(注意:第一页要用0表示)
        String sql="SELECT * FROM stu ORDER BY id LIMIT ?,?";
        pageNo = (pageNo - 1) * pageSize;
        Object[] params={pageNo,pageSize};
        ResultSet rs=this.Select(sql, params);
        try {
            while(rs.next()){
                int id1=rs.getInt("id");
                String name=rs.getString("name");
                String pic=rs.getString("pic");
                int sex=rs.getInt("sex");
                int age=rs.getInt("age");
                int grade=rs.getInt("grade");
                String introduce=rs.getString("introduce");

                student =new Student(id1,name,pic,sex,age,grade,introduce);

                stuList.add(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            this.close();
        }
        return stuList;
    }
    
 //获取学生信息总数量
    public int getTotalCount(){
        int totalCount=0;
        String sql="select count(1) from stu";
        Object[] params={};
        ResultSet rs=this.Select(sql, params);
        try {
            while(rs.next()){
                totalCount=rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            this.close();
        }
        return totalCount;
    }
 
  • 工具类PageSupport
public class PageSupport {
    //当前页码-来自于用户输入
    private int currentPageNo = 1;

    //总数量(表)
    private int totalCount = 0;

    //页面容量
    private int pageSize = 0;

    //总页数-totalCount/pageSize(+1)
    private int totalPageCount = 1;

    public int getCurrentPageNo() {

        return currentPageNo;
    }

    public void setCurrentPageNo(int currentPageNo) {
        if(currentPageNo > 0){
            this.currentPageNo = currentPageNo;
        }
    }

    public int getTotalCount() {

        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        if(totalCount > 0){
            this.totalCount = totalCount;
            //设置总页数
            this.setTotalPageCountByRs();
        }
    }
    public int getPageSize() {

        return pageSize;
    }

    public void setPageSize(int pageSize) {
        if(pageSize > 0){
            this.pageSize = pageSize;
        }
    }

    public int getTotalPageCount() {

        return totalPageCount;
    }

    public void setTotalPageCount(int totalPageCount) {

        this.totalPageCount = totalPageCount;
    }

    public void setTotalPageCountByRs(){
        if(this.totalCount % this.pageSize == 0){
            this.totalPageCount = this.totalCount / this.pageSize;
        }else if(this.totalCount % this.pageSize > 0){
            this.totalPageCount = this.totalCount / this.pageSize + 1;
        }else{
            this.totalPageCount = 0;
        }
    }

}

分页功能按钮

 <div align="center">
            共<%=totalCount %>条记录&nbsp;&nbsp; <%=pageIndex %>/<%=totalPage %>页
            <a href="List1.jsp?pageIndex=1">首页</a>
            <a href="List1.jsp?pageIndex=<%=pageIndex-1%>">上一页</a>
            <a href="List1.jsp?pageIndex=<%=pageIndex+1%>">下一页</a>
            <a href="List1.jsp?pageIndex=<%=totalPage%>">最后一页</a>
            跳转至 <input type="text" name="inputPage" id="inputPage" class="page-key" />页
            <button type="button" class="page-btn" onClick="">GO</button>
    </div>
六、JS和Java互相传值问题

1、js变量获取jsp页面中java代码的变量值

var JS变量名 = <%=JAVA变量名 %>  
var num=<%=i%>;

2、java代码获取js变量的值。

  • 在JSP中,Java部分是在服务器端执行的,js部分是在客户端的浏览器执行的,二者完全不相干,因此直接在JSP页面上是无法在js、java和HTML变量之间进行调用的。
  • 解决方案:将js变量放到form中的一个隐藏域中,然后提交表单给要调用变量的页面,这个页面可以是本身,示例如下:
//list.jsp页面: 
	<script type="text/javascript"> 
    	var test1 = "111"; //定义js变量 
    	document.form.test2.value = test1;
   		//将js变量的值放到form中的一个隐藏域中 
        var formObj = document.getElementById("passForm");
        formObj.submit();
	</script> 
    
    <form  method="post" action="aa.jsp" id ="passForm"> 
    	<input id ="test2" type = "hidden" name="test2"> 
 	</form>  
     
     
  //list.jsp页面中的Java代码:
  <%
    request.setCharacterEncoding("utf-8");
    String txtMsg = request.getParameter("test2"); 
    out.println(txtMsg);
  %> 

注:也可以为不同页面