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

时间:2011-06-11 11:38:39

标签: 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">

披露:

从此链接http://balusc.blogspot.com/2007/04/imageservlet.html

复制servlet代码

问题:

  1. 如何从ImageServlet中检索JSP中的图像。 Stackoverflow中有人说要放  <img src="URL to Servlet" />。但我不是这意味着什么。
  2. 上述方法是否正确地从数据库中检索图像?或者有更好的方法。
  3. 编辑:我的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>
    

3 个答案:

答案 0 :(得分:6)

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

您已在/Photos的网址格式上映射了servlet。输入类似

的网址
  

http://localhost:8080/YourContextPath/Photos

浏览器地址栏中的

应显示图像。所以基本上,假设JSP在相同的上下文路径中运行,这应该是:

<img src="Photos" />

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

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

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

response.setContentType("image/jpeg");

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

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

HttpSession session = request.getSession();

因此永远不会null或添加

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

您希望对userIdphotoStream执行相同的操作。如果不存在,则显示默认图像或返回404。

答案 1 :(得分:0)

附上您的web.xml,看看您是如何映射您的servlet的,以便我们为您提供URL。

web.xml是将URL与servlet联系起来的方法。

缓冲输出对Servlet输出流的方式是恕我直言,这是一种将数据写入输出的正确方法。最好使用Filter来缓存输出,而不是一直写入响应。

<强>更新 基于您提到的博客作为源和web.xml,正确的URL应该是

  

&lt; img src =“/ image / my_image.jpg”/&gt;

其中my_image.jpg是上传图片的示例名称。

答案 2 :(得分:0)

如果您为模式/Photos

注册servlet
<img src="/yourContextRoot/Photos" />