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

标签 java image jsp servlets

我的 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/

相关文章:

java - 如何在 Java 中添加分数

java - Android Activity 需要 list 文件吗?

java - 尝试从最大到最小对数组进行排序,但出现错误

java - 以同步、线程安全的方式加载共享资源

Python:将 RAW 图像转换为 PNG

java - Jboss7.1如何配置简单认证

javascript - HTML CSS JS具有响应宽度的多个模式图像

javascript - 显示占位符图像,直到实际图像加载到 ng-repeat angularjs 中

java - 在 Google App Engine java 中处理大数据时服务器遇到错误

java - 如何在循环列表时通过跟踪先前和当前值来模拟 JSTL View 层中的分组?