1. 程式人生 > >javaWeb(十五)頁面模型的抽取,實現頁面分頁(Servlet+JSP)

javaWeb(十五)頁面模型的抽取,實現頁面分頁(Servlet+JSP)

頁面分頁好像挺煩的,涉及到分頁模型的抽取,在此做個記錄,簡單的分頁實現


頁面分頁就是在前端分頁顯示資料庫的資料,基本思路就是將分頁需要顯示的幾個要素放到分頁模型裡面,然後在前端顯示

步驟如下:

  1. 分頁取資料的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
  1. 分頁模型的抽取 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} &nbsp; &nbsp; &nbsp;
  每頁顯示${pageBean.pageSize}  &nbsp; &nbsp; &nbsp;
  總記錄數${ pageBean.totalSize} &nbsp; &nbsp; &nbsp;
  
  <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>