javaWeb(十五)頁面模型的抽取,實現頁面分頁(Servlet+JSP)
阿新 • • 發佈:2019-01-10
頁面分頁好像挺煩的,涉及到分頁模型的抽取,在此做個記錄,簡單的分頁實現
頁面分頁就是在前端分頁顯示資料庫的資料,基本思路就是將分頁需要顯示的幾個要素放到分頁模型裡面,然後在前端顯示
步驟如下:
- 分頁取資料的SQL語句
//從2開始,選五個資料,即3,4,5,6,7
select * from student limit 2 , 5
//偏離2,選五個資料,也是3,4,5,6,7
select * from student limit 5 offset 2
- 分頁模型的抽取 pageBean
因為上面的sql語句只能在資料庫裡面獲取到固定的資訊(比如學生資訊,商品資訊),我們還需要得到,當前頁面、總頁面、每頁顯示條數、總條數
pageBean的抽取如下:
package cn.nupt.domain;
import java.util.List;
public class PageBean<T> {
private int currentPage; //當前頁
private int totalPage; //總頁數
private int pageSize; //每頁的記錄數
private int totalSize; //總條數
private List<T> list;//當前頁的學生集合
}
Servlet實現:
package cn.nupt.pageServlet;
import java.io.IOException;
import java.sql.SQLException;
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 cn.nupt.domain.PageBean;
import cn.nupt.domain.Service;
import cn.nupt.domain.ServiceImpl;
import cn.nupt.domain.Student;
/**
* Servlet implementation class PageServlet
*/
@WebServlet("/PageServlet")
public class PageServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
Service serviceImpl = new ServiceImpl();
// 呼叫業務層的功能獲取頁面模型pageBean
PageBean<Student> pageBean;
try {
pageBean = serviceImpl.findByCurrentPage(currentPage);
// 講這個頁面模型存到request裡面傳到前端
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("/page_list.jsp");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
業務層的實現serviceImpl
package cn.nupt.domain;
import java.sql.SQLException;
import java.util.List;
public class ServiceImpl implements Service {
@Override
public PageBean<Student> findByCurrentPage(int currentPage) throws SQLException {
PageBean<Student> pageBean = new PageBean<Student>();
Dao daoImpl = new DaoImpl();
// 已知當前頁,獲取這個頁面的資訊集合
List<Student> list = daoImpl.getStudentList(currentPage);
// 獲取總條數:totalSize;
int totalSize = daoImpl.getTotalSize();
int page_size = Dao.PAGE_SIZE;
// 一共多少頁
int count = totalSize % page_size;
int totalPage = ((count == 0) ? count : count + 1);
pageBean.setList(list);
pageBean.setTotalSize(totalSize);
// 每頁的記錄數就直接在Dao接口裡面設定了
pageBean.setPageSize(page_size);
// 第幾頁,也直接輸入
pageBean.setCurrentPage(currentPage);
pageBean.setTotalPage(totalPage);
return pageBean;
}
}
Dao層的實現(主要是的到每頁資訊和總條數):
package cn.nupt.domain;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DaoImpl implements Dao {
@Override
public List<Student> getStudentList(int currentPage) throws SQLException {
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
String sql = "select * from student limit ? ,? ";
// 第一個問號是當前頁(前端傳過來的),第二個問號是,每頁顯示條數(自己設定的)
List<Student> list = queryRunner.query(sql, new BeanListHandler<Student>(Student.class), (currentPage-1)*Dao.PAGE_SIZE,
Dao.PAGE_SIZE);
return list;
}
@Override
public int getTotalSize() throws SQLException {
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
String sql = "select count(*) from student";
Long TotaSize = (Long) queryRunner.query(sql, new ScalarHandler());
int TotalSize = TotaSize.intValue();
return TotalSize;
}
}
最後的頁面端顯示就可以定製了,拿到request裡面的資訊用JSTL表示式在jsp裡面顯示就行了,如前面的圖所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'page_list.jsp' starting page</title>
</head>
<body>
第 ${pageBean.currentPage}/ ${pageBean. totalPage}
每頁顯示${pageBean.pageSize}
總記錄數${ pageBean.totalSize}
<c:if test="${pageBean. currentPage != 1}">
<a href="PageServlet?currentPage=1">首頁</a> | <a href="PageServlet?currentPage=${pageBean.currentPage -1}">上一頁</a>
</c:if>
<c:forEach begin="1" end="${pageBean.totalPage}" var="i">
<!-- 如果是當前頁面,直接輸出,不加超連結 -->
<c:if test="${pageBean.currentPage == i}">
${i}
</c:if>
<!-- 如果不是當前頁面,加超連結 -->
<c:if test="${pageBean.currentPage!= i}">
<a href="PageServlet?currentPage=${i}"> ${i} </a>
</c:if>
</c:forEach>
<c:if test="${pageBean. currentPage != pageBean.totalPage }">
<a href="PageServlet?currentPage=${pageBean.currentPage+1}">下一頁</a> | <a href="PageServlet?currentPage=${pageBean. totalPage}">尾頁</a>
</c:if>
</body>
</html>