JSP核心——分頁查詢

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;

測試效果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章