JavaWeb Mysql简单分页

前言

JavaWeb学习中,分页是一个很容易遇到的问题,在这里做一个笔记,以作为以后的重新理解。

准备

首先需要创建一张表

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) DEFAULT NULL,
  `role` tinyint(4) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  `memo` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `state` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

向表中添加数据

INSERT INTO `user` VALUES ('9', 'xie', '123', '2', '1', '23', '小学生', '2018-05-10 10:26:30', '1');
INSERT INTO `user` VALUES ('10', 'admin', '123', '1', '1', '26', '超级管理员', '2018-05-02 10:26:49', '1');
INSERT INTO `user` VALUES ('20', 'jia', '123', '1', '2', '34', '普通管理员', '2018-05-16 14:22:14', '1');
INSERT INTO `user` VALUES ('21', 'zx', '123', '2', '1', '23', '张荥', '2018-05-16 15:37:58', '1');
INSERT INTO `user` VALUES ('22', 'quan', '123', '1', '1', '24', '普通管理员', '2018-05-17 16:05:09', '1');
INSERT INTO `user` VALUES ('23', 'xie1', '123', '2', '1', '23', '小学生', '2018-05-10 10:26:30', '1');
INSERT INTO `user` VALUES ('24', 'jia1', '123', '1', '2', '34', '普通管理员', '2018-05-16 14:22:14', '1');
INSERT INTO `user` VALUES ('25', 'zx1', '123', '2', '1', '23', '张荥', '2018-05-16 15:37:58', '1');
INSERT INTO `user` VALUES ('26', 'quan1', '123', '1', '1', '24', '普通管理员', '2018-05-17 16:05:09', '1');
INSERT INTO `user` VALUES ('27', 'xie2', '123', '2', '1', '23', '小学生', '2018-05-10 10:26:30', '1');
INSERT INTO `user` VALUES ('28', 'jia2', '123', '1', '2', '34', '普通管理员', '2018-05-16 14:22:14', '1');
INSERT INTO `user` VALUES ('29', 'zx2', '123', '2', '1', '23', '张荥', '2018-05-16 15:37:58', '1');
INSERT INTO `user` VALUES ('30', 'quan2', '123', '1', '1', '24', '普通管理员', '2018-05-17 16:05:09', '1');
INSERT INTO `user` VALUES ('31', 'xie3', '123', '2', '1', '23', '小学生', '2018-05-10 10:26:30', '1');
INSERT INTO `user` VALUES ('32', 'jia3', '123', '1', '2', '34', '普通管理员', '2018-05-16 14:22:14', '1');
INSERT INTO `user` VALUES ('33', 'zx3', '123', '2', '1', '23', '张荥', '2018-05-16 15:37:58', '1');
INSERT INTO `user` VALUES ('34', 'quan3', '123', '1', '1', '24', '普通管理员', '2018-05-17 16:05:09', '1');
INSERT INTO `user` VALUES ('35', 'xie4', '123', '2', '1', '23', '小学生', '2018-05-10 10:26:30', '1');
INSERT INTO `user` VALUES ('36', 'jia4', '123', '1', '2', '34', '普通管理员', '2018-05-16 14:22:14', '1');
INSERT INTO `user` VALUES ('37', 'zx4', '123', '2', '1', '23', '张荥', '2018-05-16 15:37:58', '1');

代码

1、创建一个用于分页的实体类——PageEntity.java

public class PageEntity {

	private List list;

	private int totalRecords;
	private int pageSize;
	private int pageNo;

	public int getTotalPages() {
		return (int) Math.ceil((double) totalRecords / pageSize);
	}

	public int getFirst() {
		return 1;
	}

	public int getLast() {
		return getTotalPages();
	}

	public int getPrePage() {
		if (pageNo == 1) {
			return 1;
		} else {
			return pageNo - 1;
		}
	}

	public int getNextPage() {
		if (pageNo == getLast()) {
			return getLast();
		} else {
			return pageNo + 1;
		}
	}

	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public int getTotalRecords() {
		return totalRecords;
	}

	public void setTotalRecords(int totalRecords) {
		this.totalRecords = totalRecords;
	}

	public int getPageSize() {
		return pageSize;
	}

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

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

}

实体类中有4个属性是需要get、set方法的,分别是list(存储所查询的数据)、totalRecords(数据的总数)、pageSize(每页所展示的数据条数)、pageNo(当前的页数)。由于我用的是el表达式,其他几个属性:totalPages(总页数)、first(首页)、last(尾页)、prePage(上一页)、nextPage(下一页)只需要提供get方法,甚至不需要将其声明,这就是el表达式带给我们的便捷。

user表实体类——UserEntity

package enetity;

import java.util.Date;

public class User {

	private int id;
	private String username;
	private String password;
	private int role;
	private int gender;
	private int age;
	private String memo;
	private Date createTime;
	private int state;

	public String getUsername() {
		return username;
	}

	public int getId() {
		return id;
	}

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

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int getGender() {
		return gender;
	}

	public void setGender(int gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

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

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public int getRole() {
		return role;
	}

	public void setRole(int role) {
		this.role = role;
	}

	public String getMemo() {
		return memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}

}

2、使用sql查询语句进行分页查询

在dao中新建一个方法——PageEntity findAllUser(int pageNo, int pageSize)

public PageEntity findAllUser(int pageNo, int pageSize) {
		String sql = "select * from user limit ?,?";
		List list = DBUtil.retrieve(sql, (pageNo - 1) * pageSize, pageSize);
		PageEntity page = new PageEntity<>();
		page.setList(list);
		page.setTotalRecords(countRecords(username));
		page.setPageNo(pageNo);
		page.setPageSize(pageSize);

		return page;
	}

在service中新建一个方法——PageEntity listUser(int pageNo, int pageSize)

public PageEntity listUser(String username, int pageNo, int pageSize) {
		return userDao.findAllUser(username, pageNo, pageSize);
	}

在servlet中调用service中的方法。

private void toMainUI(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = (String) request.getSession().getAttribute("username");
		int pageNo = 1;
		String pageNoStr = request.getParameter("pageNo");
		if (pageNoStr != null) {
			pageNo = Integer.parseInt(pageNoStr);
		}
		int pageSize = 5;
		String pageSizeStr = request.getParameter("pageSize");
		if (pageSizeStr != null) {
			pageSize = Integer.parseInt(pageSizeStr);
		}

		PageEntity page = service.listUser(username, pageNo, pageSize);
		request.setAttribute("page", page);
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

在servlet中使用的是java反射调用的toMainUI方法,减少了许多的if分支判断,方法如下:

protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");

		String command = request.getParameter("command");
		Class clazz = UserServlet.class;
		try {
			Method method = clazz.getDeclaredMethod(command, HttpServletRequest.class, HttpServletResponse.class);
			method.setAccessible(true);
			method.invoke(this, request, response);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

	}

command必须与方法名一致!!!

jsp中的代码

每页显示 首页 上一页 共${page.totalPages }页 下一页 尾页 显示${(page.pageNo - 1) * page.pageSize + 1}到${page.totalRecords }${page.pageNo * page.pageSize },共 ${page.totalRecords } 条记录

至此所有的逻辑就结束了,讲的只是一个实现的大概逻辑,需要自己去理解。样式需要自己去写,我用的是bootstrap。

效果图

JavaWeb Mysql简单分页_第1张图片

JavaWeb Mysql简单分页_第2张图片


你可能感兴趣的:(JavaWeb)