# Java Servlet 图表教程

> [http://zetcode.com/articles/javaservletchart/](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`

```java
<?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>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 服务器。

```java
pom.xml
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           └───web
│   │                   DoChart.java
│   ├───resources
│   └───webapp
│           index.html
└───test
    └───java

```

这是项目结构。

`webapp/index.html`

```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 服务于饼图。

`com/zetcode/web/DoChart.java`

```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 {

    @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();

        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 将饼图返回给客户端。

```java
@WebServlet(name = "DoChart", urlPatterns = {"/showChart"})

```

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

```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException {

```

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

```java
response.setContentType("image/png");

```

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

```java
OutputStream os = response.getOutputStream();

```

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

```java
ChartUtils.writeChartAsPNG(os, chart, width, height);

```

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

```java
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`包含饼图的数据。

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

```

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

## 条形图

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

```java
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()`创建条形图。

```java
$ mvn jetty:run

```

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

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

您可能也对以下相关教程感兴趣： [JFreeChart 教程](/java/jfreechart/)和 [Java 教程](/lang/java/)。

列出[所有 Java Servlet 教程](/all/#servelts)。