記錄整理期末實訓項目中的分頁功能實現,以備不時之需,直接上代碼:
0.建表(準備測試數據)
/*
Navicat MySQL Data Transfer
Date: 2019-12-24 15:21:58
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for books
-- ----------------------------
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` varchar(200) NOT NULL,
`name` varchar(100) NOT NULL,
`price` double DEFAULT NULL,
`pnum` int(11) DEFAULT NULL,
`category` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of books
-- ----------------------------
INSERT INTO `books` VALUES ('1001', 'java編程思想', '98', '100', '計算機');
INSERT INTO `books` VALUES ('1002', '西遊記', '10', '50', '文學');
INSERT INTO `books` VALUES ('1003', '九陰真經', '20', '30', '武俠');
INSERT INTO `books` VALUES ('1004', '365夜睡前好故事', '19.8', '50', '少兒');
INSERT INTO `books` VALUES ('1006', '三隻小豬', '9.8', '50', '少兒');
INSERT INTO `books` VALUES ('1007', '中華上下五千年', '28', '100', '少兒');
INSERT INTO `books` VALUES ('1008', '三國演義', '9.8', '50', '文學');
1.DBUtil(數據庫連接封裝類)
package com.ambow.util;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class DBUtil {
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/bookstore";
private static String username = "root";
private static String password = "root";
static {
try {
/**
* 加載驅動
*/
Class.forName(driver);
}catch(Exception ex) {
ex.printStackTrace();
}
}
public static Connection getConnection() {
/**
* 創建連接對象
*/
Connection conn=null;
try {
conn=(Connection) DriverManager.getConnection(url,username,password);
}catch(Exception ex) {
ex.printStackTrace();
}
return conn;
}
/**
* 關閉相關流
*/
public static void close(ResultSet rs,Statement st,Connection conn) {
try {
if(rs!=null) {
rs.close();
}
if(st!=null) {
st.close();
}
if(conn!=null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
public static void closePst(ResultSet rs,PreparedStatement pst,Connection conn) {
try {
if(rs!=null) {
rs.close();
}
if(pst!=null) {
pst.close();
}
if(conn!=null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
2.Book(實體類)
package com.ambow.domain;
public class Book {
private int id;
private String name;
private float price;
private int pnum;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getPnum() {
return pnum;
}
public void setPnum(int pnum) {
this.pnum = pnum;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
3.PageModel(分頁模型類)
package com.ambow.domain;
import java.util.List;
/**
* 封裝分頁信息
* @author Administrator
*
*/
public class PageModel<E> {
//結果集
private List<E> list;
//查詢記錄數
private int totalRecords;
//每頁多少條數據
private int pageSize;
//第幾頁
private int pageNo;
/**
* 總頁數
* @return
*/
public int getTotalPages() {
return (totalRecords + pageSize - 1) / pageSize;
}
/**
* 取得首頁
* @return
*/
public int getTopPageNo() {
return 1;
}
/**
* 上一頁
* @return
*/
public int getPreviousPageNo() {
if (pageNo <= 1) {
return 1;
}
return pageNo - 1;
}
/**
* 下一頁
* @return
*/
public int getNextPageNo() {
if (pageNo >= getBottomPageNo()) {
return getBottomPageNo();
}
return pageNo + 1;
}
/**
* 取得尾頁
* @return
*/
public int getBottomPageNo() {
return getTotalPages();
}
/**
* get set函數
* @return
*/
public List<E> getList() {
return list;
}
public void setList(List<E> 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.BookDao(業務邏輯層,操作數據庫等操作,返回值爲PageModel對象)
package com.ambow.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.ambow.domain.Book;
import com.ambow.domain.PageModel;
import com.ambow.util.DBUtil;
public class BookDao {
public PageModel<Book> findData(String pageNo, String pageSize){
PageModel<Book> pageModel=null;
Connection conn= DBUtil.getConnection();
String sql="select * from books limit ?,?";
PreparedStatement pst=null;
ResultSet rs=null;
Book rec=null;
List<Book> list=new ArrayList<Book>();
try {
pst=conn.prepareStatement(sql);
//pstm.setInt(1, (pageNo-1)*pageSize);
//pstm.setInt(2, pageNo*pageSize);
pst.setInt(1, (Integer.parseInt(pageNo)-1)*Integer.parseInt(pageSize));
pst.setInt(2, Integer.parseInt(pageSize));
rs=pst.executeQuery();
while(rs.next()){
rec=new Book();
rec.setId(rs.getInt("id"));
rec.setName(rs.getString("name"));
rec.setPrice(rs.getFloat("price"));
rec.setPnum(rs.getInt("pnum"));
rec.setCategory(rs.getString("category"));
list.add(rec);
}
ResultSet rs2=pst.executeQuery("select count(*) from books");
int total=0;
if(rs2.next()){
total=rs2.getInt(1);//總的數據條數
}
pageModel=new PageModel<Book>();
pageModel.setPageNo(Integer.parseInt(pageNo));
pageModel.setPageSize(Integer.parseInt(pageSize));
pageModel.setTotalRecords(total);
pageModel.setList(list);
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closePst(rs, pst, conn);
}
return pageModel;
}
public static void main(String[] args) {
BookDao client=new BookDao();
PageModel<Book> pageModel=client.findData("2","4");
List<Book> list=pageModel.getList();
for(Book a:list){
System.out.print("ID:"+a.getId()+",名稱:"+a.getName()+",價格:"+a.getPrice());
System.out.println();
}
System.out.print("當前頁:"+pageModel.getPageNo()+" ");
System.out.print("共"+pageModel.getTotalPages()+"頁 ");
System.out.print("首頁:"+pageModel.getTopPageNo()+" ");
System.out.print("上一頁:"+pageModel.getPreviousPageNo()+" ");
System.out.print("下一頁:"+pageModel.getNextPageNo()+" ");
System.out.print("尾頁:"+pageModel.getBottomPageNo()+" ");
System.out.print("共"+pageModel.getTotalRecords()+"條記錄");
System.out.println();
}
}
5.BookServlet(控制層,servlet,連接前端和業務層,獲得PageModel對象後跳轉到新頁面展示分頁數據信息)
package com.ambow.servlet;
import java.io.IOException;
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 com.ambow.dao.BookDao;
import com.ambow.domain.Book;
import com.ambow.domain.PageModel;
/**
* Servlet implementation class recomment
*/
@WebServlet("/getBook")
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String pageSize = request.getParameter("pageSize");// 每頁顯示行數
String pageNo = request.getParameter("pageNo");// 當前顯示頁次
if (pageSize == null) {// 爲空時設置默認頁大小爲10
pageSize = "10";
}
if (pageNo == null) {// 爲空時設置默認爲第1頁
pageNo = "1";
}
//System.out.println("pageNo="+pageNo+"pageSize="+pageSize);
// 保存分頁參數,傳遞給下一個頁面
request.setAttribute("pageSize", pageSize);
request.setAttribute("pageNo", pageNo);
//新建Dao對象,獲取pageModel
BookDao client=new BookDao();
PageModel<Book> pageModel=client.findData(pageNo,pageSize);
request.setAttribute("pageModel", pageModel);//前端獲取這個值
request.getRequestDispatcher("result.jsp").forward(request, response);
}
}
6.index.jsp(程序入口,調到servlet層)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/getBook">查看所有圖書信息</a>
</body>
</html>
7.result.jsp(展示分頁結果的頁面)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.ambow.domain.Book" %>
<%@ page import="com.ambow.domain.PageModel" %>
<%
String pageSize = (String) request.getAttribute("pageSize");
String pageNo = (String) request.getAttribute("pageNo");
PageModel<Book> pageModel=(PageModel<Book>) request.getAttribute("pageModel");
List<Book> list=pageModel.getList();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- <script src="/haha/js/jquery.min.js" type="text/javascript"></script> -->
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<style type="text/css">
table{
width: 60%;
margin: auto;
border: solid 1px sandybrown;
}
caption{
font-weight: bold;
font-size: 24px;
}
#dataTable td{
border: solid 1px sandybrown;
}
#pageTable{
margin-top: 10px;
}
</style>
</head>
<body>
<table id="dataTable">
<caption>所有信息</caption>
<tr align="center">
<td><b>ID</b></td>
<td><b>圖書名稱</b></td>
<td><b>圖書價格</b></td>
<td><b>圖書數量</b></td>
<td><b>圖書類別</b></td>
</tr>
<%
if(list==null||list.size()<1){
%><p align="center">還沒有任何數據!</p>
<%}else{
for(Book rec:list){
%>
<tr>
<td><%=rec.getId() %></td>
<td><%=rec.getName() %></td>
<td><%=rec.getPrice() %></td>
<td><%=rec.getPnum() %></td>
<td><%=rec.getCategory() %></td>
</tr>
<%
}
}
%>
</table>
<form name="form1" action="${pageContext.request.contextPath}/getBook" method="post">
<TABLE id="pageTable">
<TR>
<TD align="left">
共<%=pageModel.getTotalRecords()%>條/<a>每頁</a>
<select name="pageSize"
onchange="document.all.pageNo.value='1';document.all.form1.submit();">
<option value="5" <%if(pageSize.equals("5")){%>
selected="selected" <%}%>>5</option>
<option value="10" <%if(pageSize.equals("10")){%>
selected="selected" <%}%>>10</option>
<option value="20" <%if(pageSize.equals("20")){%>
selected="selected" <%}%>>20</option>
<option value="30" <%if(pageSize.equals("30")){%>
selected="selected" <%}%>>30</option>
</select>條</TD>
<TD align="right">
<a href="javascript:document.all.pageNo.value='<%= pageModel.getTopPageNo() %>';document.all.form1.submit();">首頁</a>
<a href="javascript:document.all.pageNo.value='<%= pageModel.getPreviousPageNo() %>';document.all.form1.submit();">上一頁</a>
<a href="javascript:document.all.pageNo.value='<%= pageModel.getNextPageNo()%>';document.all.form1.submit();">下一頁</a>
<a href="javascript:document.all.pageNo.value='<%= pageModel.getBottomPageNo()%>';document.all.form1.submit();">尾頁</a>
<a>第</a>
<select name="pageNo" onchange="document.all.form1.submit();">
<%
int pageCount = pageModel.getTotalPages();
%>
<%
for (int i = 1; i <= pageCount; i++) {
%>
<option value="<%=i%>" <%if(pageNo.equals(i+"")){%>
selected="selected" <%}%>><%=i%></option>
<%
}
%>
</select><a>頁</a>/共<%=pageModel.getTotalPages()%>頁</TD>
</TR>
</TABLE>
</form>
</body>
</html>
9.展示效果
項目源碼:下載地址