java分页技术

在实际项目中,经常要用到很多分页技术,特别是数据量比较大的时候,为了直观便捷的展示出数据,而不是在一个页面上把所有数据全部展现出来(会显得很冗余,页面繁重,并且不好看),所以用分页技术比较好。

我们可以利用mysql数据库里面的limit来限制显示的数据,从而达到分页。同样也可以用oracle里面的rownum来限制,也可以用到mybatis中自带的RowBounds分页技术

本文的页面是使用jsp页面(没有过多考虑页面,注重分页的实现),没有使用框架,使用了Java开发中的三层架构(web,service,dao),并且使用JDBC技术来处理数据库,从而达到分页的效果


首先需要的是两个bean类  一个Student类  用来封装Student对象 一个page类 里面包含了页面中的一些属性(比如 当前页码 每页的大小等等)

Student.java

package page.bean;

import java.io.Serializable;

/**
 * 普通的学生bean类
 * @author liujd
 *
 */
public class Student implements Serializable{
	private static final long serialVersionUID = 6724577147867445725L;

	private Integer id;

    private String name;

    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}


Page.java

package page.bean;

import java.io.Serializable;

/**
 * 首先定义一个分页的bean类
 * 用来存储和分页有关的属性
 * @author liujd
 *
 */
public class Page implements Serializable{

	private static final long serialVersionUID = 2024980639990498085L;
	
	//当前页 就是当前是在第多少页
	private Integer pageNow;
	//需要分页的数据总数
	private Integer total;
	//每页多少条数据
	private Integer pageSize;
	//一共有多少页
	private Integer pageTotal;
	//每页数据开始条数
	private Integer pageBegin;
	//每页数据结束条数
	private Integer pageEnd;
	
	public Integer getPageNow() {
		return pageNow;
	}
	public void setPageNow(Integer pageNow,Integer total, Integer pageSize) {
		this.total = total;
		this.pageSize = pageSize;
		this.pageNow = pageNow;
		this.pageTotal = total % pageSize == 0 ? total/pageSize : total/pageSize +1;
		this.pageBegin = (pageNow-1) * pageSize;
		this.pageEnd = pageNow * pageSize;
	}
	public Integer getTotal() {
		return total;
	}
	public void setTotal(Integer total) {
		this.total = total;
	}
	public Integer getPageSize() {
		return pageSize;
	}
	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}
	public Integer getPageTotal() {
		return pageTotal;
	}
	public void setPageTotal(Integer pageTotal) {
		this.pageTotal = pageTotal;
	}
	public Integer getPageBegin() {
		return pageBegin;
	}
	public void setPageBegin(Integer pageBegin) {
		this.pageBegin = pageBegin;
	}
	public Integer getPageEnd() {
		return pageEnd;
	}
	public void setPageEnd(Integer pageEnd) {
		this.pageEnd = pageEnd;
	}
}
然后是一个Servlet  用来接收前台页面中的关于页面的信息  并且返回查询到的学生列表以及处理后的有关Page的信息

StudentServlet.java

package page.web;

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 javax.servlet.http.HttpSession;

import page.bean.Page;
import page.bean.Student;
import page.service.StudentService;

@WebServlet("/listStudent")
public class StudentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
      
	StudentService service = new StudentService();
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String pageNowString = request.getParameter("pageNow");
		String pageSizeString = request.getParameter("pageSize");
		int pageNow = Integer.parseInt(pageNowString);
		int total = service.getStudentCount();
		int pageSize = Integer.parseInt(pageSizeString);
		
		
		Page page = new Page();
		page.setPageNow(pageNow, total, pageSize);
		List<Student> list = service.getStudentList(page);
		
		request.setAttribute("list", list);
		request.setAttribute("pageNow", page.getPageNow());
		request.setAttribute("total", total);
		request.getRequestDispatcher("studentList.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
service层用来调用dao层的方法

package page.service;

import java.util.List;

import page.bean.Page;
import page.bean.Student;
import page.dao.StudentDao;
/**
 * service层方法
 * @author liujd
 *
 */
public class StudentService {
	//获取Dao层对象
	StudentDao dao = new StudentDao();
	/**
	 * 获取学生列表
	 * @param page
	 * @return
	 */
	public List<Student> getStudentList(Page page) {
		return dao.getStudentList(page);
	}
	/**
	 * 获取学生总数
	 * @return
	 */
	public int getStudentCount() {
		return dao.getStudentCount();
	}
}
最后是与数据库进行交互的dao层 使用的是JDBC技术

特别要注意的是里头limit的用法

limit m,n 其中m表示偏移量  就是从哪条信息开始查  n表示从偏移量开始要查多少条  

有关limit的使用详情请见http://blog.youkuaiyun.com/liujiding/article/details/74939944

StudentDao.java

package page.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import page.bean.Page;
import page.bean.Student;
/**
 * dao层方法  
 * @author liujd
 *
 */
public class StudentDao {
	/**
	 * 从数据库里面来获取学生列表
	 * @param page
	 * @return
	 */
	public List<Student> getStudentList(Page page) {
		PreparedStatement statement = null;
		Connection connection = null;
		List<Student> list = null;
		try {
			connection = getConnection();
			//获取preparedStatement对象
			statement = 
					connection.prepareStatement("select * from student limit ?,?");
			
			//设置值
			statement.setInt(1, page.getPageBegin());
			
			//这里第二个参数设置为pageSize的原因:
			//mysql中limit的用法  第一个参数是偏移量  也就是从哪个位置开始查询  第二个参数不是结束位置  而是从偏移量开始要查询的长度
			statement.setInt(2, page.getPageSize());
			
			//得到结果集
			ResultSet result = 
					statement.executeQuery();
			//声明一个Student对象 以及 一个List集合 用来封装结果
			list =  new ArrayList<Student>();
			//遍历结果集 并且封装成Student对象 添加到List集合中
			while(result.next()){
				Student student = new Student();
				student.setId(result.getInt(1));
				student.setName(result.getString(2));
				student.setAge(result.getInt(3));
				list.add(student);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}finally{
			//记得关流!!!
			if(statement != null){
				try {
					statement.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			} 
			if(connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
	 * 获取学生总数
	 * @return
	 */
	public int getStudentCount(){
		Connection connection = getConnection();
		try {
			PreparedStatement statement = connection.prepareStatement("select count(1) from student");
			ResultSet resultSet = statement.executeQuery();
			int result = 0;
			while(resultSet.next()) {
				result = resultSet.getInt(1);
			}
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 建立数据库连接并且获取数据
	 * @return
	 */
	private Connection getConnection() {
		//1.加载驱动  这里用的mysql
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//获取连接对象
			return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "liujd", "1234");
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
}
studentList.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>student——list</title>
<script type="text/javascript">
	 /* window.onload = function(){
		var pageSize = document.getElementById("pageSize").value;
		location.href="listStudent?pageNow=1&pageSize="+pageSize;
	 } */
	function changePage(){
		var change = document.getElementById("changePage").value;
		var pageSize = document.getElementById("pageSize").value;
		if(change <1){
			change = 1;
			alert("不能调到小于1页");
		}
		
		var total = document.getElementById("total").innerHTML;
		var pageSize = document.getElementById("pageSize").value;
		var total = Number(total);
		var pageSize = Number(pageSize);
		var result = total%pageSize == 0 ? (total/pageSize) :  (Math.floor(total/pageSize)+1);
		if(change > result) {
			change = result;
			alert("不能调到大于最后一页");
		}
		
		location="listStudent?pageNow="+change+"&pageSize="+pageSize;
	}
	function getForword() {
		var pageNow = document.getElementById("pageNow").innerHTML;
		var pageForword = Number(pageNow)-1;
		if(pageForword <1){
			pageForword = 1;
			alert("当前页是最前页");
		}
		console.log(pageForword);
		var pageSize = document.getElementById("pageSize").value;
		location="listStudent?pageNow="+pageForword+"&pageSize="+pageSize;
	}
	function getNext() {
		var pageNow = document.getElementById("pageNow").innerHTML;
		var total = document.getElementById("total").innerHTML;
		var pageSize = document.getElementById("pageSize").value;
		var pageNext = Number(pageNow)+1;
		var total = Number(total);
		var pageSize = Number(pageSize);
		console.log(total);
		console.log(pageSize);
		var result = total%pageSize == 0 ? (total/pageSize) :  (Math.floor(total/pageSize)+1);
		if(pageNext > result) {
			pageNext = result;
			alert("当前页是最后一页");
		}
		location="listStudent?pageNow="+pageNext+"&pageSize="+pageSize;
	}
</script>
</head>
<body>
<center>
<h3>学生列表</h3>
<table align="center" bgcolor="gray" border="1" bordercolor="#666699" cellspacing="0">
	<tr height="30" align="center">
	<td width="100" >id</td>
	<td width="100" >姓名</td>
	<td width="100" >年龄</td>
	</tr>
	<c:forEach items="${list}" var="stu">
	<tr height="30" align="center">
	<td width="100" background="red">${stu.id}</td>
	<td width="100" >${stu.name}</td>
	<td width="100" >${stu.age}</td>
	</tr>
	</c:forEach>
</table>
<span><input type="text" value="1" style="width: 15px" id="changePage" />页
<button onclick="changePage()">跳转</button>
 </span>
<button onclick="getForword()"><<</button>
第<span id="pageNow">${pageNow}</span>页
<button onclick="getNext()" >>></button>
共<span id="total">${total}</span>条
<span>
<select id="pageSize">
<option selected="selected" value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
</select>
条/页</span>
</center>
</body>
</html>
运行效果如下



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值