package com.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/image")
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求参数中的图片文件名
String fileName = request.getParameter("fileName");
// 定义图片文件的绝对路径
String filePath = "D:/images/" + fileName;
File imageFile = new File(filePath);
if (!imageFile.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404 错误
return;
}
// 获取文件的 MIME 类型
String mimeType = getServletContext().getMimeType(imageFile.getAbsolutePath());
if (mimeType == null) {
mimeType = "application/octet-stream"; // 默认的 MIME 类型
}
// 设置响应内容类型
response.setContentType(mimeType);
response.setContentLength((int) imageFile.length());
// 读取文件并写入响应输出流
try (FileInputStream in = new FileInputStream(imageFile);
OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
}
}
3. 在 JSP 页面中发起请求
在 JSP 页面中,通过 <img> 标签发起请求,调用 ImageServlet 获取图片并显示:
jsp
コードをコピーする
<!DOCTYPE html>
<html>
<head>
<title>Image Display</title>
</head>
<body>
<h1>Display Image from External Directory</h1>
<img src="${pageContext.request.contextPath}/image?fileName=sample.jpg" alt="Sample Image">
</body>
</html>
4. 配置 Servlet 映射
在 Spring Boot 中,可以通过 @ServletComponentScan 注解来扫描 Servlet 注解配置,或者手动注册 Servlet。
使用 @ServletComponentScan
在 Spring Boot 主应用类中添加 @ServletComponentScan 注解:
java
コードをコピーする
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
手动注册 Servlet
或者,可以通过配置类手动注册 Servlet:
java
コードをコピーする
package com.example;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean<ImageServlet> imageServlet() {
ServletRegistrationBean<ImageServlet> registrationBean = new ServletRegistrationBean<>(new ImageServlet(), "/image");
return registrationBean;
}
}