You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在JSP页面用Google Charts API生成饼图时遇arrayToDataTable未定义错误

解决Google Charts饼图的"Cannot read property 'arrayToDataTable' of undefined"错误

这个错误本质是Google Charts还没完全加载好,你就调用了依赖它的方法,导致google.visualization对象还不存在。我帮你梳理下修复步骤:

核心问题分析

你注释掉了google.charts.setOnLoadCallback(drawChart);,这是Google Charts提供的关键机制——只有当图表库完全加载完成后,才会执行回调里的绘图函数。现在你直接调用drawChart,大概率是在库还没加载好的时候就执行了,自然找不到arrayToDataTable方法。

另外,你的drawChart需要Passed和Failed两个参数,得先把后端计算好的数值传递到前端JS里,再在回调里调用函数。

具体修复步骤

1. 把后端统计值传递到前端

在你的JSP代码中,当从数据库查询并计算出passed和failed后,在<body>里添加一段脚本,把Java变量转成JS变量:

<script>
// 从后端获取统计数据
var passedCount = <%= passed %>;
var failedCount = <%= failed %>;
</script>

注意:确保你的后端代码里passed和failed已经正确赋值,比如遍历ResultSet时统计Passed/Failed的数量

2. 恢复并正确使用加载回调

修改你的Google Charts脚本部分,用回调确保加载完成后再绘图:

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script>
// 加载Google Charts核心包
google.charts.load('current', {'packages':['corechart']});

// 设置加载完成后的回调函数,确保库就绪后再调用drawChart
google.charts.setOnLoadCallback(function() {
    drawChart(passedCount, failedCount);
});

function drawChart(Passed, Failed) {
    // 先做个安全检查,避免意外错误
    if (!google || !google.visualization) {
        console.error("Google Charts 加载失败,请检查网络或脚本链接");
        return;
    }

    // 构造图表数据
    var data = google.visualization.arrayToDataTable([
        ['Task', 'Passed/Failed'],
        ['Passed', Passed],
        ['Failed', Failed],
    ]);

    // 图表配置
    var options = {'title':'EPRISM automation Status', 'width':400, 'height':300};

    // 渲染图表到指定容器
    var chart = new google.visualization.PieChart(document.getElementById('piechart'));
    chart.draw(data, options);
}
</script>

3. 确保页面有图表容器

在<body>里添加一个用于显示饼图的div:

<div id="piechart"></div>

4. 额外检查点

  • 确认你的后端代码中,passed和failed变量在查询数据库后被正确赋值(比如遍历ResultSet时统计对应状态的记录数)
  • 检查loader.js的链接是否能正常访问(如果有网络限制,可能需要本地托管这个脚本)
  • 清理重复的JSP import语句(比如重复的java.nio.file.Files),虽然不影响功能,但让代码更整洁

示例后端统计逻辑(参考)

如果你还没正确统计passed和failed,可以在查询ResultSet时添加这段逻辑:

while(resultSet.next()) {
    // 假设你的表用CLAIM_TYPE字段标识Passed/Failed,根据实际字段调整
    String claimStatus = resultSet.getString("CLAIM_TYPE");
    if ("Passed".equalsIgnoreCase(claimStatus)) {
        passed++;
    } else if ("Failed".equalsIgnoreCase(claimStatus)) {
        failed++;
    }
}

内容的提问来源于stack exchange,提问作者Raja Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:36