Как получить изображение из базы данных и отобразить в JSP через сервлет? - PullRequest
0 голосов
/ 11 июня 2011

Мой 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-образ

<img src="What to put here">

Раскрытие информации:

Код сервлета скопирован с этой ссылки http://balusc.blogspot.com/2007/04/imageservlet.html

Вопросы:

  1. Как получить изображение в JSP из ImageServlet. Кто-то в 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>

Ответы [ 3 ]

6 голосов
/ 11 июня 2011

src элемента HTML <img> должен просто указывать на URL. URL-адрес - это веб-адрес, аналогичный тому, который вы вводите в адресной строке браузера. Сервлеты могут отображаться на определенные шаблоны URL-адресов с помощью web.xml, поэтому при вызове URL-адреса, соответствующего отображению сервлета, будет вызываться сервлет. Смотрите также наши сервлеты Wiki .

Вы сопоставили сервлет с шаблоном URL-адреса /Photos. Ввод URL-адреса, например

http://localhost:8080/YourContextPath/Photos

в адресной строке браузера должно отображаться изображение. Таким образом, в основном, предполагая, что JSP работает в том же пути контекста, это должно сделать:

<img src="Photos" />

Или, если вы хотите сделать его относительно корня домена, вам нужно динамически включить путь контекста:

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

Сказал, что в вашем сервлете есть проблемы. Вы не установили заголовок типа контента. Таким образом, браузер не будет знать, что делать с ответом HTTP. Он отобразит всплывающее окно Сохранить как , когда вы введете его URL прямо в адресную строку, и отобразит ничто , когда вы вызовете его в <img>. Если это изображение в формате 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;
}

Вы хотели бы сделать то же самое для userId и photoStream. Если оно отсутствует, отобразите изображение по умолчанию или верните 404.

0 голосов
/ 11 июня 2011

Если вы зарегистрируете свой сервет для шаблона /Photos

<img src="/yourContextRoot/Photos" />
0 голосов
/ 11 июня 2011

Прикрепите ваш web.xml, чтобы увидеть, как вы (если вы вообще) отображаете свой сервлет, чтобы мы могли дать вам URL.

web.xml - это способ связать URL с сервлетами.

Ваш путь с буферизованным выводом к выходному потоку сервлета является ИМХО правильным и хорошим способом записи данных для вывода.Было бы лучше использовать фильтр для кэширования вывода, хотя вместо того, чтобы писать ответ постоянно.

ОБНОВЛЕНИЕ: На основании блога, который вы упомянули в качестве источника и web.xml,правильный URL должен быть

где my_image.jpg - это образец имени загруженного изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...