JSP核心——分頁查詢
業務背景
當數據量較多時,用戶需要拖動頁面才能瀏覽更多信息數據定位不便;採用分頁技術實現批量數據的頁面顯示。例如百度搜索:
分頁實現
①確定每頁顯示的數據數量
②確定分頁顯示所需的總頁數
③編寫SQL查詢語句,實現數據查詢
④在JSP頁面中進行分頁顯示設置
編寫實體類
public class Employee {
private int employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private String jobId;
private double salary;
private double commissionPct;
private int managerId;
private int departmentId;
private Date hiredate;//僱傭日期
//省略getter、setter方法
}
編寫工具類
PageUtil封裝分頁的數據。
package com.hanker.util;
import java.util.List;
public class PageUtils<T> {
private int currPageNo = 1;//當前頁
private int pageSize =10;//每頁顯示記錄數
private int totalCount;//總記錄數
private int totalPage;//總頁數
private List<T> data;//分頁數據,泛型可以保存各種類型
public int getCurrPageNo() {
return currPageNo;
}
public void setCurrPageNo(int currPageNo) {
this.currPageNo = currPageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
//計算總頁碼
totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
@Override
public String toString() {
return "PageUtils [currPageNo=" + currPageNo + ", pageSize=" + pageSize + ", totalCount=" + totalCount
+ ", totalPage=" + getTotalPage() + ", data=" + data + "]";
}
}
編寫Dao層
Dao接口
package com.hanker.dao;
import java.util.List;
import com.hanker.entity.Employee;
import com.hanker.util.PageUtils;
public interface EmployeeDao {
/**
* 分頁查詢
* @param pageIndex 第幾頁
* @param pageSize 每頁記錄數
* @return 當前頁的數據
*/
PageUtils<Employee> findByPage(int pageIndex, int pageSize);
/**
* 查詢總記錄數
* @return 總記錄數
*/
long getCount();
}
Dao實現類
public class EmployeeDaoImpl implements EmployeeDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
@Override
public PageUtils<Employee> findByPage(int pageIndex, int pageSize) {
// 分頁查詢
List<Employee> list = new ArrayList<Employee>();
String sql = "select * from employees limit ?,?";
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, (pageIndex-1)* pageSize );
ps.setInt(2, pageSize);
rs = ps.executeQuery();
while (rs.next()) {
// 每次循環一行,創建一個新對象封裝到e
Employee e = new Employee();
e.setEmployeeId(rs.getInt(1));
e.setFirstName(rs.getString("first_name"));
e.setLastName(rs.getString(3));
e.setEmail(rs.getString("email"));
e.setPhoneNumber(rs.getString(5));
e.setJobId(rs.getString("job_id"));
e.setSalary(rs.getDouble("salary"));
e.setCommissionPct(rs.getDouble(8));
e.setManagerId(rs.getInt("manager_id"));
e.setDepartmentId(rs.getInt(10));
e.setHiredate(rs.getDate("hiredate"));
//添加到集合
list.add(e);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.close(conn, ps, rs);
}
PageUtils<Employee> page = new PageUtils<Employee>();//創建對象
page.setCurrPageNo(pageIndex);//設置當前頁
page.setData(list);//頁面數據
page.setTotalCount((int)getCount());//設置總記錄數
page.setPageSize(pageSize);
return page;
}
@Override
public long getCount() {
int count = -1 ;
// 注意的問題刪除的數據不能顯示了;
String sql = "select count(employee_id) from employees where status=0";
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()) {
count = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.close(conn, ps, rs);
}
return count;
}
}
編寫業務層
業務接口
package com.hanker.service;
import java.util.List;
import com.hanker.entity.Employee;
import com.hanker.util.PageUtils;
public interface EmpployeeService {
/**
* 分頁查詢
* @param pageIndex 第幾頁
* @param pageSize 每頁記錄數
* @return 當前頁的數據
*/
PageUtils<Employee> findByPage(int pageIndex,int pageSize);
/**
* 獲取總記錄數:刪除後的數據沒有必要顯示了
* @return 總記錄數
*/
long getCount();
}
業務實現類
package com.hanker.service.impl;
import java.util.List;
import com.hanker.dao.EmployeeDao;
import com.hanker.dao.impl.EmployeeDaoImpl;
import com.hanker.entity.Employee;
import com.hanker.service.EmpployeeService;
import com.hanker.util.PageUtils;
//業務層調用Dao層 重點是在業務層控制事務
public class EmployeeServiceImpl implements EmpployeeService{
private EmployeeDao employeeDao = new EmployeeDaoImpl();
@Override
public PageUtils<Employee> findByPage(int pageIndex, int pageSize) {
return employeeDao.findByPage(pageIndex, pageSize);
}
@Override
public long getCount() {
return employeeDao.getCount();
}
}
編寫Web層
<%@page import="com.hanker.util.PageUtils"%>
<%@page import="com.hanker.entity.Employee"%>
<%@page import="java.util.List"%>
<%@page import="com.hanker.dao.impl.EmployeeDaoImpl"%>
<%@page import="com.hanker.dao.EmployeeDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>員工列表</title>
<style type="text/css">
table,tr,td{
border: 1px solid #000;
border-collapse: collapse;/*合併單元格邊框*/
}
</style>
</head>
<body>
<%
String pageIndex = request.getParameter("pageIndex");
if(pageIndex == null) pageIndex="1";
int pageSize =10;//每頁記錄數
EmployeeDao empDao = new EmployeeDaoImpl();
PageUtils<Employee> pageUtils = empDao.findByPage(Integer.parseInt(pageIndex), pageSize);
List<Employee> list =pageUtils.getData();//獲取當前頁面的數據
%>
<h1 align="center">員工列表</h1>
<table style="width: 90%;margin: 0px auto;">
<tr><td colspan="12"><a href="emp_add.jsp">添加</a></td></tr>
<tr>
<td>員工編號</td>
<td>員工名字</td>
<td>員工姓氏</td>
<td>電子郵箱</td>
<td>電話號碼</td>
<td>工作編號</td>
<td>員工薪水</td>
<td>員工獎金</td>
<td>經理編號</td>
<td>部門編號</td>
<td>僱傭日期</td>
<td>操作按鈕</td>
</tr>
<%
for(int i=0,j=list.size(); i<j; i++){
Employee e = list.get(i);//從集合中取出一個對象
%>
<tr>
<td><%=e.getEmployeeId() %></td>
<td><%=e.getFirstName() %></td>
<td><%=e.getLastName() %></td>
<td><%=e.getEmail()%></td>
<td><%=e.getPhoneNumber()%></td>
<td><%=e.getJobId()%></td>
<td><%=e.getSalary()%></td>
<td><%=e.getCommissionPct()%></td>
<td><%=e.getManagerId()%></td>
<td><%=e.getDepartmentId()%></td>
<td><%=e.getHiredate()%></td>
<td>
<a href="emp_delete.jsp?id=<%=e.getEmployeeId() %>">刪除</a>
<a href="emp_update.jsp?id=<%=e.getEmployeeId() %>">修改</a>
<a href="#">訂單</a>
</td>
</tr>
<%
} //注意:for的結束大括號
%>
<tr>
<td colspan="12">
<a href="emp_list_page.jsp?pageIndex=1">第一頁</a>
<a href="emp_list_page.jsp?pageIndex=<%=pageUtils.getCurrPageNo()>1 ? pageUtils.getCurrPageNo() - 1 : 1 %>">上一頁</a>
<a href="emp_list_page.jsp?pageIndex=<%=pageUtils.getCurrPageNo()<pageUtils.getTotalPage() ?pageUtils.getCurrPageNo() +1 : pageUtils.getTotalPage() %>">下一頁</a>
<a href="emp_list_page.jsp?pageIndex=<%=pageUtils.getTotalPage() %>">最後一頁</a>
第<%=pageUtils.getCurrPageNo() %>頁/共<%=pageUtils.getTotalPage() %>頁
</td>
</tr>
</table>
</body>
</html>
SQL腳本
/*
Navicat Premium Data Transfer
Source Server : mysql
Source Server Type : MySQL
Source Server Version : 50710
Source Host : localhost
Source Database : myemployees
Target Server Type : MySQL
Target Server Version : 50710
File Encoding : utf-8
Date: 04/02/2020 21:26:59 PM
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `employees`
-- ----------------------------
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`employee_id` int(6) NOT NULL AUTO_INCREMENT,
`first_name` varchar(20) DEFAULT NULL,
`last_name` varchar(25) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(20) DEFAULT NULL,
`job_id` varchar(10) DEFAULT NULL,
`salary` double(10,2) DEFAULT NULL,
`commission_pct` double(4,2) DEFAULT NULL,
`manager_id` int(6) DEFAULT NULL,
`department_id` int(4) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
`status` char(1) DEFAULT '0' COMMENT '狀態(0正常 1刪除 2停用)',
PRIMARY KEY (`employee_id`) USING BTREE,
KEY `dept_id_fk` (`department_id`) USING BTREE,
KEY `job_id_fk` (`job_id`) USING BTREE,
CONSTRAINT `dept_id_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
CONSTRAINT `job_id_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=gb2312 ROW_FORMAT=COMPACT;
SET FOREIGN_KEY_CHECKS = 1;