提供一个数据库的表,然后,分页显示表中所有信息,一页10个,此表130条信息。最后再以饼图显示男 女 未知 人数的情况。

 

运行之后显示的效果:

如果是新项目,建立项目后,把mysql驱动放到指定的目录下即:

WebContent\WEB-INF-lib

我用的驱动是 mysql-connector-j-8.0.33.jar

展示页

listpage.jsp

<%@page import="java.util.Map.Entry"%>
<%@page import="week18.util.PageUtil"%>
<%@page import="week18.biz.StuBizImpl"%>
<%@page import="week18.entity.*"%>
<%@page import="java.util.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
    <% 
    
    String page1=request.getParameter("page");
    
    int pageNum =  1;
    if(page1==null)
    	pageNum =  1;
    else
    	pageNum = Integer.parseInt(page1);
    
	StuBizImpl sbi= new StuBizImpl();
	int pageSize=20;
	int currIndex =pageNum;
	int totalCount=sbi.SelectCount();
	PageUtil pageUtil = new PageUtil( pageSize,  currIndex,  totalCount);
	List<Stu> list=sbi.SelectByPage(pageUtil.getStart(), pageUtil.getPageSize());	
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>分页显示记录</title>
<style type="text/css">
p{
text-align: center;
color:red;
}
table{
width:100%;
background-color: green;
text-align: center;
}

.d1{
text-align: right;
}
</style>

<script src="https://cdn.staticfile.org/Chart.js/3.9.1/chart.js"></script>
</head>
<body>
<div>
<canvas id="myChart" width="400" height="400"></canvas>
</div>
<p></p>
<p></p>
<p></p>
<p></p>
<p>人员名单相关信息</p>
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>成绩</th>
</tr>
<%for(Stu stu:list) {%>
<tr>
<td><%=stu.getId() %></td>
<td><%=stu.getName() %></td>
<td><%=stu.getSex() %></td>
<td><%=stu.getScore() %></td>
</tr>
<%} %>
</table>

<div class="d1">
<a href="listpage.jsp?page=1">第一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getCurrIndex()-1%>">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getCurrIndex()+1%>">下一页</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="listpage.jsp?page=<%=pageUtil.getTotalPage()%>">最后页</a>&nbsp;&nbsp;&nbsp;&nbsp;
(<%=pageUtil.getCurrIndex() %>/<%=pageUtil.getTotalPage() %>)
</div>

<%
Map<String,Integer> map=sbi.SexConut();

String keyStr="",valStr="";
for(Entry<String,Integer> entry:map.entrySet()){
	String key=entry.getKey();
	Integer value=entry.getValue();
	keyStr+="'"+key+"',";
	valStr+=value+",";
}
%>


<script>
const ctx = document.getElementById('myChart');
const data = {
  labels: [
	  <%=keyStr%>
  ],
  datasets: [{
    label: '不同性别占比情况',
    data: [<%=valStr%>],
    backgroundColor: [
      'rgb(255, 99, 132)',
      'rgb(54, 162, 235)',
      'rgb(255, 205, 86)'
    ],
    hoverOffset: 4
  }]
};
const config = {
  type: 'pie',
  data: data,
  options: {
    responsive: true, // 设置图表为响应式,根据屏幕窗口变化而变化
    maintainAspectRatio: false,// 保持图表原有比例
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero:true
		}
	  }]
    }
  }
};
const myChart = new Chart(ctx, config);
</script>

</body>
</html>

工具类

连接库的工具

package week18.util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
	private final static String driver = "com.mysql.cj.jdbc.Driver";                      // 数据库驱动
	    private final static String url    = "jdbc:mysql://mysql.sqlpub.com:3306/huangjin";   // url
	    private final static String dbName = "laocooon";                                      // 数据库用户名
	    private final static String dbPass = "fc12f7a5215e8e0a";                              // 数据库密码
	    
	    private static Connection        conn  = null;
	    private static PreparedStatement pstmt = null;			        
	    private static ResultSet         rs    = null;

	    public static Connection getConn() throws Exception{
	        Class.forName(driver);                                     //注册驱动
	        return DriverManager .getConnection(url,dbName,dbPass);   //获得数据库连接并返回
	    }
	    public static void closeAll( Connection conn, PreparedStatement pstmt, ResultSet rs ) throws Exception {	        
	        if(rs != null) rs.close();
	        if(pstmt != null) pstmt.close();
	        if(conn != null) conn.close();
	    }
	    
	    public static void closeAll( Connection conn, PreparedStatement pstmt) throws Exception {
	        if(pstmt != null) pstmt.close();
	        if(conn != null) conn.close();
	    }
	    
	    
	    //直接关静态成员的资源
	    public static void closeAll() throws Exception {	        
	    	closeAll(conn,pstmt,rs);// 关 17 18 19行的资源的
	    }
	    
	  //增删改  返回多少条发生了变化,如果0表示没变化
	    public static int executeUpdataSQL(String sql,String[] param)throws Exception {
			Connection        conn  = null;
			PreparedStatement pstmt = null;			        
			
			conn = getConn();                         
			pstmt = conn.prepareStatement(sql);    
			    
			for( int i = 0; i < param.length; i++ ) 
				pstmt.setString(i+1, param[i]);
			
			int num  = pstmt.executeUpdate();
			closeAll(conn,pstmt);
			
			return num;
	    }
	    
	    
	    //调用此代码,使用完 记录集的内容之后,通过  closeAll();
	    public static ResultSet executeQuerySQL(String sql,String[] param)throws Exception {
	    	closeAll();
			conn = getConn();                         
			pstmt = conn.prepareStatement(sql);    
			    
			for( int i = 0; i < param.length; i++ ) 
				pstmt.setString(i+1, param[i]);			
			rs  = pstmt.executeQuery();		
			return rs;
			
	    }
	    
}

 

分页工具

package week18.util;

public class PageUtil {
	private int pageSize;//一页有多少条
	private int currIndex;//当前是第几页
	private int totalCount;//共有多少条记录  谁给我? 逻辑层的 getTotalCount
	private int totalPage;//共有多少页	
	private int start;//显时时开始的位置
	
	
	//构造方法时,需要提供什么参数  一页多少个,当前第几页,一共多少条
	public PageUtil(int pageSize, int currIndex, int totalCount) {
		this.pageSize = pageSize;
		this.currIndex = currIndex;
		this.totalCount = totalCount;
	}
 
 
	public int getPageSize() {
		return pageSize;
	}
 
 
	public int getCurrIndex() {
		currIndex=currIndex<1?1:currIndex;//如果当前页小于1,则为1
		currIndex=currIndex>getTotalPage()?getTotalPage():currIndex;//如果当前页大于总页数	
		
		return currIndex;
	}
 
 
	public int getTotalCount() {
		return totalCount;
	}
 
 
	public int getTotalPage() {
		return totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
	}
 
 
 
	public int getStart() {
		return (getCurrIndex()-1)*pageSize;//开始的位置=(当前页-1)*一页的数;
	}
 
 
	@Override
	public String toString() {
		return "PageUtil [pageSize=" + pageSize + ", currIndex=" + currIndex + ", totalCount=" + totalCount
				+ ", totalPage=" + totalPage + ", start=" + start + ", toString()=" + super.toString() + "]";
	}
 
}

实体包的   VO类

package week18.entity;

public class Stu {
	private int id;
	private String name,sex;
	private int score;
	
	public Stu() {
		
	}
	public Stu(int id, String name, String sex, int score) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.score = score;
	}
	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 String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Stu [id=" + id + ", name=" + name + ", sex=" + sex + ", score=" + score + ", toString()="
				+ super.toString() + "]";
	}
}

数据交换层的dao包

package week18.dao;

import java.util.List;
import java.util.Map;

import week18.entity.Stu;

public interface IStuDao {
	//总记录数
	public int SelectCount() throws Exception;
	
	//n位置开始后的指定条记录
	public List<Stu> SelectByPage(int start,int pageSize) throws Exception;
	
	
	//不同性别的人数
	public Map<String,Integer> SexConut() throws Exception;

}
package week18.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import week18.entity.Stu;
import week18.util.BaseDao;

public class StuDaoImpl implements IStuDao {
	private Connection conn=null;
	private PreparedStatement pstmt=null;
	ResultSet rs=null;

	@Override
	public int SelectCount() throws Exception {
		
		String sql="SELECT COUNT(*) FROM stu";		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);	
		rs=pstmt.executeQuery();
		int count = 0;
		if(rs.next()) {
			count =  rs.getInt(1);
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return count;
	}
	

	@Override
	public List<Stu> SelectByPage(int start, int pageSize) throws Exception {
		List<Stu> list=new ArrayList<Stu>();
		String sql="SELECT * FROM Stu LIMIT ?,?";
		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);		
		pstmt.setInt(1, start);
		pstmt.setInt(2, pageSize);
		rs=pstmt.executeQuery();
		while(rs.next()) {
			Stu Stu = new Stu();
			Stu.setId(rs.getInt(1));
			Stu.setName(rs.getString(2));
			if(rs.getString(3)!=null)
				Stu.setSex(rs.getString(3));
			else
				Stu.setSex("未知");
			Stu.setScore(rs.getInt(4));
			list.add(Stu);
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return list;
	}

	@Override
	public Map<String, Integer> SexConut() throws Exception {
		 Map<String, Integer> map=new HashMap<String, Integer>();
		String sql="SELECT COALESCE(sex, '未知') AS sex, COUNT(*) AS count FROM stu GROUP BY sex;";
		
		conn=BaseDao.getConn();
		pstmt=conn.prepareStatement(sql);
		rs=pstmt.executeQuery();
		while(rs.next()) {
			map.put(rs.getString(1), rs.getInt(2));			
		}
		BaseDao.closeAll(conn,pstmt,rs);
		return map;
	}

}

业务逻辑层的 biz包

package week18.biz;

import java.util.List;
import java.util.Map;

import week18.entity.Stu;

public interface IStuBiz {
	//总记录数
	public int SelectCount() throws Exception;
	
	//n位置开始后的指定条记录
	public List<Stu> SelectByPage(int start,int pageSize) throws Exception;
	
	
	//不同性别的人数
	public Map<String,Integer> SexConut() throws Exception;
	
		

}
package week18.biz;

import java.util.List;
import java.util.Map;

import week18.dao.IStuDao;
import week18.dao.StuDaoImpl;
import week18.entity.Stu;

public class StuBizImpl implements IStuBiz {
	IStuDao sd = null;
	
	

	public StuBizImpl() {
		sd=new StuDaoImpl();
	}

	@Override
	public int SelectCount() throws Exception {
		// TODO Auto-generated method stub
		return sd.SelectCount();
	}

	@Override
	public List<Stu> SelectByPage(int start, int pageSize) throws Exception {
		// TODO Auto-generated method stub
		return sd.SelectByPage(start, pageSize);
	}

	@Override
	public Map<String, Integer> SexConut() throws Exception {
		// TODO Auto-generated method stub
		return sd.SexConut();
	}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

break用法

break他是用于从循环语句中跳出一层循环体的&#xff0c;提前结束循环 但是值得注意的点事break只能用在循环语句和switch当中 那么我们上代码进行具体的理解&#xff1a; 如果圆的面积大于100就会终止循环&#xff0c;那么如何体现出他只能终结一个循环呢&#xff0c;请看下…

独立站低成本流量:优化用户体验,实现精准营销

在当今的数字化时代&#xff0c;获取流量是每个网站成功的关键。然而&#xff0c;随着竞争的加剧&#xff0c;流量获取的成本也在逐渐上升。对于许多独立站来说&#xff0c;如何低成本的获取流量变得越来越具有挑战性。本文Nox聚星将和大家探讨独立站如何通过网站优化和精准营销…

3. 内容模块管理 - 异常处理与校验

文章目录 内容模块管理一、自定义异常1.1 全局异常处理器1.2 自定义异常1.3 异常统一响应类1.4 封装通用异常信息 二、JSR303校验2.1 Maven坐标2.2 校验规则2.3 代码示例2.4 捕捉校验异常2.5 分组校验2.6 备注 三、全局异常处理23.1 全局异常处理器3.2 结果集3.3 常用注解3.3.1…

拷贝的艺术:深拷贝与浅拷贝的区别与应用(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

虚拟电厂 能源物联新方向

今年有多热&#xff1f;据上海市气象局官微消息&#xff0c;5月29日13时09分&#xff0c;徐家汇站气温达36.1℃&#xff0c;打破了百年来的当地5月份气温*高纪录。不仅如此&#xff0c;北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

LED 底层原理 和 GPIO引脚、寄存器操作

目录 LED 原理 LED 的驱动方式 普适的 GPIO 引脚操作方法 GPIO 寄存器操作 LED 原理 当我们学习 C 语言的时候&#xff0c;我们会写个 Hello 程序。 那当我们写 ARM 程序&#xff0c;也该有一个简单的程序引领我们入门&#xff0c;这个程序就是点亮 LED。 我们怎样去点亮…

Java 中 IO 流

目录 前言 1. 字节流&#xff08;Byte Streams&#xff09;&#xff1a; 1.1 输入字节流&#xff1a; 1.2 输出字节流&#xff1a; 2. 字符流&#xff08;Character Streams&#xff09;&#xff1a; 2.1 输入字符流&#xff1a; 2.2 输出字符流&#xff1a; 3. 转换流&…

如何一键生成多个文件二维码?批量文件二维码制作技巧

文件能批量生成二维码吗&#xff1f;现在的二维码用途范围越来越广&#xff0c;比如常见的有图文、文件、问卷、音频或者视频等内容生成二维码图片&#xff0c;扫码查看内容。那么当需要将很多的文件每个都单独生成一个二维码时&#xff0c;有没有比较简单快捷的操作方法吗&…

SELinux介绍

本章主要介绍在RHEL8中如何使用 SELinux。 了解什么是 SELinux了解 SELinux 的上下文配置端口上下文了解SELinux的布尔值了解SELinux的模式 在 Windows系统中安装了一些安全软件后&#xff0c;当执行某个命令时&#xff0c;如果安全软件认为这个命令对系统是一种危害&#…

二维差分详解

前言 上一期我们分享了一维差分的使用方法&#xff0c;这一期我们将接着上期的内容带大家了解二位差分的使用方法&#xff0c;话不多说&#xff0c;LET’S GO!&#xff08;上一期链接&#xff09; 二维差分 二维差分我们可以用于对矩阵区间进行多次操作的题。 二维差分我们还…

使用国内镜像源安装opencv

在控制台输入命令&#xff1a; pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 验证安装&#xff1a; step 1&#xff1a; 打开终端&#xff1b;step 2&#xff1a; 输入python&#xff0c;进入Python编译环境&#xff1b;step 3&#xff1a; 粘贴…

LT8711HE方案《任天堂Switch底座方案》

LT8711HE Type-c转HDMI方案 LT8711HE是高性能的Type-C/DP1.2转HDMI2.0转换器&#xff0c;设计用于连接 USB Type-C 源或 DP1.2 源到 HDMI2.0 接收器。该LT8711HE集成了符合 DP1.2 标准的接收器和符合 HDMI2.0 标准的发射器。此外&#xff0c;两个 CC 控制器是包括用于 CC 通信以…

20.Java程序设计-基于SSM框架的安卓掌上校园生活系统的设计与实现

摘要&#xff1a; 随着移动互联网技术的快速发展&#xff0c;校园生活信息化成为提高学校管理效率、方便学生生活的关键。本研究以基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的技术体系为基础&#xff0c;致力于设计与实现一款功能强大、高效稳定的安卓…

手动添加Git Bash Here到右键菜单(超详细)

通过WindowsR快捷键可以打开“运行窗口”&#xff0c;在“窗口”中输入“regedit”&#xff0c;点击“确定”打开注册表。 依次进入HKEY_CLASSES_ROOT —-》 Directory —-》Background —-》 shell 路径为Computer\HKEY_CLASSES_ROOT\Directory\Background\shell 3.在“s…

来聊聊Spring的循环依赖

文章目录 首先了解一下什么是循环依赖简述解决循环依赖全过程通过debug了解Spring解决循环依赖全过程Aservice的创建递归来到Bservice的创建然后BService递归回到了getAservice的doGetBean中故事再次回到Aservice填充BService的步骤 总结成流程图为什么二级就能解决循环依赖问题…

2023年底总结丨5大好用的局域网监控软件

不知不觉间2023年又到结尾了&#xff0c;今年我们服务过很多想要电脑监控软件的客服&#xff0c;也服务了很多想要加密软件的客户。 这一年&#xff0c;我们走得不疾不徐&#xff0c;走得稳而坚定&#xff1b;这一年&#xff0c;我们累积服务超过万计客户&#xff1b;这一年&a…

面试官:这些大学生都会

大家好&#xff0c;我是 JavaPub。 最近有些同学在后台问我&#xff0c;面试总是会遇到被问 Linux 命令的问题&#xff0c;自己就面试个后端开发岗位&#xff0c;怎么这么难呢&#xff1f; 其实 Linux 命令&#xff0c;对于一个后端开发来说&#xff0c;并不是很难&#xff0c…

springcloudalibaba01

整合springcloud 和 springcloudalibaba&#xff0c;&#xff0c;&#xff0c; 版本对应关系 <dependencyManagement><dependencies><!--每个springcloud的工具都有一个版本每个springcloud alibaba的工具都有一个版本统一版本--> <!-- 整合…

spring boot 实现直播聊天室

spring boot 实现直播聊天室 技术方案: spring bootwebsocketrabbitmq 使用 rabbitmq 提高系统吞吐量 引入依赖 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.42&…

广州华锐互动:汽车电子线束加工VR仿真培训与实际生产场景相结合,提高培训效果

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为企业和个人带来了前所未有的便利。在汽车制造行业中&#xff0c;线束加工作为一项关键的生产工艺&#xff0c;其质量直接影响到汽车的性能和安全。因此&#xff0c;…