gpt4 book ai didi

java - 如何从数据库中检索图像并通过Servlet在JSP中显示?

转载 作者:行者123 更新时间:2023-12-01 16:38:49 27 4
gpt4 key购买 nike

我的 ImageDAO 看起来像这样:

public InputStream getPhotos(Long userid) throws 
IllegalArgumentException, SQLException, ClassNotFoundException {

Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultset = null;
Database database = new Database();
InputStream binaryStream = null;

try {

connection = database.openConnection();
preparedStatement = connection.prepareStatement(SQL_GET_PHOTO);
preparedStatement.setLong(1, userid);
preparedStatement.executeUpdate();

while(resultset.next()) {
binaryStream = resultset.getBinaryStream(4);
}

} catch (SQLException e) {
throw new SQLException(e);
} finally {
close(connection, preparedStatement, resultset);
}
return binaryStream;
}

我的 ImageServlet 看起来像这样:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {

// Getting user id from session
HttpSession session = request.getSession(false);
Long userid = (Long) session.getAttribute("user");

try {

InputStream photoStream = imageDAO.getPhotos(userid);

// Prepare streams.
BufferedInputStream input = null;
BufferedOutputStream output = null;

try {

// Open streams
input = new BufferedInputStream(photoStream, DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(response.getOutputStream(),
DEFAULT_BUFFER_SIZE);

// Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}

} finally {
output.close();
input.close();
}

//Redirect it to profile page
RequestDispatcher rd = request.getRequestDispatcher
("/webplugin/jsp/profile/photos.jsp");
rd.forward(request, response);


} catch (Exception e) {
e.printStackTrace();
}

}

我的 JSP 图像 src 应该是什么样的

<img src="What to put here">

披露:

servlet 代码是从此链接复制的 http://balusc.blogspot.com/2007/04/imageservlet.html

问题:

  1. 如何从 ImageServlet 中检索 JSP 中的图像。 Stackoverflow 中有人说要放 <img src="URL to Servlet" /> 。但我不明白这意味着什么。
  2. 上述方法是从数据库检索图像的正确方法吗?或者有没有更好的办法。

编辑:我的 Web.xml 看起来像这样

<servlet>
<servlet-name>Photo Module</servlet-name>
<servlet-class>app.controllers.PhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Photo Module</servlet-name>
<url-pattern>/Photos</url-pattern>
</servlet-mapping>

最佳答案

src HTML 的 <img>元素应该只指向一个 URL。 URL 是一种网址,就像您在浏览器地址栏中输入的网址一样。 Servlet 可以通过 web.xml 映射到某些 URL 模式。这样当您调用与 servlet 映射匹配的 URL 时,就会调用该 servlet。另请参阅our Servlets Wiki .

您已将 servlet 映射到 URL 模式 /Photos 。输入类似

的 URL

http://localhost:8080/YourContextPath/Photos

浏览器地址栏中应显示图像。所以基本上,假设 JSP 在相同的上下文路径中运行,应该这样做:

<img src="Photos" />

或者当您想让它相对于域根目录时,则需要动态包含上下文路径:

<img src="${pageContext.request.contextPath}/Photos" />
<小时/>

也就是说,您的 servlet 中存在一些问题。您尚未设置内容类型 header 。这样浏览器就不会知道如何处理 HTTP 响应。当您在地址栏中直接输入其 URL 时,它将显示“另存为”弹出窗口,而当您在 <img> 中调用它时,它将不显示任何内容。 。如果它是 JPG 图像,请在调用 response.getOutputStream() 之前添加以下行.

response.setContentType("image/jpeg");

这样浏览器就知道它是一个 JPG 图像,并且会这样显示它。另请参阅您链接的博客,了解设置标题的正确方法。

另一个问题是您正在调用 request.getSession(false)可能会返回 null当没有办法进行 session 时。但你没有在下一行检查这一点!所以要么使用

HttpSession session = request.getSession();

这样就永远不会 null ,或添加一个

if (session == null) {
// Display some default image or return a 404 instead.
return;
}

您想对 userId 执行同样的操作和photoStream 。如果不存在,则显示默认图像或返回 404。

关于java - 如何从数据库中检索图像并通过Servlet在JSP中显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6315671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com