質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

1661閲覧

jspでcontextPathを使用しての画像の表示が失敗

kawatan

総合スコア2

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/06/19 09:16

編集2021/06/19 13:59

前提・実現したいこと

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/19 09:31

>Eclips 細かいのですが「Eclipse」です。 >画像のリンクを直接ブラウザに貼ると これはフルURLだと下記をアドレスバーに入れて実行したということで良いですか? http://localhost:8080/SampleDB/image/1.jpg それにしてはあまり起きなさそうな例外投げてる気がしますが・・
kawatan

2021/06/19 09:38

ご指摘ありがとうございます。表記を修正致しました。 はい、仰る通りアドレスバーに入れて実行しました。 本エラーも検索しましたが私の発生している事象とは異なるようなものが多く断念しました。。
m.ts10806

2021/06/19 10:06

もう1点確認です。 画面表示したときにブラウザから「ソースを表示」でHTMLを確認すると <img src="/SampleDB/image/1.jpg" height="64"> となっているということで良いですか?
m.ts10806

2021/06/19 10:15 編集

ちなみにサーブレットのコードはありますか? エラーにも書かれているので気にはなっています。 そちらにマッピング書いていたら引っ張られるかもしれません。 jspだけで同配置で${pageContext.request.contextPath}/image/1.jpg だと呼び出せました。 サーブレットでマッピングがあるとそちらに引っ張られて画像が表示できなかったです(直アクセスでサーブレットの出力が出た)(設定次第とは思います)
kawatan

2021/06/19 14:13

遅くなり申し訳ありません。サーブレットコードをアップ致しました。 ><img src="/SampleDB/image/1.jpg" height="64"> >となっているということで良いですか? はい、そのとおりです。一応、Edgeで開いて画像に合わせて右クリック「開発者ツールで操作する」を表示して確認しても同様でした。
m.ts10806

2021/06/19 20:34

> @WebServlet(urlPatterns= {"*.action"}) これが怪しい気がします。 *はワイルドカードなのであらゆるパターンを受け入れます。 Product.action でしたっけ。具体的に記載してみては。 可能なら/Product.action としたほうがいいかも。
kawatan

2021/06/20 01:02

ご回答ありがとうございます。以下に変更してみましたがやはりうまく行きませんでした。 @WebServlet(urlPatterns= {"/purchase/ProductAction"}) <img src="/SampleDB/image/1.jpg" height="64"> 私も新しいjspに直接上記を貼り付けて試してみましがどうもこの時点で表示に失敗します。 表記方法を調べつつ、ファイルの格納場所、パスなどもう一度、チェックしてみたいと思います。
dodox86

2021/06/20 04:28

tomcatのweb.xmlで拡張子 jpgなどのmime-mappingが正しくなされているかも確認しておいた方が良いと思います。
kawatan

2021/06/20 08:15

>dodox86様 アドバイスありがとうございます。mime-mappingは指定しておりませんでしたので大丈夫そうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問