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

学生信息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>

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

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

相关文章

Java中线程详解

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

为什么拼音命名在编程中不被推荐?

为什么拼音命名在编程中不被推荐? 在学习编程的过程中&#xff0c;命名变量、函数和类等是一个重要的环节。然而&#xff0c;专业的编程教材和经验都强烈建议不要使用拼音来命名&#xff0c;并且拼音命名常常被教育和经验严厉禁止。本文将探讨为何学编程时不推荐使用拼音命名&…

Spring注解@EventListener实现监听原理

文章目录 EventListener使用方式EventListener实现原理1.引入时机-获取bean定义2 实例化时机-new对象3 作用时机->将加了EventListener注解的方法识别出来&#xff0c;并封装为监听器&#xff0c;加载spring容器中 总结 EventListener使用方式 package com.cyl.listener;im…

嵌入式中常见的面试题分享

1.关键字static的作用是什么&#xff1f;为什么static变量只初始化一次&#xff1f; 1&#xff09;修饰局部变量&#xff1a;使得变量变成静态变量&#xff0c;存储在静态区&#xff0c;存储在静态区的数据周期和程序相同&#xff0c; 在main函数开始前初始化&#xff0c;在退…

权限提升技术:攻防实战与技巧

本次活动赠书1本&#xff0c;包邮到家。参与方式&#xff1a;点赞收藏文章即可。获奖者将以私信方式告知。 网络安全已经成为当今社会非常重要的话题&#xff0c;尤其是近几年来&#xff0c;我们目睹了越来越多的网络攻击事件&#xff0c;例如公民个人信息泄露&#xff0c;企业…

ContEA论文翻译

Facing Changes: Continual Entity Alignment for Growing Knowledge Graphs 面对变化&#xff1a;不断增长的知识图谱的持续实体对齐 Abstract 实体对齐是知识图谱(KG)集成中一项基本且重要的技术。多年来&#xff0c;实体对齐的研究一直基于知识图谱是静态的假设&#xff…

CLIP 图文检索,相似度计算

CLIP 是OpenAI提出的神经网络&#xff0c;它可以从自然语言监督中有效地学习视觉概念。 CLIP 可以应用于任何视觉分类基准&#xff0c;只需提供要识别的视觉类别的名称&#xff0c;类似于 GPT-2 和 GPT-3 的“零样本”功能。 相关paper 用法可以参考github 这里举几个使用CLI…

EDM邮件推广营销是什么意思?

在当今瞬息万变的商业环境中&#xff0c;数字化营销手段已成为企业与消费者建立有效连接、提升品牌影响力的关键途径。其中&#xff0c;EDM&#xff08;Electronic Direct Mail&#xff09;邮件推广营销作为一种成熟且极具性价比的策略&#xff0c;正以其精准投放、实时追踪、成…

dhcp和dhcp中继代理

简单说就是各个pc机的ip自动获取&#xff0c;不用手动设置 配置思路 1.使能dhcp功能 2.创建全局地址池 ip pool &#xff0c;配置可用网络地址 network mask和网关地址刚刚忘记了&#xff0c;租约期 lease day hour 3.配置端口的网关地址&#xff08;各个网络地址的第二位…

tkinter实现通用对账文件解析软件

软件需求 和银行等金融机构合作过程中&#xff0c;经常会有还款计划、放款文件等定时推送的文件&#xff0c;以常见的分隔符进行分隔开&#xff0c;为了在系统出现问题时&#xff0c;快速查找异常数据&#xff0c;写了一个小工具解析这些文件并写入到excel中。 软件功能 将常…

vue快速入门(四)v-html

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用v-html将文本以html的方式显示 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

SSM框架整合

第一章&#xff1a;搭建整合环境 1. 搭建整合环境 1. 整合说明&#xff1a; SSM整合可以使用多种方式&#xff0c;咱们会选择XML 注解的方式。 2. 整合的思路 1. 先搭建整合的环境 2. 先把Spring的配置搭建完成 3. 再使用Spring整合SpringMVC框架 4. 最后使用Spring整…

全面的Docker快速入门教程(详细)

前言&#xff1a; 都2024年了&#xff0c;你还在为了安装一个开发或者部署环境、软件而花费半天的时间吗&#xff1f;你还在解决开发环境能够正常访问&#xff0c;而发布测试环境无法正常访问的问题吗&#xff1f;你还在为持续集成和持续交付&#xff08;CI / CD&#xff09;工…

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用

Rust 所有权规则 一个值只能被一个变量所拥有&#xff0c;这个变量被称为所有者。 一个值同一时刻只能有一个所有者&#xff0c;也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为&#xff0c;旧的所有者会把值的所有权转移给新的所有者&#…

标题:巨控GRM560:医药行业设备管理的预警的革新者

描述&#xff1a;在快速发展的医药行业中&#xff0c;设备的稳定性和安全性至关重要。巨控GRM560模块作为一种前沿的数据采集和故障提醒系统&#xff0c;已经成为该行业内不可或缺的一部分。本文将深入探讨GRM560模块的功能及其在医药行业中的应用。 正文&#xff1a; 在当今…

Leetcode刷题-数组(二分法、双指针法、窗口滑动)

数组 1、二分法 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 需要注意区间的问题。首先在最外面的循环判断条件是left<right。那就说明我们区间规定的范围就是【left,right】 属于是左闭右闭&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

I2C总线与AT24C02

目录 I2C总线 I2C总线介绍 I2C电路规范 I2C时序结构 起始与终止 代码理解 发送字节 代码理解 接收字节 代码理解 数据应答 代码理解 I2C的数据据帧 发送数据帧 接收数据帧 发送接收数据帧 AT24C02芯片 AT24C02介绍 引脚及应用电路 内部结构图 AT24C02数据…

Android 高德地图

1.获取Key 进入高德开放平台控制台&#xff0c;创建一个新应用。在创建的应用上点击"添加key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次输入key名称&#xff0c;选择服务平台为“Android平台”&#xff0c;输入发布版安全码 SHA1、以及 Package。 获取 S…

贵州省NPP净初级生产力数据/NDVI数据

数据福利是专门为关注小编博客及公众号的朋友定制的&#xff0c;未关注用户不享受免费共享服务&#xff0c;已经被列入黑名单的用户和单位不享受免费共享服务。参与本号发起的数据众筹&#xff0c;向本号捐赠过硬盘以及多次转发、评论的朋友优先享有免费共享服务。 净初级生产…

Vue3从入门到实战:路由的query和params参数

在Vue 3中&#xff0c;我们可以通过路由的查询参数来传递数据。这意味着我们可以在不同的页面之间传递一些信息&#xff0c;以便页面可以根据这些信息来显示不同的内容或执行不同的操作。 查询参数的使用方式类似于在URL中添加附加信息&#xff0c;以便页面之间可以根据这些信息…