前提・実現したいこと
Eclipseでショッピングサイトの構築を学習しておりDBから取得した情報をビューとして
ブラウザに表示させようと考えております。具体的には以下の[現在の構成]の中の「puroduct.jsp」を実行し
DBから取得した商品IDと紐づく画像を表示させたいのですが、画像表示に失敗している状態です。
初歩的な質問で申し訳ございませんが解決方法をご教示いただけますと幸いです。
現在の構成
発生している問題・エラーメッセージ
ブラウザから動作させると該当のレコードは取得できています。が、画像が表示できておりません。
URL:http://localhost:8080/SampleDB/purchase/Product.action
ブラウザ上で要素を表示させた結果 ※「1.jpg」の1の部分は商品IDとして取得し、そのIDをファイル名としています
<img src="/SampleDB/image/1.jpg" height="64">
画像のリンクを直接ブラウザに貼ると以下のメッセージが出力されます。
タイプ 例外報告 メッセージ getWriter()はこのレスポンスに対して既に呼び出されています 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 java.lang.IllegalStateException: getWriter()はこのレスポンスに対して既に呼び出されています org.apache.catalina.connector.Response.getOutputStream(Response.java:547) org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:210) org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:982) org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:497) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.apache.catalina.servlets.DefaultServlet.service(DefaultServlet.java:477) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) tool.EncodingFilter.doFilter(EncodingFilter.java:24) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています
該当のソースコード
■product.jsp
jsp
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<!DOCTYPE html> 5<%@include file="../tool/header.html" %> 6<%@include file="menu.jsp" %> 7 8<p>検索キーワードを入力してください</p> 9<form action="Product.action" method="POST"> 10<input type="text" name="keyword"> 11<input type="submit" value="検索"> 12</form> 13<hr> 14 15<table style="boder-collapse:separate;boder-spacing:10px;"> 16 17<c:forEach var="product" items="${list}"> 18 <tr> 19 <td>商品${product.id}</td> 20 <td><img src="${pageContext.request.contextPath}/image/${product.id}.jpg" height="64"></td> 21 <td>${product.name}</td> 22 <td>${product.price}円</td> 23 <td><a href="CartAdd.action?id=${product.id}">カートに追加</a></td> 24 </tr> 25</c:forEach> 26</table> 27 28<%@include file="../tool/footer.html" %>
※商品${product.id}・・・商品1、商品2、商品3と検索結果を繰り返し表示、${product.id}のみでは1、2、3と表示
①FrontController
java
1package tool; 2import java.io.IOException; 3import java.io.PrintWriter; 4import java.lang.reflect.Constructor; 5import javax.servlet.ServletException; 6import javax.servlet.annotation.WebServlet; 7import javax.servlet.http.HttpServlet; 8import javax.servlet.http.HttpServletRequest; 9import javax.servlet.http.HttpServletResponse; 10 11@WebServlet(urlPatterns= {"*.action"}) 12public class FrontController extends HttpServlet { 13 14 public void doPost(HttpServletRequest request, 15 HttpServletResponse response) 16 throws ServletException, IOException { 17 PrintWriter out = response.getWriter(); 18 try { 19 String path = request.getServletPath().substring(1); 20 String name = path.replace(".a","A").replace('/', '.'); 21 //ProductActionを生成 22 Class<?> action = null; 23 action = Class.forName(name); 24 Constructor constructor = action.getDeclaredConstructor(); 25 FrontAction faction = (FrontAction) constructor.newInstance(); 26 27 String url = faction.execute(request,response); 28 request.getRequestDispatcher(url).forward(request, response); 29 } catch ( Exception e) { 30 e.printStackTrace(out); 31 } 32 } 33 34 public void doGet(HttpServletRequest request, 35 HttpServletResponse response) 36 throws ServletException, IOException { 37 doPost(request,response); 38 } 39 40}
②ProductAction
Java
1package purchase; 2 3import java.util.List; 4import javax.servlet.http.HttpServletRequest; 5import javax.servlet.http.HttpServletResponse; 6import javax.servlet.http.HttpSession; 7import bean.Product; 8import dao.ProductDAO; 9import tool.FrontAction; 10 11public class ProductAction extends FrontAction { 12 13 public String execute (HttpServletRequest request, 14 HttpServletResponse response) 15 throws Exception { 16 HttpSession session=request.getSession(); 17 String keyword = request.getParameter("keyword"); 18 19 if (keyword==null) keyword=""; 20 ProductDAO dao=new ProductDAO(); 21 List<Product> list=dao.search(keyword); 22 session.setAttribute("list", list); 23 return "product.jsp"; 24 } 25}
③FrontAction
java
1package tool; 2import javax.servlet.http.HttpServletRequest; 3import javax.servlet.http.HttpServletResponse; 4 5public abstract class FrontAction { 6 public abstract String execute (HttpServletRequest request, 7 HttpServletResponse response) throws Exception ; 8}
④ProductDAO
java
1package dao; 2import java.sql.Connection; 3import java.sql.PreparedStatement; 4import java.sql.ResultSet; 5import java.util.ArrayList; 6import java.util.List; 7import bean.Product; 8 9public class ProductDAO extends DAO { 10 11 public List<Product> search(String keyword) throws Exception { 12 List<Product> list=new ArrayList<>(); 13 Connection con = getConnection(); 14 15 PreparedStatement st = con.prepareStatement( 16 "select * from product where name like ?"); 17 st.setString(1, "%"+keyword+"%"); 18 ResultSet rs = st.executeQuery(); 19 20 while(rs.next()) { 21 Product p=new Product(); 22 p.setId(rs.getInt("id")); 23 p.setName(rs.getString("name")); 24 p.setPrice(rs.getInt("price")); 25 list.add(p); 26 } 27 st.close(); 28 con.close(); 29 return list; 30 } 31}
⑤DAO
java
1package dao; 2import java.sql.Connection; 3import javax.naming.InitialContext; 4import javax.sql.DataSource; 5 6public class DAO { 7 static DataSource ds; 8 9 public Connection getConnection() throws Exception { 10 if (ds==null) { 11 InitialContext ic=new InitialContext(); 12 ds=(DataSource)ic.lookup("java:/comp/env/jdbc/SampleDB"); 13 } 14 return ds.getConnection(); 15 } 16} 17
⑥Product
java
1package bean; 2 3public class Product implements java.io.Serializable{ 4 private int id; 5 private String name; 6 private int price; 7 8 public int getId() { 9 return id; 10 } 11 12 public String getName ( ) { 13 return name; 14 } 15 16 public int getPrice() { 17 return price; 18 } 19 20 public void setId(int id) { 21 this.id = id; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 public void setPrice(int price) { 29 this.price = price; 30 } 31}
②のjspを返却する前のリストの値をウオッチで値を確認したら以下のようになっております。
session.setAttribute("list", list);
<検索値にまぐろを設定>
id:1
name:まぐろ
price:100
試したこと
・eclips及びtomcatの再起動
・相対パスでイメージファイルを格納しているフォルダの位置を変更
・イメージファイルの削除及び再import
・イメージファイルをワークスペース直下に移動、WebContentに移動
ファイル名やパスも問題ないように見受けられるのですが
何か初歩的なことを見逃しているようにも思えます。。
補足情報(FW/ツールのバージョンなど)
Eclipsバージョン
Version: 2019-12 (4.14.0)
あなたの回答
tips
プレビュー