サーブレット・JSPでDBに登録されている画像を表示

JSP

        <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <!DOCTYPE html>
        <html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<table border="1" style="border-collapse: collapse">
			<tr>
				<td>ID</td>
				<td>名前</td>
				<td>画像</td>
			</tr>
			<c:forEach items="${ requestScope.itemList }" var="item">
			<tr>
				<td><c:out value="${ item.id }" /></td>
				<td><c:out value="${ item.name }" /></td>
				<td><img style="width: 100px; height: 100px" src="getImage?id=${ item.id }"></td>
			</tr>
			</c:forEach>
		</table>
	</body>
        </html>

DAO

	package jp.co.example.dao;
	
	import java.awt.image.BufferedImage;
	import java.io.BufferedInputStream;
	import java.io.IOException;
	import java.io.InputStream;
	import java.sql.Connection;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;
	
	import javax.imageio.ImageIO;
	
	import jp.co.example.ConnectionManager;
	
	public class ItemDao {
	
		public BufferedImage selectImageById(int id) {
	
			try (Connection conn = ConnectionManager.getConnection()){
	
				// SQL文を作成する
				StringBuffer sbSQL = new StringBuffer();
				sbSQL.append("   select");
				sbSQL.append("          IMAGE");
				sbSQL.append("     from ITEM");
				sbSQL.append("    where ID = ?");
	
				// SQL文を実行する
				PreparedStatement ps = conn.prepareStatement(sbSQL.toString());
				ps.setInt(1, id);
				ResultSet rs = ps.executeQuery();
				
				// 結果セットから画像データを取得し、返却する
				if (rs.next()) {
					InputStream is = rs.getBinaryStream("IMAGE");
					BufferedInputStream bis = new BufferedInputStream(is);
					return ImageIO.read(bis);
				}
	
			} catch (IOException | SQLException e) {
				e.printStackTrace();
			}
			return null;
		}
	}

サーブレット

	package jp.co.example;
	
	import java.awt.image.BufferedImage;
	import java.io.IOException;
	import java.io.OutputStream;
	
	import javax.imageio.ImageIO;
	import javax.servlet.ServletException;
	import javax.servlet.annotation.WebServlet;
	import javax.servlet.http.HttpServlet;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	
	import jp.co.example.dao.ItemDao;
	
	/**
	 * Servlet implementation class GetImageServlet
	 */
	@WebServlet("/getImage")
	public class GetImageServlet extends HttpServlet {
		private static final long serialVersionUID = 1L;
	
		/**
		 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
		 */
		protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			// 画像のIDを取得する
			String id = request.getParameter("id");
			
			// 取得したIDに紐づく画像データをDBから取得する
			ItemDao dao = new ItemDao();
			BufferedImage img = dao.selectImageById(Integer.parseInt(id));
			
			// 画像をクライアントに返却する
			response.setContentType("image/jpeg");
			OutputStream os = response.getOutputStream();
			ImageIO.write(img, "jpg", os);
			os.flush();
		}
	
	}