Как получить и изображения на дисплее от базы данных на странице JSP?

Как я могу получить и изображения на дисплее от базы данных на странице JSP?

26
задан KNU 1 April 2014 в 19:22
поделиться

2 ответа

Давайте пошагово посмотрим, что должно произойти:

  • JSP - это, по сути, технология представления, которая должна генерировать HTML-вывод.
  • Чтобы отобразить изображение в HTML, вам нужен элемент HTML .
  • Чтобы позволить ему найти изображение, нужно указать его атрибут src.
  • Атрибут src должен указывать на действительный http:// URL, а не на путь к файловой системе локального диска file://, так как это никогда не будет работать, если сервер и клиент работают на физически разных машинах.
  • URL изображения должен содержать идентификатор изображения либо в пути запроса (например, http://example.com/context/images/foo.png), либо в качестве параметра запроса (например, http://example.com/context/images?id=1).
  • В мире JSP/сервлетов вы можете позволить сервлету прослушивать определенный шаблон URL, например /images/*, чтобы вы могли просто выполнить некоторый Java-код на определенных URL.
  • Изображения являются двоичными данными и должны быть получены как byte[] или InputStream из БД, JDBC API предлагает ResultSet#getBytes() и ResultSet#getBinaryStream() для этого, а JPA API предлагает @Lob для этого.
  • В сервлете вы можете просто записать этот байт[] или InputStream в OutputStream ответа обычным Java IO способом.
  • Клиентская сторона должна быть проинструктирована, что данные должны обрабатываться как изображение, поэтому, по крайней мере, заголовок Content-Type ответа также должен быть установлен. Вы можете получить правильный тип через ServletContext#getMimeType() на основе расширения файла изображения, которое вы можете расширить и/или переопределить через в web.xml.

На этом все. Это почти само пишет код. Начнем с HTML (в JSP):

<img src="${pageContext.request.contextPath}/images/foo.png">
<img src="${pageContext.request.contextPath}/images/bar.png">
<img src="${pageContext.request.contextPath}/images/baz.png">

При необходимости вы можете также динамически установить src с EL во время итерации с помощью JSTL:

<c:forEach items="${imagenames}" var="imagename">
    <img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>

Затем определите/создайте сервлет, который слушает GET-запросы по шаблону URL /images/*, в примере ниже для этого используется обычный JDBC:

@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {

    // content=blob, name=varchar(255) UNIQUE.
    private static final String SQL_FIND = "SELECT content FROM Image WHERE name = ?";

    @Resource(name="jdbc/yourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml.
    private DataSource dataSource;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String imageName = request.getPathInfo().substring(1); // Returns "foo.png".

        try (Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_FIND)) {
            statement.setString(1, imageName);

            try (ResultSet resultSet = statement.executeQuery()) {
                if (resultSet.next()) {
                    byte[] content = resultSet.getBytes("content");
                    response.setContentType(getServletContext().getMimeType(imageName));
                    response.setContentLength(content.length);
                    response.getOutputStream().write(content);
                } else {
                    response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
                }
            }
        } catch (SQLException e) {
            throw new ServletException("Something failed at SQL/DB level.", e);
        }
    }

}

Вот и все. Если вы беспокоитесь о HEAD, кэшировании заголовков и правильном ответе на эти запросы, используйте этот абстрактный шаблон для сервлета статических ресурсов.

См. также:

66
ответ дан 28 November 2019 в 06:31
поделиться

Я предлагаю вам решить это как две проблемы. Есть несколько вопросов и ответов по обоим.

  1. Как загрузить большой двоичный объект из MySQL

    См., Например, Получить изображение, сохраненное как blob

  2. Как отображать изображение динамически

    См., Например, Динамическое отображение эскиза

6
ответ дан 28 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: