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

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

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

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

3回答

680閲覧

JSPでPOST情報を表示しようとするとエラーが発生します。

Yuki2

総合スコア52

JSP

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2023/12/07 08:15

編集2023/12/07 08:35

実現したいこと

サーブレットのString itemId, int itemQuantityに値を渡したい。
confirm.jspでデータを出力したいが、エラーが発生していて止まっている。
item.jspでforEachを使用してselectを生成しているのでname属性はいずれも一意になるようにしたい。

BuyItemServlet.javaでint itemQuantity = Integer.parseInt(request.getParameter("itemQuantity_" + itemId));
このようにすると、エラーが発生してしまう。
System.out.println()で何故か途中からデバッグができなくなってしまったので質問しました。

前提

Javaでショッピングサイトを作成しています。
item.jspで購入ボタンを押すと以下のエラーが発生します。

発生している問題・エラーメッセージ

HTTPステータス 500 – Internal Server Error タイプ 例外報告 メッセージ null 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 java.lang.NumberFormatException: null java.base/java.lang.Integer.parseInt(Integer.java:614) java.base/java.lang.Integer.parseInt(Integer.java:770) servlet.BuyItemServlet.doPost(BuyItemServlet.java:29) javax.servlet.http.HttpServlet.service(HttpServlet.java:555) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています。 Apache Tomcat/9.0.82

該当のソースコード

ItemServlet.java

1package servlet; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13import logic.ItemLogic; 14import model.Item; 15 16/** 17 * Servlet implementation class ItemServlet 18 */ 19@WebServlet("/ItemServlet") 20public class ItemServlet extends HttpServlet { 21 private static final long serialVersionUID = 1L; 22 23 /** 24 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 25 */ 26 protected void doGet(HttpServletRequest request, HttpServletResponse response) 27 throws ServletException, IOException { 28 // ItemLogicからデータを取得 29 ItemLogic itemLogic = new ItemLogic(); 30 List<Item> itemList = itemLogic.getItemList(); 31 32 // リクエストスコープにitemListを格納 33 request.setAttribute("itemList", itemList); 34 35 // item.jspへ、フォワード 36 RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/item.jsp"); 37 dispatcher.forward(request, response); 38 } 39 40 /** 41 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 42 */ 43 protected void doPost(HttpServletRequest request, HttpServletResponse response) 44 throws ServletException, IOException { 45 // TODO Auto-generated method stub 46 doGet(request, response); 47 } 48 49} 50 51 52

item.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="model.Item, java.util.List"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 5<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 6<% 7List<Item> itemList = (List<Item>) request.getAttribute("itemList"); 8%> 9<!DOCTYPE html> 10<html lang="ja"> 11<head> 12<meta charset="UTF-8"> 13<meta name="viewport" content="width=device-width,initial-scale=1"> 14<title>購入システム</title> 15<link rel="stylesheet" href="css/style.css"> 16<link 17 href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" 18 rel="stylesheet" 19 integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" 20 crossorigin="anonymous"> 21</head> 22<body> 23 <h1 class="p-2">商品一覧</h1> 24 <form action="BuyItemServlet" method="post"> 25 <table class="table table-striped"> 26 <tr> 27 <th>商品ID</th> 28 <th>商品名</th> 29 <th>価格</th> 30 <th>在庫数</th> 31 <th>数量</th> 32 <th>&nbsp;</th> 33 </tr> 34 <c:forEach var="item" items="${itemList}"> 35 <tr> 36 <td>${item.itemId}</td> 37 <td>${item.itemName}</td> 38 <td>${String.format("%,d",item.price)}</td> 39 <td>${item.quantity}</td> 40 <td><c:if test="${item.quantity > 0}"> 41 <select name="itemQuantity_${item.itemId}" class="form-select" 42 style="width: 25%"> 43 <c:forEach var="i" begin="1" end="${item.quantity}"> 44 <option value="${i}">${i}</option> 45 </c:forEach> 46 </select> 47 </c:if> 48 <input type="hidden" name="${item.itemId}"> 49 </td> 50 <td><c:choose> 51 <c:when test="${item.quantity > 0}"> 52 <input type="submit" value="購入" 53 class="btn btn-primary text-white"> 54 </c:when> 55 <c:otherwise> 56売り切れ! 57</c:otherwise> 58 </c:choose></td> 59 </tr> 60 </c:forEach> 61 </table> 62 </form> 63 <script 64 src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" 65 integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" 66 crossorigin="anonymous"></script> 67</body> 68</html> 69 70

BuyItemServlet.java

1package servlet; 2 3import java.io.IOException; 4 5import javax.servlet.RequestDispatcher; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import logic.ItemLogic; 13import model.Item; 14 15/** 16 * Servlet implementation class BuyItemServlet 17 */ 18@WebServlet("/BuyItemServlet") 19public class BuyItemServlet extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 22 /** 23 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 24 */ 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 request.setCharacterEncoding("UTF-8"); 28 String itemId = request.getParameter("item.itemId"); 29 int itemQuantity = Integer.parseInt(request.getParameter("itemQuantity")); 30 31 System.out.println(itemId); 32 System.out.println(itemQuantity); 33 34 35 ItemLogic itemLogic = new ItemLogic(); 36 Item item = new Item(); 37 38 itemLogic.getItem(itemId); 39 item.setQuantity(itemQuantity); 40 41 request.setAttribute("item", item); 42 RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/confirm.jsp"); 43 dispatcher.forward(request, response); 44 45 } 46 47} 48 49 50

confirm.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="model.Item, java.util.List"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 5<% 6Item item = (Item) request.getAttribute("item"); 7%> 8<!DOCTYPE html> 9<html lang="ja"> 10<head> 11<meta charset="UTF-8"> 12<meta name="viewport" content="width=device-width,initial-scale=1"> 13<title>購入システム</title> 14<link rel="stylesheet" href="css/style.css"> 15<link 16 href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" 17 rel="stylesheet" 18 integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" 19 crossorigin="anonymous"> 20</head> 21<body> 22 <h1 class="p-2">商品購入確認</h1> 23 <form action="" method="post"> 24 <table class="table table-striped"> 25 <tr> 26 <th>商品ID</th> 27 <th>商品名</th> 28 <th>価格</th> 29 <th>購入数</th> 30 <th>合計金額</th> 31 </tr> 32 <tr> 33 <td><c:out value="${item.itemId}" /></td> 34 ${item.itemId} 35 ${item.itemName } 36 <td>itemName</td> 37 <td>price</td> 38 <td>${item.quantity}</td> 39 <td>sum</td> 40 </tr> 41 </table> 42 </form> 43 <script 44 src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" 45 integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" 46 crossorigin="anonymous"></script> 47</body> 48</html> 49 50

試したこと

・BuyItemServletで、System.out.println();で変数の確認を行った。
→BuyItemServletでデバッグを実施後、System.out.println()の結果が表示されなくなってしまった。

・item.jspのselect name属性をitemQuantityに変更して動きを確認した。
→エラーは発生せず、item.jspで選んだ値が表示される。
※ただし、select nameが一意ではないため戻って他の行、または先ほどと同じ行で別の数字を選択して購入ボタンを押しても永遠に一番最初に選んだ数字が表示されてしまう。

補足情報(FW/ツールのバージョンなど)

Eclipse, TomCat9

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

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

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

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

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

guest

回答3

0

少なくともエラーメッセージが手掛かりですので内容を確認してみましょう。

java.lang.NumberFormatException
文字列を数値型に変換するとき、文字列値が数値型にふわさしくない場合に発生するようです。
BuyItemServlet.javaの29行あたりが怪しいのではと推測されます。
変換しようとしている、request.getParameter("itemQuantity")で値がとれているか確認されてはいかがでしょうか。

意図通りの動作をしているか、どこまでエラーなく実行できるか、地道にデバッグされることが解決への近道です。

投稿2023/12/08 06:21

attui20231208

総合スコア8

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

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

Yuki2

2023/12/09 08:51

回答ありがとうございます。 問題発生時は、System.out.println();で値が取れませんでした。
guest

0

やり方は色々あると思いますが、一例としては、 HttpServletRequest には含まれるパラメータの名前の一覧 (Enumeration) を得るメソッドがあります。
パラメータ名に一定の法則 ("itemQuantity_" で始まるとか ) があるなら、どのパラメータ名が対象なのか分かるのではないでしょうか。

プログラム的には、 getParameter は null を返す可能性があるのですから、『バグが無ければ null になるはずは無い』としても、今後何かの拍子にバグが発生して null になってしまった場合に備えて、 null だった場合のロジックや・アプリとしての対処も入れるべきと思います。

投稿2023/12/07 15:42

編集2023/12/07 16:00
jimbe

総合スコア13318

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

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

Yuki2

2023/12/09 08:52

回答ありがとうございます。 JSPにvalue属性を付与することが出来ていませんでした。 以後、気をつけます。
namdosan1409

2023/12/14 06:50 編集

value属性は、入力コントロールの初期値やラベル、オブジェクトに与えるパラメータ、順序付きリストの項目番号を設定するための属性です https://cargames.one/
guest

0

自己解決

皆様、ご回答いただき誠にありがとうございます。
jspのinputにvalue属性を追加し、サーブレットの記述を下記のように変えたところ解決しました。

item.js

1 <td><c:if test="${item.quantity > 0}"> 2 <form action="BuyItemServlet" method="post"> 3 <select name="itemQuantity" class="form-select" 4 style="width: 25%"> 5 <c:forEach var="i" begin="1" end="${item.quantity}"> 6 <option value="${i}">${i}</option> 7 </c:forEach> 8 </select> 9 </c:if></td> 10 <td><c:choose> 11 <c:when test="${item.quantity > 0}"> 12 <input type="hidden" name="itemId" value="${item.itemId}"> 13 <input type="submit" value="購入" 14 class="btn btn-primary text-white"> 15 </c:when> 16 <c:otherwise> 17 <div>売り切れ!</div> 18 </c:otherwise> 19 </c:choose> 20 </form></td>

BuyItemServlet.java

1package servlet; 2 3import java.io.IOException; 4 5import javax.servlet.RequestDispatcher; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import logic.ItemLogic; 13import model.Item; 14 15/** 16 * Servlet implementation class BuyItemServlet 17 */ 18@WebServlet("/BuyItemServlet") 19public class BuyItemServlet extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 22 /** 23 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 24 */ 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 request.setCharacterEncoding("UTF-8"); 28 29 // 商品IDと購入数量をリクエストパラメータから取得 30 String itemId = request.getParameter("itemId"); 31 int itemQuantity = Integer.parseInt(request.getParameter("itemQuantity")); 32 33 // 商品情報を取得 34 ItemLogic itemLogic = new ItemLogic(); 35 Item item = itemLogic.getItem(itemId); 36 37 // 商品購入数をリクエストスコープに格納 38 request.setAttribute("itemQuantity", itemQuantity); 39 40 // 商品情報をリクエストスコープに格納 41 request.setAttribute("item", item); 42 43 // 購入画面にフォワード 44 RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/confirm.jsp"); 45 dispatcher.forward(request, response); 46 47 } 48 49} 50

投稿2023/12/09 07:38

Yuki2

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問