jsp实现增删改查——(三)用Echarts图表统计学生信息

news2024/11/22 9:50:59

学生信息CRUD——Echarts显示生活费

目录结构

image-20240403155227034

创建一个js文件夹,将echarts.min.js放到里面。

功能实现

与之前我们写的jsp文件(含有html代码、Java代码)不同的是,实现Echarts对生活费的显示,需要调用echarts.min.js,需要使用javascriptjs代码。

js代码的书写

使用标签<script></script>

head内容

<head>
    <title>学生生活费统计</title>
    <script src="../js/echarts.min.js"></script>
</head>

在head部分,需要用<script>标签将我们的echarts.min.js文件引入。

body内容

1.html代码
//html代码
<div id="show" style="width: 800px; height: 600px"></div>

说明

  • id:随便取一个就行。
  • style:必须设置一个长和宽,否则会显示不出来。
  • div的作用:为之后我们的echarts画出一块显示范围。因此,<div>标签的划定必须在图表的显示之前给出才可以。
2.js代码
<script>
	//js代码
    var mychart = echarts.init( document.getElementById("show") );
</script>

说明:

  • mychart是变量名,自己随便取即可。
  • echarts.init()方法,进行图表的初始化工作。
  • echarts.init()方法括号内的参数,即为“在哪个html区域进行初始化”,因此,通过js提供的document.getElementById(“show”)来获取我们刚才划分好的div区域,在此区域上进行init初始化工作。
<script>
	//js代码
    var mychart = echarts.init( document.getElementById("show") );
    
    //创建图表的配置项和数据
    var option = {
        title: {
            text: '学生生活费统计表'
        },
        tooltip:{},
        legend: {
            data:['元']
        },
        xAxis: {
            data: <%=xdata%>	// ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
            name: '元',
            type: 'bar',
            data: <%=ydata%>	//[5, 20, 36, 10, 10, 20]
        }]   
    };
</script>

说明:

  • 有哪些参数,各个参数的功能、应该怎样配置,Echarts有对应官方文档,可自行查阅。
  • 对于各个参数的设置,即Key-Value键值对,是要依照文档规定来的,例如Key,它提供了哪些,就是哪些,不能自己编没有的Key出来,也不能将原有的Key作更改。Value也要按规定进行合法的赋值。
  • var option = {}的内容,实际上采用的是JSON语法。
  • var option = {}的具体内容,不需要背诵,复制粘贴过来之后会修改即可。
  • 其中参数的含义说明:
    • title:该图表的标题
    • tooltip:不知道。
    • legend:图例。
    • xAxis:横坐标轴上的数据信息。格式如:["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
    • yAxis:纵坐标轴上的数据信息。
    • series:
      • name:把鼠标放在图表的柱、饼上面时,显示的信息。
      • type:图表类型,柱状图、饼状图……。
      • data:横轴各数据信息对应在纵轴的数值数据。格式如:[5, 20, 36, 10, 10, 20]

注意

1.对于legend中的data,即“图例”;以及series中的name,即鼠标悬停时显示的信息。它们两个的内容必须一致,比如图例上显示的是”元“,那么鼠标悬停也要显示”元“。若不一致,则图例会消失、不显示,只有鼠标悬停时显示的信息。

2.对于xAxis中的data,以及series中的data,无论是["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],还是[5, 20, 36, 10, 10, 20],其本质都是String类型的字符串

也就是说,对于静态传参而言,你传递的是[5, 20, 36, 10, 10, 20]

那么,如果你想让它动态变化,从数据库拿数据,那你就把数据取出来之后加工成与[5, 20, 36, 10, 10, 20]一模一样的字符串就可以了。即:一个"["、一个"5"、一个","、一个"20"、……、一个"20"、一个"]"。多一个字符、少一个字符都不行。

对于["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],本质的原理同上,但它的不同之处在于,当你使用String字符串类型来保存这一串字符的时候,由于其中有双引号,而双引号内部不能有双引号,因此,双引号内部的双引号需要加上转义字符,即:

String str1 = "[\"衬衫\",\"羊毛衫\",\"雪纺衫\",\"裤子\",\"高跟鞋\",\"袜子\"]"

所以,在它进行传参的时候,也要把转义字符带上。

这样看上去比较麻烦,我们其实也有更好的方法。——由于双引号中不能有双引号,因此必须加转义字符。但是,双引号中可以有单引号,我们使用单引号也是一样的效果。即:

String str2 = "['衬衫','羊毛衫','雪纺衫','裤子','高跟鞋','袜子']"

3.我们代码当中的<%=xdata%><%=ydata%>,其中的xdataydata是我们写的Java代码所提供的变量。(下文有)——因此,Java代码也要写在前面才可以。

<script>
	//js代码
    var mychart = echarts.init( document.getElementById("show") );
    
    //创建图表的配置项和数据
    var option = {
        title: {
            text: '学生生活费统计表'
        },
        tooltip:{},
        legend: {
            data:['元']
        },
        xAxis: {
            data: <%=xdata%>	// ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
            name: '元',
            type: 'bar',
            data: <%=ydata%>	//[5, 20, 36, 10, 10, 20]
        }]   
    };

	//将我们写好的option交给echarts
    mychart.setOption(option);
</script>

最后,使用mychart.setOption(option);将我们编辑好的option设置完成。其中,mychart是init出来的初始化图表对象。

3.Java代码

与jsp中的Java代码一样,用<% %>括起来写。

首先思考,对于“生活费统计图表”而言,我们想要将数据动态地显示到图表内,需要从数据库获取到的数据为:

1)横轴:各个学生的姓名,即表中的sname字段。

2)数值:各个学生的生活费,即表中的money字段。

这个很容易,就与之前我们做的“查询、修改、删除”一样,链接数据库,执行SQL语句……即可。

但问题在于,我获取了sname,我获取了money,之后怎么以正确的格式显示到图表上?

重点:因此,关键之处就在于,怎样能够将数据库中查询到的数据,转换为echarts规定能够接收的赋值形式,即符合接收格式的String字符串,即类似于

"['衬衫','羊毛衫','雪纺衫','裤子','高跟鞋','袜子']"

[5, 20, 36, 10, 10, 20]

这样的字符串。每个中括号、每个引号、每个逗号,都不能多、也不能少。

因此,要会使用Java的字符串相关操作,如:截取子串函数substring(起始索引, 末尾索引);利用"+"操作符来拼接字符串……等等。

另外,可以使用System.out.println(str)先打印显示一下看看字符串对不对,确认字符串格式正确了,传给图表,图表就一定能显示出来了。而不要改一次就运行一次然后直接去看图表能不能出的来。

链接数据库

Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");

执行SQL语句

PreparedStatement pstmt = conn.prepareStatement("select * from student");
ResultSet rs = pstmt.executeQuery();

处理数据

已经获取到rs数据集合,从中遍历,并调整字符串拼接格式即可。

//前中括号先赋值进来
String xdata = "[";
String ydata = "[";

//读出每个字段的值的同时,进行格式调整,例如加引号、加逗号等
while(rs.next())
{
    xdata += "'" + rs.getObject("sname") + "',";	//看清楚是几个单引号、几个逗号。不要乱打空格。
    ydata += rs.getObject("money") + ",";
}

//经过while循环获得的数据有一个问题:最后会多出来1个逗号,我们要把这1个逗号给去掉
//方法:使用“截取子串substring()”函数,把最后一个逗号去掉
//字符串从0开始好说,怎样知道字符串最后一个字符的位置?用str.length()即可。注意下标。
xdata = xdata.substring(0, xdata.length()-1);
ydata = ydata.substring(0, ydata.length()-1);

//最后再把后中括号补上
xdata += "]";
ydata += "]";

//可以在控制台输出一下字符串看看对不对
//System.out.println(xdata);
//System.out.println(ydata);

关闭链接

rs.close();
pstmt.close();
conn.close();

完整代码

<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %><%--
  Created by IntelliJ IDEA.
  User: 11202
  Date: 2024/4/3
  Time: 16:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>学生生活费统计表</title>
    <script src="../js/echarts.min.js"></script>
</head>
<body>
    <%
        //Java代码
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
        PreparedStatement pstmt = conn.prepareStatement("select * from student");
        ResultSet rs = pstmt.executeQuery();

        //数据处理成符合要求的字符串
        String xdata = "[";
        String ydata = "[";

        while(rs.next()) {
            xdata += "'" + rs.getObject("sname") + "',";
            ydata += rs.getObject("money") + ",";
        }

        //把最后多余的一个逗号去除掉,使用substring截取子串来实现
        xdata = xdata.substring(0, xdata.length()-1);
        ydata = ydata.substring(0, ydata.length()-1);

        //把后括号补上
        xdata += "]";
        ydata += "]";

        //关闭链接
        rs.close();
        pstmt.close();
        conn.close();
    %>

    <!-- html代码 -->
    <div id="show" style="width: 900px; height: 600px"></div>

    <script>
        //js代码
        var mychart = echarts.init( document.getElementById("show") );

        //配置图表的option
        var option = {
            title: {
                text: '学生生活费统计表'
            },
            tooltip: {},
            legend: {
                data: ['元']
            },
            xAxis: {
                data: <%=xdata%>
            },
            yAxis: {},
            series: [{
                name: '元',
                type: 'bar',
                data: <%=ydata%>
            }]
        };

        //将option应用到echarts
        mychart.setOption(option);
    </script>

</body>
</html>

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

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

相关文章

MySQL事务以及并发访问隔离级别

MySQL事务以及并发问题 事务1.什么是事务2.MySQL如何开启事务3.事务提交方式4.事务原理5.事务的四大特性&#xff08;ACID&#xff09; 事务并发问题1.并发引起的三个问题2.事务隔离级别 事务 在 MySQL 中&#xff0c;事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统&…

关于搭建电商独立站跨境电商接入主流电商平台API商品接口对于商品功能模块的巨大应用

功能设计 首先我们来看下mall项目中商品功能的设计&#xff0c;主要包括商品管理、添加\编辑商品、商品分类、商品类型、品牌管理等功能&#xff0c;这里的功能同时涉及前台商城和后台管理系统。 商品管理【接入主流电商平台商品API接口丰富自建商城商品】 在mall项目的后台管…

微信批量群发软件有哪款比较好用的?

微信有自带的群发助手&#xff0c;只能群发200个好友&#xff0c;比较有局限性。 我是做销售的&#xff0c;对于群发的需求特别大&#xff0c;我自己平时经常用WeB微信批量群发软件有哪款比较好用的&#xff1f;WeB&#xff0c;它满足了我的群发需求&#xff0c;用起来特别方便…

cocos 3.x版本如何基于ts在检视面板显示Enum枚举类型下拉列表

前言 网上搜索到的大多是基于js或者旧版本cocos。这里记录一下ts显示Enum的方案&#xff0c;cocos版本使用的3.8.2。 解决方案 方案一&#xff1a; import { _decorator, Component, TweenEasing } from cc; const { ccclass, property } _decorator;const MyTweenEasing …

C#.net6.0手术麻醉信息管理系统源码,智慧手术室管理平台源码

手术麻醉信息管理系统源码&#xff0c;自主版权的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前…

春秋云境CVE-2023-0562

简介 银行储物柜管理系统是一个基于网络的应用程序&#xff0c;用于处理存储银行客户贵重物品的银行储物柜。储物柜的所有详细信息都保存在数据库中。银行储物柜管理系统项目是使用 PHP 和 MySQLi 扩展开发的。 正文 进入靶场&#xff0c;首先就看到有个bankers&#xff0c;…

真快乐APP抢购源码实现

支持多个平台的自动 滑动验证码、选字验证码。缺点就是需要自己找一个验证码识别服务器,可以自己用python写一个,或者使用超级鹰(本篇教程就是使用它) 下面是实现源码 "ui"; Date.prototype.Format = function (fmt) {var o = {"M+": this.getMonth() …

常用的限流方案思路和实现

限流方案 1、计数器&#xff08;固定窗口&#xff09; 1.1、简介 计数器固定窗口算法是最基础也是最简单的一种限流算法。原理就是对一段固定时间窗口内的请求进行计数&#xff0c;如果请求数超过了阈值&#xff0c;则舍弃该请求&#xff1b;如果没有达到设定的阈值&#xf…

STM32学习笔记(10_1)- I2C通信协议

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

JMeter+Grafana+influxdb 配置出现transaction无数据情况解决办法

JMeterGrafanainfluxdb 配置出现transaction无数据情况解决办法 一、问题描述二、解决方法 一、问题描述 如下图所示出现application有数据但是transaction无数据情况 二、解决方法 需要做如下设置 打开变量设置如下图打开两个选项 然后再进行后端监听器的设置 如下图所…

【VUE】ruoyi框架自带页面可正常缓存,新页面缓存无效

ruoyi框架自带页面可正常缓存&#xff0c;新页面缓存无效 背景&#xff1a; 用若依框架进行开发时&#xff0c;发现ruoyi自带的页面缓存正常&#xff0c;而新开发的页面即使设置了缓存&#xff0c;当重新进入页面时依旧刷新了接口。 原因&#xff1a;页面name与 getRouters …

3个 JavaScript 字符串截取方法

在 JavaScript 中&#xff0c;可以使用 substr()、slice() 和 substring() 方法截取字符串. substring() substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集&#xff0c;或从开始索引直到字符串的末尾的一个子集。语法如下&#xff1a; str.substring(inde…

GT收发器64B66B设计(1)IP核配置和example design

文章目录 前言一、IP核配置1.1、编码方式1.2、字节对齐和逗号码 二、example design 前言 在前面我们基于GT收发器进行了PHY层设计&#xff0c;其中采用的编码方式为8B10B&#xff0c;为进一步提高传输效率&#xff0c;从本文开始&#xff0c;将采用基于GT高速收发器采用64B66…

DC/DC选型:了解电感参数的基本含义

电感是一种相对简单的元件&#xff0c;它由缠绕在线圈中的绝缘线组成。但当单个元件组合在一起&#xff0c;用来创建具有适当尺寸、重量、温度、频率和电压的电感&#xff0c;同时又能满足目标应用时&#xff0c;复杂性就会增加。 选择电感时&#xff0c;了解电感数据手册中标…

京西商城——基于viewset视图集开发评论接口

在使用GenericAPIView和Mixins开发时&#xff0c;确实可以大大提高编码的速度以及减少代码量&#xff0c;但是在一个视图里并不能实现5个基础的请求方法&#xff0c;要用两个视图类来完成。所以我们可以使用viewset&#xff08;视图集&#xff09;来将两个视图类合并 如果要使…

Docker实战教程 第2章 Docker基础

3-1 Docker介绍 什么是Docker 虚拟化&#xff0c;容器 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&…

职场聚餐:搭建沟通桥梁,促进团队凝聚力

在职场中&#xff0c;聚餐作为一种非正式的社交活动&#xff0c;不仅能够增进同事间的了解&#xff0c;还有助于提升团队凝聚力。本文将探讨职场聚餐的重要性以及如何组织一场成功的职场聚餐。 一、职场聚餐的重要性 1. 搭建沟通桥梁&#xff1a;职场聚餐为员工提供了一个轻松愉…

Java中线程详解

文章目录 相关概念多线程概念实现方式继承Thread类实现Runnable接口比较 常用方法线程安全产生的原因解决思想同步同步代码块同步方法Lock锁机制 死锁概念避免 状态线程间的通讯介绍方法 相关概念 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行并发&a…

【JAVASE】学习类与对象的创建和实例化

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 掌握类的定义方式以及对象的实例化 2. …

QML嵌套页面的实现学习记录

StackView是一个QML组件&#xff0c;用于管理和显示多个页面。它提供了向前和向后导航的功能&#xff0c;可以在堆栈中推入新页面&#xff0c;并在不需要时将页面弹出。 ApplicationWindow {id:rootvisible: truewidth: 340height: 480title: qsTr("Stack")// 抽屉:…