package net.codejava; public class Book { private String title; private String author; private String base64Image; public String getBase64Image() { return base64Image; } public void setBase64Image(String base64Image) { this.base64Image = base64Image; } // other fields... // other getters and setters… }The field’s setter setBase64Image() will be called by a DAO class that retrieves the image binary data and converts it to a base64 string.The field’s getter getBase64Image() will be called by a JSTL tag in the JSP page in order to show the image.
package net.codejava; public class Book { private String title; private String author; private byte[] image; @Column(name = "image") public byte[] getImage() { return this.image; } private String base64Image; public String getBase64Image() { return base64Image; } public void setBase64Image(String base64Image) { this.base64Image = base64Image; } // other fields... // other getters and setters }
Blob blob = result.getBlob("image"); InputStream inputStream = blob.getBinaryStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } byte[] imageBytes = outputStream.toByteArray(); String base64Image = Base64.getEncoder().encodeToString(imageBytes); inputStream.close(); outputStream.close();The Base64 class can be found in the java.util package.In case Hibernate is used, simply update the getter getBase64Image() as follows:
@Transient public String getBase64Image() { base64Image = Base64.getEncoder().encodeToString(this.image); return base64Image; }And the following is sample code of a DAO class - BookDAO:
package net.codejava; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Base64; public class BookDAO { String databaseURL = "jdbc:mysql://localhost:3306/bookstoredb"; String user = "root"; String password = "pass"; public Book get(int id) throws SQLException, IOException { Book book = null; String sql = "SELECT * FROM book WHERE book_id = ?"; try (Connection connection = DriverManager.getConnection(databaseURL, user, password)) { PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, id); ResultSet result = statement.executeQuery(); if (result.next()) { book = new Book(); String title = result.getString("title"); String author = result.getString("author"); Blob blob = result.getBlob("image"); InputStream inputStream = blob.getBinaryStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } byte[] imageBytes = outputStream.toByteArray(); String base64Image = Base64.getEncoder().encodeToString(imageBytes); inputStream.close(); outputStream.close(); book.setTitle(title); book.setAuthor(author); book.setBase64Image(base64Image); } } catch (SQLException | IOException ex) { ex.printStackTrace(); throw ex; } return book; } }As you can see, the get(int id) method finds a row in the book table that associates with the specified id. If the row is found, a new Book object is created and populated its information like this:
book.setTitle(title); book.setAuthor(author); book.setBase64Image(base64Image);
package net.codejava; import java.io.IOException; import java.sql.SQLException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/viewbook") public class GetBookServlet extends HttpServlet { private static final long serialVersionUID = 1L; public GetBookServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int bookId = Integer.parseInt(request.getParameter("id")); BookDAO dao = new BookDAO(); try { Book book = dao.get(bookId); request.setAttribute("book", book); String page = "/index.jsp"; RequestDispatcher requestDispatcher = request.getRequestDispatcher(page); requestDispatcher.forward(request, response); } catch (SQLException ex) { throw new ServletException(ex); } } }
<img src="data:image/jpg;base64,[base_64_String_goes_here]" />
And here is code of a sample JSP page that uses JSTL tags mixed with HTML tags:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <html> <body> <div align="center"> <h2><c:out value="${book.title}" /></h2> <h3><c:out value="${book.author}" /></h3> <img src="data:image/jpg;base64,${book.base64Image}" width="240" height="300"/> </div> </body> </html>
http://localhost:8080/Bookshop/viewbook?id=1
You can see the book image gets displayed as shown in the following screenshot:So far you have learned how to implement a solution that helps display images from database in JSP page, without having to store images somewhere on the server’s disk. The key point here is using the <IMG> tag with a base64 String that represents the image.