原文: http://zetcode.com/articles/javaservletimage/

在 Java servlet 发送图像教程中,我们使用 servlet 在 Java 中创建经典的 Web 应用。 Servlet 将图像发送到客户端。 Web 应用已部署在 Jetty 服务器上。

Java Servlet

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

Eclipse Jetty 是 Java HTTP 服务器和 Java Servlet 容器。 Jetty 可以轻松地嵌入到设备,工具,框架,应用服务器和群集中。

Java servlet 图像示例

以下 Web 应用将图像发送到客户端。 该 Web 应用使用 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>sendimageservlet</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. </dependencies>
  24. <build>
  25. <plugins>
  26. <plugin>
  27. <groupId>org.apache.maven.plugins</groupId>
  28. <artifactId>maven-war-plugin</artifactId>
  29. <version>3.2.2</version>
  30. </plugin>
  31. <plugin>
  32. <groupId>org.eclipse.jetty</groupId>
  33. <artifactId>jetty-maven-plugin</artifactId>
  34. <version>9.4.14.v20181114</version>
  35. </plugin>
  36. </plugins>
  37. </build>
  38. </project>

javax.servlet-api依赖项是用于构建 Java Servlet 的库。 maven-war-plugin收集 Web 应用的所有工件依赖项,类和资源,并将它们打包到 Web 应用存档(WAR)中。 jetty-maven-plugin插件对于使用 Jetty 服务器进行快速开发和测试非常有用。

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

这是项目目录结构。

webapp/index.html

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

index.html文件是我们应用的主页。 它具有一个链接,该链接调用一个 servlet 来管理图像文件。

com/zetcode/SendImageServlet.java

  1. package com.zetcode;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. @WebServlet(name = "SendImageServlet", urlPatterns = {"/image"})
  11. public class SendImageServlet extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  14. throws IOException {
  15. ServletContext sc = getServletContext();
  16. try (InputStream is = sc.getResourceAsStream(&quoimg/sid.jpg")) {
  17. // it is the responsibility of the container to close output stream
  18. OutputStream os = response.getOutputStream();
  19. if (is == null) {
  20. response.setContentType("text/plain");
  21. os.write("Failed to send image".getBytes());
  22. } else {
  23. byte[] buffer = new byte[1024];
  24. int bytesRead;
  25. response.setContentType("image/png");
  26. while ((bytesRead = is.read(buffer)) != -1) {
  27. os.write(buffer, 0, bytesRead);
  28. }
  29. }
  30. }
  31. }
  32. }

SendImageServlet Servlet 将图像文件返回给客户端。

  1. @WebServlet(name = "SendImageServlet", urlPatterns = {"/image"})

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

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

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

  1. ServletContext sc = getServletContext();

我们得到ServletContext,其中包含 servlet 用于与其 servlet 容器进行通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。

  1. try (InputStream is = sc.getResourceAsStream(&quoimg/sid.jpg")) {

我们使用getResourceAsStream()获得图像资源流。

  1. OutputStream os = response.getOutputStream();

我们得到 servlet 输出流。 我们将图像数据写入此流。 容器负责关闭 servlet 输出流。

  1. if (is == null) {
  2. response.setContentType("text/plain");
  3. os.write("Failed to send image".getBytes());
  4. } else {

如果无法打开图像输入流,则会将错误消息发送回客户端。

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

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

  1. byte[] buffer = new byte[1024];
  2. int bytesRead;
  3. response.setContentType("image/png");
  4. while ((bytesRead = is.read(buffer)) != -1) {
  5. os.write(buffer, 0, bytesRead);
  6. }

如果成功打开了图像输入流,我们将读取数据并将其写入 servlet 输出流。 我们将响应内容类型设置为image/png

  1. $ mvn jetty:run

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

在 Java servlet 发送图像教程中,我们使用了 Java servlet 将图像发送到客户端。

您可能也对以下相关教程感兴趣: Java Servlet 复选框教程Java Servlet PDF 教程Java Servlet 图表教程Servlet FreeMarker JdbcTemplate教程在 Spring Boot 中提供图像文件Java 教程jQuery DatePicker教程

列出 Java Servlet 教程