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>

猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/85757160
今日推荐