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

実現したいこと

サーブレットの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

コメントを投稿

0 コメント