Java Servlet 图表
最后修改于 2023 年 8 月 24 日
在本文中,我们将介绍如何使用 JFreeChart 创建图表并在 Servlet 中提供它。该示例生成一个饼图和一个条形图。
Servlet
是一个 Java 类,它响应特定类型的网络请求——最常见的是 HTTP 请求。Servlet 用于在 Java 中实现 Web 应用程序。它们运行在 Servlet 容器中,例如 Tomcat 或 Jetty。如今,Java Web 程序员使用构建在 Servlet 之上的框架来开发应用程序。
Jetty 是一个 HTTP 服务器和 Servlet 容器,能够从独立或嵌入式实例提供静态和动态内容。
JFreeChart 是一个流行的 Java 图表库。它允许创建各种交互式和非交互式图表。
Java Servlet 图表示例
以下示例使用 JFreeChart 库创建一个饼图并在 Java Servlet 中提供它。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>ServletChart</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>11.0.11</version> <configuration> <webApp> <contextPath>/app</contextPath> </webApp> </configuration> </plugin> </plugins> </build> </project>
javax.servlet-api
依赖是用于构建 Java Servlet 的库。jfreechart
是 JFreeChart 库的依赖。
maven-war-plugin
收集 Web 应用程序的所有工件依赖、类和资源,并将它们打包到 Web 应用程序存档 (WAR) 中。jetty-maven-plugin
允许我们使用 mvn jetty:run
运行嵌入式 Jetty 服务器。
pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ └───web │ │ DoChart.java │ ├───resources │ └───webapp │ index.html └───test └───java
这是项目结构。
<!DOCTYPE html> <html> <head> <title>Chart</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="UTF-8"> </head> <body> <a href="showChart">Show chart</a> </body> </html>
在 index.html
文件中,我们有一个调用 Servlet 的链接,该 Servlet 提供饼图。
package com.zetcode.web; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtils; import org.jfree.chart.JFreeChart; import org.jfree.data.general.DefaultPieDataset; import java.io.IOException; import java.io.OutputStream; @WebServlet(name = "DoChart", urlPatterns = {"/showChart"}) public class DoChart extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("image/png"); OutputStream os = response.getOutputStream(); JFreeChart chart = getChart(); int width = 500; int height = 350; ChartUtils.writeChartAsPNG(os, chart, width, height); } public JFreeChart getChart() { var dataset = new DefaultPieDataset<String>(); dataset.setValue("Croatia", 22); dataset.setValue("Bohemia", 34); dataset.setValue("Bulgaria", 18); dataset.setValue("Spain", 5); dataset.setValue("Others", 21); JFreeChart chart = ChartFactory.createPieChart("Popular destinations", dataset, true, false, false); chart.setBorderVisible(false); return chart; } }
DoChart
Servlet 向客户端返回一个饼图。
@WebServlet(name = "DoChart", urlPatterns = {"/showChart"})
@WebServlet
注释将具有 showChart
URL 模式的请求映射到 DoChart
Servlet。
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
请求是 GET 请求,因此我们在 doGet()
方法中提供它。
response.setContentType("image/png");
图表以 PNG 格式的图像提供;因此,我们将响应的内容类型设置为 image/png
。
OutputStream os = response.getOutputStream();
从 response
对象中,我们获取 OutputStream
。通过写入 Servlet 的 OutputStream
,我们将图表提供给客户端。
ChartUtils.writeChartAsPNG(os, chart, width, height);
ChartUtils.writeChartAsPNG()
将图表转换为 PNG 文件并将其写入输出流。
public JFreeChart getChart() { var dataset = new DefaultPieDataset<String>(); dataset.setValue("Croatia", 22); dataset.setValue("Bohemia", 34); dataset.setValue("Bulgaria", 18); dataset.setValue("Spain", 5); dataset.setValue("Others", 21); JFreeChart chart = ChartFactory.createPieChart("Popular destinations", dataset, true, false, false); chart.setBorderVisible(false); return chart; }
在 getChart
方法中,我们生成图表。DefaultPieDataset
包含饼图的数据。
JFreeChart chart = ChartFactory.createPieChart("Popular destinations", dataset, true, false, false);
饼图使用 ChartFactory.createPieChart()
创建。
条形图
以下代码是发送条形图的替代解决方案。
public JFreeChart getChart() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.setValue(46, "Gold medals", "USA"); dataset.setValue(38, "Gold medals", "China"); dataset.setValue(29, "Gold medals", "UK"); dataset.setValue(22, "Gold medals", "Russia"); dataset.setValue(13, "Gold medals", "South Korea"); dataset.setValue(11, "Gold medals", "Germany"); JFreeChart barChart = ChartFactory.createBarChart( "Olympic gold medals in London", "", "Gold medals", dataset, PlotOrientation.VERTICAL, false, true, false); return barChart; }
条形图使用 ChartFactory.createBarChart
创建。
$ mvn jetty:run
运行 Jetty 服务器并导航到 localhost:8080/app/
。
在本文中,我们使用 Java Servlet 中的 JFreeChart 库创建了饼图和条形图,并将其提供给客户端。