【Web】分页简单实现

web分页

 

为什么需要分页?

一、数据方面的原因

大量查询的数据耗时比较严重。

二、增强用户使用体验需求

用户更方便的查询和展示他所需要的数据。

 

常见分页方式:传统分页方式和下拉式分页方式。

采用传统的分页方式,可以明确的获取数据信息,如有多少条数据,分多少页显示。

采用下拉式分页方式,一般无法获取明确的数据数量相关的信息,但是在分页操作以后,仍然可以看到之前查询的数据。

 

常见的分页实现方式

1.      使用subList()实现分页。

List subList(int fromIndex,int toIndex)

返回列表中指定的fromIndex(包含)和 toIndex (不包括)之间的部分视图。

2.      使用SQL语句实现分页

利用数据库自带的分页语法,使用分页语句,获取分页数据(例如mysql数据库使用limit关键字,oracle中使用rownum关键字等)

Mysql

-         select * from students limit0,10   从第0条开始查,一共查询10条记录。

3.      使用hibernate框架进行分页。

创建Query或者Criteria对象,查询时,设置firstResult(从第几条开始查)和maxResults(查询几条记录)属性。

String hql = “ from Student”;

Query q = session.createQuery(hql);

q.setFirstResult(0);

q.setMaxResults(10);

List l = q.list();

 

实现方式

优点

缺点

使用场景

subList

简单、易用

效率低

无法按需批量获取数据

SQL语句

简单、直接、效率高

数据库兼容性差

不要求数据库兼容

Hibernate框架

面向对象,兼容性强

复杂查询性能低

兼容不同数据库

 

1.      使用sublist实现分页。


创建model层

学生对象 Student类

public class Student implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2448260736229612919L;//序列化id
	private int id;//学生记录的id
	private String stuName;//姓名
	private int age;//年龄
	private int gender;//性别
	private String address;//地址
	public Student(){
		super();
	}
	public Student(int id, String stuName, int age, int gender, String address) {
		super();
		this.id = id;
		this.stuName = stuName;
		this.age = age;
		this.gender = gender;
		this.address = address;
	}
	/*
	 * 构造函数,将查询到的Map类型的数据构造成学生对象
	 */
	public Student(Map map){
		this.id = (int)map.get("id");
		this.stuName = (String)map.get("stu_name");
		this.age = (int)map.get("age");
		this.gender = (int)map.get("gender");
		this.address = (String)map.get("address");
	}
}
分页对象 Pager类

public class Pager implements Serializable{
	/**
	 * 序列化id
	 */
	private static final long serialVersionUID = 7569566861340703188L;
	private int pageSize;//每页显示多少条记录
	private int currentPage;//当前第几页数据
	private int totalRecord;//一共多少条记录
	private List dataList;//要显示的数据
	private int totalPage;//总页数
	public Pager() {
		super();
	}
	public Pager(int pageSize, int currentPage, int totalRecord,
			int totalPage,List dataList) {
		super();
		this.pageSize = pageSize;
		this.currentPage = currentPage;
		this.totalRecord = totalRecord;
		this.totalPage = totalPage;
		this.dataList = dataList;
	}
	public Pager(int pageNum,int pageSize,List sourceList){
		if(sourceList.size() ==0 ||sourceList == null){
			return;
		}
		//总记录条数
		this.totalRecord = sourceList.size();
		//每页显示多少条记录
		this.pageSize = pageSize;
		//获取总页数
		this.totalPage = this.totalRecord /this.pageSize;
		if(this.totalRecord % this.pageSize != 0){
			this.totalPage = this.totalPage +1;
		}
		//当前第几页数据
		if(this.totalPage < pageNum){
			this.currentPage = this.totalPage;
		}else{
			this.currentPage = pageNum;
		}
		
		//起始索引
		int fromIndex = this.pageSize*(this.currentPage-1);
		//结束索引
		int toIndex;
		if(this.pageSize * this.currentPage >this.totalRecord){
			toIndex = this.totalRecord;
		}else{
			toIndex = this.pageSize * this.currentPage;
		}
		this.dataList = sourceList.subList(fromIndex, toIndex);
	}
}
数据库工具类 JdbcUtil.java

public class JdbcUtil {
	//表示定义数据库的用户名
	private static String USERNAME;
	//定义数据库的密码
	private static String PASSWORD;
	//定义数据库的驱动信息
	private static String DRIVER;
	//定义访问数据库的地址
	private static String URL;
	//定义数据库的连接
	private Connection connection;
	//定义sql语句的执行对象
	private PreparedStatement pstmt;
	//定义查询返回的结果集合
	private ResultSet resultSet;
	static{
		loadConfig();
	}
	/**
	 * 加载数据库配置文件,并给相关的属性赋值,配置信息写在配置文件中,方便管理
	 */
	public static void loadConfig(){
		//路径 WEB-INF\classes\jdbc.properties
		InputStream inStream = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
		Properties prop = new Properties();
		try{
			prop.load(inStream);
			USERNAME = prop.getProperty("jdbc.username");
			PASSWORD = prop.getProperty("jdbc.password");
			DRIVER= prop.getProperty("jdbc.driver");
			URL = prop.getProperty("jdbc.url");
		}catch(Exception e){
			throw new RuntimeException("读取用户配置文件出错",e);
		}
	}
	/**
	 * 获取数据库连接
	 */
	public Connection getConnection(){
		try {
			Class.forName(DRIVER);//注册驱动
			//获取连接对象
			connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}
	
	/**
	 * 执行更新操作
	 * sql sql语句
	 * params 执行参数
	 * return 执行结果
	 */
	public boolean updateByPreparedStatement(String sql,List params)throws SQLException{
		boolean flag = false;
		int result = -1;//表示用户执行添加删除和修改的时候所影响数据库的行数
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		//填充sql语句中的占位符
		if(params != null && !params.isEmpty()){
			for(int i=0;i < params.size();i++){
				pstmt.setObject(index ++, params.get(i));
			}
		}
		result = pstmt.executeUpdate();
		flag = result >0 ? true : false;
		return flag;
	}
	/**
	 * 执行查询操作
	 * sql sql语句
	 * params 执行参数
	 */
	public List> findResult(String sql,List params)throws SQLException{
		List> list = new ArrayList>();
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		/*
		 * 填充查询语句的参数
		 */
		if(params != null && !params.isEmpty()){
			for(int i = 0;i map = new HashMap();
			for(int i= 0;i
数据库配置文件

jdbc.username=root
jdbc.password=limeng
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/pager

创建Dao层,数据操作对象

接口 StudentDao.java

public interface StudentDao {
	/**
	 * 根据查询条件,查询学生分页信息
	 * @param searchModel 封装查询条件
	 * @param pageNum 查询第几条数据
	 * @param pageSize 显示多少数据
	 * @return
	 */
	public Pager findStudent(Student searchModel,int pageNum,int pageSize);
}
Dao层接口实现类 SublistStudentDaoImpl.java

public class SublistStudentDaoImpl implements StudentDao{
	@Override
	public Pager findStudent(Student searchModel, int pageNum,
			int pageSize) {
		/*
		 * 根据条件获取所有数据
		 */
		List allStudentList = getAllStudent(searchModel);
		/*
		 * 根据参数创建分页对象
		 */
		Pager pager = new Pager(pageNum,pageSize,allStudentList);
		return pager;
	}
	/*
	 * 获取所有数据
	 */
	private List getAllStudent(Student searchModel){
		List result = new ArrayList();
		List paramList = new ArrayList();
		String stuName = searchModel.getStuName();
		int gender = searchModel.getGender();
		StringBuilder sql = new StringBuilder("select * from t_student where 1=1");
		if(stuName != null && !stuName.equals("")){
			sql.append(" and stu_name like ?");
			paramList.add("%"+stuName+"%");
		}
		if(gender == Constant.GENDER_FEMALE || gender== Constant.GENDER_MALE){
			sql.append(" and gender = ?");
			paramList.add(gender);
		}
		JdbcUtil jdbcUtil = null;
		try {
			jdbcUtil = new JdbcUtil();
			jdbcUtil.getConnection();
			List> mapList = jdbcUtil.findResult(sql.toString(), paramList);
			if(mapList != null){
				for(Map map : mapList){
					Student s = new Student(map);
					result.add(s);
				}
			}
		} catch (SQLException e) {
			throw new RuntimeException("查询所有数据异常!",e);
		}finally{
			if(jdbcUtil != null){
				jdbcUtil.releaseConn();
			}
		}
		return result;
	}
}
创建Service层,调用Dao层 
  

public class SublistStudentServiceImpl implements StudentService{
	
	private StudentDao studentDao;
	public SublistStudentServiceImpl(){
		//创建service实现类时,初始化dao对象
		studentDao = new SublistStudentDaoImpl();
	}
	@Override
	public Pager findStudent(Student searchModel, int pageNum,
			int pageSize) {
		Pager result = studentDao.findStudent(searchModel, pageNum, pageSize);
		return result;
	}
	public StudentDao getStudentDao() {
		return studentDao;
	}
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
}
创建Servlet,接收参数,调用Service层

public class SublistServlet extends HttpServlet {
	//创建service对象
	private StudentService studentService = new SublistStudentServiceImpl();
	public SublistServlet() {
		super();
	}
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 设置编码格式,防止解析中文参数乱码
		 */
		request.setCharacterEncoding("utf-8");
		/* 接收request参数
		 * 学生姓名
		 */
		String stuName = request.getParameter("stuName");
		/*
		 * 性别,默认是0,表示全部,不论男女
		 */
		int gender = Constant.DEFAULT_GENDER;
		String genderStr = request.getParameter("gender");
		if(genderStr != null && !"".equals(genderStr.trim())){
			gender = Integer.parseInt(genderStr);// 获取学生性别
		}
		/*
		 * 当前请求第几页
		 */
		int pageNum = Constant.DEFAULT_PAGENUM;
		String pageNumStr = request.getParameter("pageNum");
		//参数校验,是否是数字
		if(pageNumStr != null && !StringUtil.isNum(pageNumStr)){
			request.setAttribute("errorMsg", "参数输入错误");
			request.getRequestDispatcher("sublistStudent.jsp").forward(request,
					response);
			return;
		}
		if(pageNumStr != null && !"".equals(pageNumStr.trim())){
			pageNum = Integer.parseInt(pageNumStr);//获取当前请求第几页
		}
		/*
		 * 每页显示多少条数据
		 */
		int pageSize = Constant.DEFAULT_PAGE_SIZE;
		String pageSizeStr = request.getParameter("pageSize");
		if(pageSizeStr != null && !"".equals(pageSizeStr.trim())){
			pageSize = Integer.parseInt(pageSizeStr);// 每页显示多少条记录
		}
		// 组装查询条件
		Student searchModel = new Student();
		searchModel.setStuName(stuName);
		searchModel.setGender(gender);
		// 调用service查询结果
		Pager result = studentService.findStudent(searchModel,
				pageNum, pageSize);
		// 返回结果到页面
		request.setAttribute("result", result);
		request.getRequestDispatcher("sublistStudent.jsp").forward(request,
				response);
	}
}
Jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>



学生信息

<%
	// 获取请求的上下文
	String context = request.getContextPath();
%>


	
${errorMsg }
姓名   性别   

学生信息列表:

查询的结果不存在
姓名 性别 年龄 家庭地址

共${result.totalRecord }条记录共${result.totalPage }页  当前第${result.currentPage }页   首页   下一页   上一页   尾页









你可能感兴趣的:(Java)