http://zetcode.com/articles/javaservletchart/

Java Servlet 图表教程展示了如何使用 JFreeChart 创建图表并将其提供给 Servlet。 该示例生成一个饼图。

Servlet是 Java 类,可响应特定类型的网络请求-最常见的是 HTTP 请求。 Servlet 用于以 Java 实现 Web 应用。 它们在 Tomcat 或 Jetty 之类的 servlet 容器中运行。 如今,Java Web 程序员使用基于 Servlet 构建的框架来开发应用。

Jetty 是 HTTP 服务器和 Servlet 容器,能够通过独立或嵌入式实例提供静态和动态内容。

JFreeChart 是流行的 Java 图表库。 它允许创建各种交互式和非交互式图表。

Java Servlet 图表示例

下面的示例使用 JFreeChart 库创建一个饼图,并将其提供给 Java Servlet。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>servletchart</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>12</maven.compiler.source>
  14. <maven.compiler.target>12</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>javax.servlet</groupId>
  19. <artifactId>javax.servlet-api</artifactId>
  20. <version>4.0.1</version>
  21. <scope>provided</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.jfree</groupId>
  25. <artifactId>jfreechart</artifactId>
  26. <version>1.5.0</version>
  27. </dependency>
  28. </dependencies>
  29. <build>
  30. <plugins>
  31. <plugin>
  32. <groupId>org.apache.maven.plugins</groupId>
  33. <artifactId>maven-war-plugin</artifactId>
  34. <version>3.2.2</version>
  35. </plugin>
  36. <plugin>
  37. <groupId>org.eclipse.jetty</groupId>
  38. <artifactId>jetty-maven-plugin</artifactId>
  39. <version>9.4.14.v20181114</version>
  40. </plugin>
  41. </plugins>
  42. </build>
  43. </project>

javax.servlet-api依赖项是用于构建 Java Servlet 的库。 jfreechart是 JFreeChart 库的依赖项。

maven-war-plugin收集 Web 应用的所有工件依赖项,类和资源,并将它们打包到 Web 应用存档(WAR)中。 jetty-maven-plugin允许我们与mvn jetty:run一起运行嵌入式 Jetty 服务器。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. └───web
  8. DoChart.java
  9. ├───resources
  10. └───webapp
  11. index.html
  12. └───test
  13. └───java

这是项目结构。

webapp/index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Chart</title>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <a href="showChart">Show chart</a>
  10. </body>
  11. </html>

index.html文件中,我们有一个调用 servlet 的链接,该 servlet 服务于饼图。

com/zetcode/web/DoChart.java

  1. package com.zetcode.web;
  2. import org.jfree.chart.ChartFactory;
  3. import org.jfree.chart.ChartUtils;
  4. import org.jfree.chart.JFreeChart;
  5. import org.jfree.data.general.DefaultPieDataset;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.io.OutputStream;
  12. @WebServlet(name = "DoChart", urlPatterns = {"/showChart"})
  13. public class DoChart extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  16. throws IOException {
  17. response.setContentType("image/png");
  18. OutputStream os = response.getOutputStream();
  19. JFreeChart chart = getChart();
  20. int width = 500;
  21. int height = 350;
  22. ChartUtils.writeChartAsPNG(os, chart, width, height);
  23. }
  24. public JFreeChart getChart() {
  25. var dataset = new DefaultPieDataset();
  26. dataset.setValue("Croatia", 22);
  27. dataset.setValue("Bohemia", 34);
  28. dataset.setValue("Bulgaria", 18);
  29. dataset.setValue("Spain", 5);
  30. dataset.setValue("Others", 21);
  31. JFreeChart chart = ChartFactory.createPieChart("Popular destinations",
  32. dataset, true, false, false);
  33. chart.setBorderVisible(false);
  34. return chart;
  35. }
  36. }

DoChart Servlet 将饼图返回给客户端。

  1. @WebServlet(name = "DoChart", urlPatterns = {"/showChart"})

@WebServlet批注将具有showChart URL 模式的请求映射到DoChart servlet。

  1. @Override
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws IOException {

该请求是一个 GET 请求,因此我们以doGet()方法为其提供服务。

  1. response.setContentType("image/png");

该图表用作 PNG 格式的图像; 因此,我们将响应的内容类型设置为image/png

  1. OutputStream os = response.getOutputStream();

response对象获得OutputStream。 我们通过写 servlet 的OutputStream将图表提供给客户端。

  1. ChartUtils.writeChartAsPNG(os, chart, width, height);

ChartUtils.writeChartAsPNG()将图表转换为 PNG 文件,并将其写入输出流。

  1. public JFreeChart getChart() {
  2. var dataset = new DefaultPieDataset();
  3. dataset.setValue("Croatia", 22);
  4. dataset.setValue("Bohemia", 34);
  5. dataset.setValue("Bulgaria", 18);
  6. dataset.setValue("Spain", 5);
  7. dataset.setValue("Others", 21);
  8. JFreeChart chart = ChartFactory.createPieChart("Popular destinations",
  9. dataset, true, false, false);
  10. chart.setBorderVisible(false);
  11. return chart;
  12. }

getChart()方法中,我们生成图表。 DefaultPieDataset包含饼图的数据。

  1. JFreeChart chart = ChartFactory.createPieChart("Popular destinations",
  2. dataset, true, false, false);

使用ChartFactory.createPieChart()创建饼图。

条形图

以下代码是发送条形图的替代解决方案。

  1. public JFreeChart getChart() {
  2. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  3. dataset.setValue(46, "Gold medals", "USA");
  4. dataset.setValue(38, "Gold medals", "China");
  5. dataset.setValue(29, "Gold medals", "UK");
  6. dataset.setValue(22, "Gold medals", "Russia");
  7. dataset.setValue(13, "Gold medals", "South Korea");
  8. dataset.setValue(11, "Gold medals", "Germany");
  9. JFreeChart barChart = ChartFactory.createBarChart(
  10. "Olympic gold medals in London",
  11. "",
  12. "Gold medals",
  13. dataset,
  14. PlotOrientation.VERTICAL,
  15. false, true, false);
  16. return barChart;
  17. }

使用ChartFactory.createBarChart()创建条形图。

  1. $ mvn jetty:run

运行 Jetty 服务器并导航到localhost:8080

在本教程中,我们使用了 Java Servlet 中的 JFreeChart 库创建饼图并将其提供给客户端。

您可能也对以下相关教程感兴趣: JFreeChart 教程Java 教程

列出所有 Java Servlet 教程