【JavaWeb开发-Servlet】day06-学生成绩管理系统-实现分页功能

news2025/1/12 6:59:59

目录

一、前端设计

二、分页功能

①创建实体层

②在DAO层新建两个方法

③编写业务层

④实现Servlet层

⑤修改前端页面

⑥测试

⑦思路

⑧扩展


一、前端设计

        原来的前端非常简陋,没有明显的突出其功能,下面将对前端页面进行新的完善。

         写一个标题模板,

        head.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,com.qf.entity.*,java.text.*"
    pageEncoding="utf-8"%>
<div id="header">
					<div id="rightheader">
						<p>
							<%
								Date date=new Date();
							    SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
								out.println(sdf.format(date));				
							
							%>
							<br />
						</p>
					</div>
					<div id="topheader">
						<h1 id="title">
							<a href="#">主页</a>
						</h1>
					</div>
					<div id="navigation">
					</div>
				</div>

        然后将这个模板在其他页面进行引用

<%@ include file="head.jsp" %>

 

        显示效果:

 

 

        这种写法能帮我省去很多重复性的代码,将重复的页面模块写在一个jsp文件中,然后通过一句代码直接调用即可。 

<%@ include file="xxx.jsp" %>

二、分页功能

        当学生信息存入过多时,一张页面中数据往往是显示不全的,为此我们使用分页功能,可以更好的显示数据。

①创建实体层

package sams.ck.entity;

public class stuPage {
    private int currentPage=1;//当前页 默认值为1 
    private int pageSize=5;//每页显示的最大记录条数
    private int begin;//每页的起始位置
    private int totalPage;//总页数
    private int rows;//总记录行数
    
	public int getCurrentPage() {
		
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getBegin() {
		begin=(this.currentPage-1)*pageSize;
		return begin;
	}
	public void setBegin(int begin) {
		this.begin = begin;
	}
	public int getTotalPage() {
		//总页数 =总行数%每页最大记录行数	
		totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getRows() {
		return rows;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
    
}

②在DAO层新建两个方法

//分页查询
	public List<Student>findByPage(stuPage page) throws SQLException{
		List<Student>stus=new ArrayList<Student>();
		//链接数据库 
		Connection conn=DBUtil.getConnection();
		
		//定义sql语句
		String sql="select * from students limit ?,?";
		try {
			PreparedStatement prep=conn.prepareStatement(sql);
			prep.setInt(1, page.getBegin());
			prep.setInt(2, page.getPageSize());
			ResultSet rs=prep.executeQuery();
			//迭代结果集对象 将查询输出的数据封装到Stus对象当中  
			while(rs.next()){
				Student stu=new Student();
				stu.setStuId(rs.getString("number"));
				stu.setStuName(rs.getString("name"));
				stu.setStuClass(rs.getString("class"));
				stu.setChineseScore(rs.getDouble("chinese"));
				stu.setEnglisScore(rs.getDouble("english"));
				stu.setMathScore(rs.getDouble("math"));
				//将封装好的stu对象 添加到list集合中
				stus.add(stu);
			}	
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stus;
	}
	//查询总记录行数
	public int findRows(stuPage page) throws SQLException {
		int count=0;
		Connection conn=DBUtil.getConnection();

		String sql="select count(*) c from students";//给查询结果count(*)起别名为c
		try {
			PreparedStatement prep=conn.prepareStatement(sql);
			ResultSet rs=prep.executeQuery();
			if(rs.next()){
				count=rs.getInt("c");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}

③编写业务层

//查询分页信息
	public List<Student> findByPage(stuPage page) throws SQLException{
		return dao.findByPage(page);
	}
	//查询总记录行数
	public int findRows(stuPage page) throws SQLException{
		return dao.findRows(page);
	}

④实现Servlet层

//根据处理后的字符串来判断用户的请求
		if(path.equals("/stuList")){
			// 获取浏览器端传递的参数 要查询的页数
			String current = request.getParameter("current");
			// 创建一个分页信息
			stuPage page = new stuPage();
			try {
				// 查询总记录行数
				int rows = service.findRows(page);
				// 将查询出的总行数 添加到 page当中
				page.setRows(rows);
				// 判断current的值是否为null值 如果不是 null
				if (current != null) {
					int cur = Integer.parseInt(current);
					page.setCurrentPage(cur);
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			//调用业务层的代码  获取所有的员工信息
			List<Student> stus;
			try {
				stus = service.findByPage(page);
				request.setAttribute("stus", stus);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			//将查询到的数据 传递给视图页面  由视图页面将数据返回给浏览器 展示在用户面前
			//step1  先将数据绑定到request对象上
			
			request.setAttribute("page", page);
			//step2 获取转发器
			RequestDispatcher dis=request.getRequestDispatcher("stuList.jsp");
			//step3 转发
			dis.forward(request, response);
		}

⑤修改前端页面

<%
						stuPage p=(stuPage)request.getAttribute("page");
						int cur=p.getCurrentPage();
						int totalPage=p.getTotalPage();
					%>
					<p>
						<%
							if(cur!=1){
						%>
							<a href="stuList.do?current=<%=cur-1%>">上一页</a>
						<%
							}						
						%>
						<%
							for(int i=1;i<=totalPage;i++){
						%>
						<a href="stuList.do?current=<%=i%>"><%=i %></a>
						<%
							}
						%>
						<%
							if(cur!=totalPage){
						%>
							<a href="stuList.do?current=<%=cur+1%>">下一页</a>
						<%
							}						
						%>
					</p>

⑥测试

 

 

 ⑦思路

        我们要分页查看数据,分页查看和整体查看本质区别是什么?

        整体查看sql:

select * from students;

         分页查看sql:

select * from students limit 1,2

        分页其实就是带有限制条件的查询全部数据。limit(a,b)就是显示数据表中的a到b条数据。那么b-a就是每页显示的内容数量。

        我们通过创建实体类, 定义了以下属性

    private int currentPage=1;//当前页 默认值为1 
    private int pageSize=5;//每页显示的最大记录条数
    private int begin;//每页的起始位置
    private int totalPage;//总页数
    private int rows;//总记录行数

        可以方便我们调整设置显示数量和起始位置。

         比如获取当前页数:

public int getBegin() {
		begin=(this.currentPage-1)*pageSize;
		return begin;
	}

         获取总页数

public int getTotalPage() {
		//总页数 =总行数%每页最大记录行数	
		totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
		return totalPage;
	}

        有了实体类我们就可以通过实体属性来操作数据库了。在dao层,我们查询出每页的数据信息和全部数据条数。此方法可直接在业务层使用。

        在前端页面和Servlet层中,我们通过request传递前端返回的数据,通过setAtrribute绑定实体

request.setAttribute("page", page);

         从而动态实现前后端数据的交互。根据点击前端的翻页按钮,改变当前所在页,Servlet再获取到当前页后,通过调用业务层的方法实现显示正确的分页内容。

⑧扩展

        在上述例子里,我们的搜索功能是在一个新的页面显示的结果,如果我们想在当前列表页面显示结果,那就一定也会使用分页功能。那么就需要定义一个新的变量,用来定义搜索内容。然后根据这个定义的搜索变量来判断是否需要分页,如何分页。

        代码实现:

        根据上述案例对搜索进行修改,假设搜索结果显示在当前列表界面,搜索条件是学号,那么代码如下:

        实体层:

package sams.ck.entity;

public class stuPage {
    private int currentPage=1;//当前页 默认值为1 
    private int pageSize=5;//每页显示的最大记录条数
    private int begin;//每页的起始位置
    private int totalPage;//总页数
    private int rows;//总记录行数
    
    //搜过功能的条件
    private String number=null;
    
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public int getCurrentPage() {
		
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getBegin() {
		begin=(this.currentPage-1)*pageSize;
		return begin;
	}
	public void setBegin(int begin) {
		this.begin = begin;
	}
	public int getTotalPage() {
		//总页数 =总行数%每页最大记录行数	
		totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getRows() {
		return rows;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
    
}

        dao层:

//分页查询
	public List<Student>findByPage(stuPage page) throws SQLException{
		List<Student>stus=new ArrayList<Student>();
		//链接数据库 
		Connection conn=DBUtil.getConnection();
		if(page.getNumber()==null){
			//定义sql语句
			String sql="select * from students limit ?,?";
			try {
				PreparedStatement prep=conn.prepareStatement(sql);
				prep.setInt(1, page.getBegin());
				prep.setInt(2, page.getPageSize());
				ResultSet rs=prep.executeQuery();
				//迭代结果集对象 将查询输出的数据封装到Stus对象当中  
				while(rs.next()){
					Student stu=new Student();
					stu.setStuId(rs.getString("number"));
					stu.setStuName(rs.getString("name"));
					stu.setStuClass(rs.getString("class"));
					stu.setChineseScore(rs.getDouble("chinese"));
					stu.setEnglisScore(rs.getDouble("english"));
					stu.setMathScore(rs.getDouble("math"));
					//将封装好的stu对象 添加到list集合中
					stus.add(stu);
				}	
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return stus;
		}else {
			//定义sql语句
			String sql="select * from students where number=? limit ?,?";
			try {
				PreparedStatement prep=conn.prepareStatement(sql);
				prep.setString(1, page.getNumber());
				prep.setInt(2, page.getBegin());
				prep.setInt(3, page.getPageSize());
				ResultSet rs=prep.executeQuery();
				//迭代结果集对象 将查询输出的数据封装到Stus对象当中  
				while(rs.next()){
					Student stu=new Student();
					stu.setStuId(rs.getString("number"));
					stu.setStuName(rs.getString("name"));
					stu.setStuClass(rs.getString("class"));
					stu.setChineseScore(rs.getDouble("chinese"));
					stu.setEnglisScore(rs.getDouble("english"));
					stu.setMathScore(rs.getDouble("math"));
					//将封装好的stu对象 添加到list集合中
					stus.add(stu);
				}	
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return stus;	
		}
	}
	//查询总记录行数
	public int findRows(stuPage page) throws SQLException {
		int count=0;
		Connection conn=DBUtil.getConnection();
		if(page.getNumber()==null){
			String sql="select count(*) c from students";//给查询结果count(*)起别名为c
			try {
				PreparedStatement prep=conn.prepareStatement(sql);
				ResultSet rs=prep.executeQuery();
				if(rs.next()){
					count=rs.getInt("c");
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return count;
		}else {
			String sql="select count(*) c from students where number=?";
			try {
				PreparedStatement prep=conn.prepareStatement(sql);
				prep.setString(1, page.getNumber());
				ResultSet rs=prep.executeQuery();
				if(rs.next()){
					count=rs.getInt("c");
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return count;
		}
	}

        service层:

//查询分页信息
	public List<Student> findByPage(stuPage page) throws SQLException{
		return dao.findByPage(page);
	}
	//查询总记录行数
	public int findRows(stuPage page) throws SQLException{
		return dao.findRows(page);
	}

        servlet层:

	//根据处理后的字符串来判断用户的请求
		if(path.equals("/stuList")){
			String number = request.getParameter("stuId");
			// 获取浏览器端传递的参数 要查询的页数
			String current = request.getParameter("current");
			// 创建一个分页信息
			stuPage page = new stuPage();
			if (number != null) {
				// 说明用户搜索时 提交了数据
				// 将搜索条件 放入到stuPage对象中
				if (number.length() != 0) {
					page.setNumber(number);
				}
			}
			try {
				// 查询总记录行数
				int rows = service.findRows(page);
				// 将查询出的总行数 添加到 page当中
				page.setRows(rows);
				// 判断current的值是否为null值 如果不是 null
				if (current != null) {
					int cur = Integer.parseInt(current);
					page.setCurrentPage(cur);
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			//调用业务层的代码  获取所有的员工信息
			List<Student> stus;
			try {
				stus = service.findByPage(page);
				request.setAttribute("stus", stus);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//将查询到的数据 传递给视图页面  由视图页面将数据返回给浏览器 展示在用户面前
			//step1  先将数据绑定到request对象上
			
			request.setAttribute("page", page);
			//step2 获取转发器
			RequestDispatcher dis=request.getRequestDispatcher("stuList.jsp");
			//step3 转发
			dis.forward(request, response);

        前端:

<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Student List</title>
<%@ include file="head.jsp" %>
</head>
<body>

	<table width='500px' border='5px' class="table" >
		
		<form action="toInquiryStu.do" method="post">
			<input placeholder="请输入您的学号" name="stuId" ><input type="submit" value="查询">
		</form>
		&ensp;
		<input type="button" class="button" value="添加" onclick="location='addStu.jsp'"/>
		
		
		<tr>
			<td>学号</td>
			<td>姓名</td>
			<td>班级</td>
			<td>语文</td>
			<td>数学</td>
			<td>英语</td>
			<td>总分</td>
			<td>操作</td>
		</tr>
		<%            
			//java代码
			//到request中取出 绑定的数据
			List<Student>stus=(List<Student>)request.getAttribute("stus");
			//循环迭代 数据并显示
			for(Student stu:stus){
		%>
		<tr>
			<td>
				<%=stu.getStuId() %>
			</td>
			<td>
				<%=stu.getStuName() %>
			</td>
			<td>
				<%=stu.getStuClass() %>
			</td>
			<td>
				<%=stu.getChineseScore() %>
			</td>
			<td>
				<%=stu.getMathScore() %>
			</td>
			<td>
				<%=stu.getEnglisScore() %>
			</td>
			<td>
				<%=stu.getEnglisScore()+stu.getMathScore()+stu.getChineseScore() %>
			</td>
			<td>
				<input type="button" class="button" value="删除" onclick="location='delStu.do?stuId=<%=stu.getStuId() %>'"/>
				<input type="button" class="button" value="修改" onclick="location='toUpdateStu.do?stuId=<%=stu.getStuId() %>'"/>
			</td>
		</tr>
		<%} %>
	</table>
					<%
						stuPage p=(stuPage)request.getAttribute("page");
						int cur=p.getCurrentPage();
						int totalPage=p.getTotalPage();
					%>
					<p>
						<%
							if(cur!=1){
						%>
							<a href="stuList.do?current=<%=cur-1%>">上一页</a>
						<%
							}						
						%>
						<%
							for(int i=1;i<=totalPage;i++){
						%>
						<a href="stuList.do?current=<%=i%>"><%=i %></a>
						<%
							}
						%>
						<%
							if(cur!=totalPage){
						%>
							<a href="stuList.do?current=<%=cur+1%>">下一页</a>
						<%
							}						
						%>
					</p>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺

小编今天和大家一起来学习HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺相关研究内容! 光克洛&#xff0c;第二代的光敏剂&#xff0c;可用于光动力疗法 (PDT)&#xff0c;基本结构为二氢卟吩类化合物。美国研究人员从绿色植物中提取、纯化&…

nginx笔记

作者&#xff1a;ThinkStu 文章目录一、简介二、常用配置1、listen2、server_name3、location4、sendfile5、nodelay/push6、add_header7、set 变量8、if9、return10、keepalive三、常用操作1、Gzip压缩2、正则表达式3、rewrite重写4、rewrite范例5、跨域6、防盗链7、适配移动设…

R语言数据可视化分析案例:探索BRFSS数据

最近我们被客户要求撰写关于BRFSS数据的研究报告&#xff0c;包括一些图形和统计输出。 加载包 library(tidyr) library(knitr) opts_chunk$set(echo TRUE, fig.align "center") 载入资料 load("brfss2013.RData")第1部分&#xff1a;数据 描述如何收…

Spring Boot ActuatorAdmin

Spring Boot Actuator&Admin 指标监控简介 干嘛的&#xff1a; 主要运用在微服务架构&#xff0c;所以我建议你先学微服务&#xff0c;否则可能get不到它的用处&#xff0c;只有大型的分布式系统才会用到指标监控… Why&#xff1a;&#xff1f; 对于一个大型的几十个、…

低代码如何自定义主题?一文教会你

SuccAP低代码开发平台&#xff0c;除了提供了多主题供选择外&#xff0c;还支持自定义报表主题&#xff0c;当系统自带的主题无法满足项目需求时&#xff0c;可以根据项目设计并新增主题&#xff0c;本文将介绍如何去新增自定义主题。 新增自定义主题可按如下步骤操作&#xf…

APS高级计划排程在乳制品行业的应用

目前乳制品行业供应链管理中存在的主要问题 生产盲目性&#xff0c;应对市场变化能力不足。现如今牛奶已经成为人们日常饮食需求的必需品&#xff0c;很多生产厂家就开始大量的生产&#xff0c;全然不顾市场的需求度&#xff0c;应对市场变化的能力不足&#xff0c;导致了有一…

计算机毕业设计ssm+vue基本微信小程序的心理服务平台 uniapp 小程序

项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中。传统模式的青少年心理健康管理满足不了现代人的生活追求,服务质量、服务速度,之前的很多网站由于功能、或者框架设计等原因,无法完美的展现它的特色,优势,浪费了很多资源。使用管理系统进行…

今天步行数5000多

今天步行数量比较多的&#xff0c;有五千多步吧&#xff0c;希望明天能继续保持下去。

企业知识分享系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

两种方案解决vscode浏览器跨域问题

一、 问题 1.1 在接收 json 数据的时候出现了以下错误&#xff1b; 打开测试用的 json 文件发现数据并没有问题&#xff0c;而第一个报错可以看到 Cross origin requests are only supported for protocol schemes&#xff1a;… &#xff0c;也就是说所使用的数据不在跨域的许…

毕业后5年,我终于变成了月薪13000的软件测试工程师

目录 我为什么选择转行 工作环境 我选择了转行软件测试 写在最后 《软件测试工程师发展规划路线》 一、测试基础 了解测试的基础技能&#xff0c;掌握主流缺陷管理工具的使用&#xff0c;熟练测试环境的操作与运维 二、Linux必备知识 Linux作为现在最流行的软件环境系…

场景案例│数字员工助力医疗行业打通信息系统壁垒,实现高效率运营

据埃森哲研究预测&#xff0c;到2026年人工智能技术每年将为医疗保健行业节省1500亿美元。 随着人们对数字化的需求日益增长&#xff0c;数字技术成为转型升级的新兴力量&#xff0c;许多医疗机构积极采用数字员工推进数字化转型的步伐。 在数字员工的支持下&#xff0c;医疗…

Redis Replication

高可用架构-Redis Replication 今天学习下如何基于Redis 复制功能构建高可用架构-主从复制&#xff0c;Redis Replication 支持数据复制和故障切换。Redis复制是允许Redis实例完全复制主实例的过程。默认情况下&#xff0c;复制是一个异步过程。Redis复制在主机端和副本端都是…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业设计选题档案管理系统bvr3c

毕业设计其实不难&#xff0c;主要毕业的时候任务太紧了&#xff0c;所以大家都非常忙没有时间去做&#xff0c;毕业设计还是早做准备比较好&#xff0c;多花点时间也可以做出来的&#xff0c;建议还是自己动手去做&#xff0c;比如先选一个题&#xff0c;这样就有方向&#xf…

Flutter实现文件上传华为对象存储(OBS)

本文主要讲述在 Flutter 项目中如何实现将文件上传到华为 OBS&#xff08;对象存储&#xff09;中&#xff0c;并封装为三方库方便灵活使用。 背景介绍 在大多项目中都会存在文件上传的需求&#xff0c;之前的实现都是调用后台的文件上传接口将文件上传到服务器上&#xff0c;…

从投资人发现“新大陆”,看“产融星城”为何成?

文丨熔财经 作者|陈小江 “我从来不把《我要投资》节目看作是秀&#xff08;综艺&#xff09;&#xff0c;要知道《我要投资》是在前面的&#xff0c;秀&#xff08;综艺&#xff09;只是一种形式而已。本质上&#xff0c;&#xff08;参加节目&#xff09;还是为了投资”。 …

「Redis数据结构」跳跃表(SkipList)

「Redis数据结构」跳跃表&#xff08;SkipList&#xff09; 文章目录「Redis数据结构」跳跃表&#xff08;SkipList&#xff09;一、概述二、结构跳跃表节点跳跃表三、特点一、概述 跳表&#xff08;SkipList&#xff0c;全称跳跃表&#xff09;是用于有序元素序列快速搜索查找…

shell编程二

目录语法引号exprtestif...then...fiif...elseif...elseif嵌套case…esacforwhilebreak 和 continue函数语法 引号 " ":如果有字符串&#xff0c;字符串原样输出&#xff0c;如果有$变量则查看变量的值 :所有的字符无论是否有变量都原样输出 ˋˋ:在该引号包含的…

如何批量查询网站的搜狗收录情况?搜狗收录么查询

如何批量查询网站的搜狗收录情况&#xff1f;搜狗收录么查询 查询网站的搜狗收录的具体操作&#xff1a; 第一步、打开网站综合查询工具 第二步、添加需要查询的网站域名 第三步、勾选要查询的功能&#xff08;勾选搜狗是否收录和搜狗总收录&#xff09; 第…

redis 主从复制(读写分离)集群搭建(含错误处理)

目录 1.概述 2.搭建 2.1.安装配置 2.2.认主 2.3.错误处理 3.原理 1.概述 当面临大流量时&#xff0c;redis可以采取集群的方式进行扩容&#xff0c;将压力分散到集群中的多个结点上去防止redis被打挂。redis的扩容方式有两种&#xff1a; 垂直扩容&#xff0c;即读写分离…