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
<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zetcode</groupId><artifactId>servletchart</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>12</maven.compiler.source><maven.compiler.target>12</maven.compiler.target></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.0</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>9.4.14.v20181114</version></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.xmlsrc├───main│ ├───java│ │ └───com│ │ └───zetcode│ │ └───web│ │ DoChart.java│ ├───resources│ └───webapp│ index.html└───test└───java
这是项目结构。
webapp/index.html
<!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 服务于饼图。
com/zetcode/web/DoChart.java
package com.zetcode.web;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtils;import org.jfree.chart.JFreeChart;import org.jfree.data.general.DefaultPieDataset;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.OutputStream;@WebServlet(name = "DoChart", urlPatterns = {"/showChart"})public class DoChart extends HttpServlet {@Overrideprotected 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();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。
@Overrideprotected 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();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。
在本教程中,我们使用了 Java Servlet 中的 JFreeChart 库创建饼图并将其提供给客户端。
您可能也对以下相关教程感兴趣: JFreeChart 教程和 Java 教程。
