Java Servlet 发送图片
最后修改于 2023 年 8 月 24 日
在本篇 Java Servlet 发送图片教程中,我们使用 Java 创建了一个经典的 Web 应用程序,其中包含一个 Servlet。该 Servlet 将图片发送到客户端。该 Web 应用程序部署在 Jetty 服务器上。
Java Servlet
Servlet 是一个 Java 类,它响应特定类型的网络请求——最常见的是 HTTP 请求。Servlet 用于实现 Web 应用程序。它们运行在 Servlet 容器中,如 Tomcat 或 Jetty。在当今的 Java Web 开发中,程序员使用建立在 Servlet 之上的框架。
Eclipse Jetty 是一个 Java HTTP 服务器和 Java Servlet 容器。Jetty 可以轻松地嵌入到设备、工具、框架、应用服务器和集群中。
Java Servlet 图片示例
下面的 Web 应用程序将图片发送到客户端。该 Web 应用程序使用了一个 Java Servlet。
pom.xml
src
├── main
│ ├── java
│ │ └── com
│ │ └── zetcode
│ │ └── SendImage.java
│ ├── resources
│ └── webapp
│ ├── images
│ │ └── sid.jpg
│ └── index.html
└── test
└── 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>HttpServletMappingEx</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</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>
这是 pom.xml 文件。
package com.zetcode.web;
import javax.servlet.ServletContext;
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.InputStream;
import java.io.OutputStream;
@WebServlet(name = "SendImage", urlPatterns = {"/image"})
public class SendImage extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
ServletContext sc = getServletContext();
try (InputStream is = sc.getResourceAsStream("/images/sid.jpg")) {
// it is the responsibility of the container to close output stream
OutputStream os = response.getOutputStream();
if (is == null) {
response.setContentType("text/plain");
os.write("Failed to send image".getBytes());
} else {
response.setContentType("image/jpeg");
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
}
}
}
}
SendImage Servlet 将图片文件返回给客户端。
@WebServlet(name = "SendImage", urlPatterns = {"/image"})
@WebServlet 注解将 URL 模式为 image 的请求映射到 SendImage Servlet。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
请求是 GET 请求,因此我们在 doGet 方法中处理它。
ServletContext sc = getServletContext();
我们获取 ServletContext,它包含一组 Servlet 用于与其 Servlet 容器通信的方法,例如,获取文件的 MIME 类型、调度请求或写入日志文件。
try (InputStream is = sc.getResourceAsStream("/images/sid.jpg")) {
我们使用 getResourceAsStream 获取图片资源流。
OutputStream os = response.getOutputStream();
我们获取 Servlet 输出流。我们将图片数据写入此流。由容器负责关闭 Servlet 输出流。
if (is == null) {
response.setContentType("text/plain");
os.write("Failed to send image".getBytes());
} else {
如果我们无法打开图片输入流,我们会将错误消息发送回客户端。
response.setContentType("image/jpeg");
图片是 JPEG 格式,因此我们将响应的内容类型设置为 image/jpeg。
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
如果我们成功打开了图片输入流,我们将读取数据并将其写入 Servlet 输出流。
<!DOCTYPE html>
<html>
<head>
<title>Servlet image</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<a href="image">Get image</a>
</body>
</html>
index.html 文件是我们应用程序的主页。它有一个链接,用于调用提供图片文件的 Servlet。
$ mvn jetty:run
我们运行 Jetty 服务器,然后导航到 localhost:8080/app/。
在本文中,我们使用 Java Servlet 将图片发送到客户端。
列出 Java Servlet 教程。