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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

Java

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

Q&A

解決済

1回答

2170閲覧

Java Spring 画面内で選択したアイテムをアイテム名で探しデータを取得したい

gamavone

総合スコア3

Spring MVC

Spring MVCとは、Javaを用いてWebアプリケーションを開発できるフレームワーク。アーキテクチャにMVCを採用しており、画面遷移と入出力パラメータの受け渡しの基本的な機能の他、ユーザーの送信したパラメータに対する入力チェックなどさまざまな機能を持ちます。

Java

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

0グッド

0クリップ

投稿2022/01/22 12:40

現在オンラインショップのプログラムを作成中です。
以下のinit.jsp(初期画面)とadd.jsp(明細追加画面)の両方にアイテム一覧を表示するプルダウンリストと[明細追加]ボタンがあり、[明細追加]ボタンを押すと選択したアイテム名が一致するデータをRecordManager.javaから探し、add.jspにデータをリストとして追加していく仕組みです。

init.jsp

1<%@ page session="false" language="java" 2 contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3<%@ page import="java.time.LocalDate"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 6<!DOCTYPE html> 7<html> 8<head> 9 <link rel="stylesheet" type="text/css" 10 href="/sales/resouces/css/common.css" /> 11 <title>オンラインショップ(初期画面)</title> 12</head> 13<body> 14 <form:form modelAttribute="salesForm" action="/sales/system"> 15 <div class="header"> 16 <span class="titleName">初期画面</span> 17 <span class="date"><%=LocalDate.now()%></span> 18 </div> 19 <div class="main"> 20 <form:select path="goodsName" items="${goodsNameList}" /> 21 <input type="submit" name="add" value="明細追加" /> 22 </div> 23 </form:form> 24</body> 25</html> 26

add.jsp

1<%@ page session="false" language="java" 2 contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3<%@ page import="java.time.LocalDate"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 6<!DOCTYPE html> 7<html> 8<head> 9 <link rel="stylesheet" type="text/css" 10 href="/sales/resouces/css/common.css" /> 11 <title>明細追加画面</title> 12</head> 13<body> 14 <form:form modelAttribute="salesForm" action="/sales/system"> 15 <div class="header"> 16 <span class="titleName">明細追加画面</span> 17 <span class="date"><%=LocalDate.now()%></span> 18 </div> 19 <div class="main"> 20 <form:select path="goodsName" items="${goodsNameList}" /> 21 <input type="submit" name="add" value="明細追加" /> 22 </div> 23 <table> 24 <tr><th>商品ID</th><th>商品名</th><th>単価</th><th>点数</th><th>小計</th></tr> 25 <c:forEach items="${allList}" var="list"> 26 <tr> 27 <td>${list.id}</td> 28 <td>${list.name}</td> 29 <td>${list.price}</td> 30 <td>${list.quantity}</td> 31 <td>${list.subtotal}</td> 32 </tr> 33 </c:forEach> 34 </table> 35 <div class="footer"> 36 <c:out value="${salesForm.goodsName}" /> 37 <form:hidden path="goodsName" /> 38 <input type="submit" name="toInit" value="確定" /> 39 </div> 40 </form:form> 41</body> 42</html>

SalesSystemController.java

1package jp.practice.sales; 2 3import org.springframework.stereotype.Controller; 4import org.springframework.ui.Model; 5import org.springframework.web.bind.annotation.RequestMapping; 6import org.springframework.web.bind.annotation.SessionAttributes; 7 8/** 9 * Handles requests for the application home page. 10 */ 11@Controller 12@RequestMapping(value = "/system") 13@SessionAttributes(types = {SalesForm.class}) 14public class SalesSystemController { 15 private static final String INIT = "init"; 16 private static final String ADD = "add"; 17 18 /** 19 * 起動時および登録完了時に呼ばれる。初期画面を表示する。 20 * @param form フォームオブジェクト 21 * @param model モデルオブジェクト 22 * @return Viewとしてinit.jspを指定 23 */ 24 @RequestMapping(value = "/start") 25 public String init(SalesForm form, Model model) { 26 model.addAttribute("goodsNameList", RecordManager.makeGoodsNameList()); 27 form.setGoodsName(RecordManager.getFirstGoodsName()); 28 return INIT; 29 } 30 31 /** 32 * 初期画面で明細追加を押した時に呼ばれる。追加商品を表示して確認を促す。 33 * @param form フォームオブジェクト 34 * @param model モデルオブジェクト 35 * @return viewとしてadd.jspを指定 36 */ 37 @RequestMapping(params = "add") 38 public String add(SalesForm form, Model model) { 39 model.addAttribute("goodsNameList", RecordManager.makeGoodsNameList()); 40 Item item = RecordManager.findItem(form.getGoodsName()); 41 form.setGoodsName(item.getId()); 42 model.addAttribute("allList", form.getAllList()); 43 model.addAttribute("item", form.getAllList()); 44 form.addToAllList(item); 45 form.clear(); 46 return ADD; 47 } 48 49 /** 50 * 明細追加画面で確定を押した時に呼ばれる。初期画面表示へ遷移する。 51 * @param form フォームオブジェクト 52 * @param model モデルオブジェクト 53 * @return initメソッドへのリンクを指定 54 */ 55 @RequestMapping(params = "toInit") 56 public String toInit(SalesForm form, Model model) { 57 return init(form, model); 58 } 59} 60

SalesForm.java

1package jp.practice.sales; 2 3import java.util.ArrayList; 4import java.util.List; 5 6public class SalesForm { 7 8 private String goodsName; 9 private int point; 10 private String delNumber; 11 private List<Item> allList = new ArrayList<>(); 12 13 public SalesForm() { 14 } 15 16 /** 17 * @return goodsName 18 */ 19 public String getGoodsName() { 20 return goodsName; 21 } 22 23 /** 24 * @param goodsName セットする goodsName 25 */ 26 public void setGoodsName(String goodsName) { 27 this.goodsName = goodsName; 28 } 29 30 /** 31 * @return point 32 */ 33 public int getPoint() { 34 return point; 35 } 36 37 /** 38 * @param point セットする point 39 */ 40 public void setPoint(int point) { 41 this.point = point; 42 } 43 44 /** 45 * @return delNumber 46 */ 47 public String getDelNumber() { 48 return delNumber; 49 } 50 51 /** 52 * @param delNumber セットする delNumber 53 */ 54 public void setDelNumber(String delNumber) { 55 this.delNumber = delNumber; 56 } 57 58 /** 59 * @return allList 60 */ 61 public List<Item> getAllList() { 62 return allList; 63 } 64 65 /** 66 * @param item 67 */ 68 public void addToAllList(Item item) { 69 this.allList.add(item); 70 } 71 72 public void clear() { 73 goodsName = null; 74 } 75 76} 77

RecordManager.java

1package jp.practice.sales; 2 3import java.util.ArrayList; 4import java.util.List; 5 6/** 7 * 商品データ全体を保持するクラス 8 */ 9public final class RecordManager { 10 11 /** 商品データ */ 12 private static List<Item> list = new ArrayList<>(); 13 static { 14 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 15 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 16 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 17 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0)); 18 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0)); 19 list.add(new Item("B00101", "無線綴ノートA4", 100, 0, 0)); 20 list.add(new Item("B00201", "リングノートA4", 120, 0, 0)); 21 list.add(new Item("B00301", "領収書", 350, 0, 0)); 22 list.add(new Item("C00101", "はさみ(青)", 128, 0, 0)); 23 list.add(new Item("C00201", "ステープラー", 338, 0, 0)); 24 list.add(new Item("C00301", "2穴パンチ", 128, 0, 0)); 25 list.add(new Item("C00401", "ゼムクリップ", 98, 0, 0)); 26 list.add(new Item("C00501", "消しゴム", 58, 0, 0)); 27 } 28 29 /** 30 * 引数で指定された商品名に一致する商品データを返却 31 * @param name 検索キーとなる商品名 32 * @return 検索結果の商品データ 33 */ 34 public static Item findItem(String goodsName) { 35 int index = list.indexOf(new Item("", goodsName, 0,0,0)); 36 return list.get(index); 37 } 38 39 /** 40 * 全ての商品名のリストを返す。 41 * @return 商品名の配列 42 */ 43 public static String[] makeGoodsNameList() { 44 String[] goodsNameList = new String[list.size()]; 45 for (int i = 0; i < list.size(); i++) { 46 goodsNameList[i] = (list.get(i)).getName(); 47 } 48 return goodsNameList; 49 } 50 51 /** 52 * プルダウンリストの初期値セットデータを取得する 53 * @return 先頭の商品名 54 */ 55 public static String getFirstGoodsName() { 56 return list.get(0).getName(); 57 } 58} 59

Item.java

1package jp.practice.sales; 2 3public class Item { 4 5 /** 6 * @param id 7 * @param name 8 * @param price 9 * @param quantity 10 * @param subtotal 11 */ 12 public Item(String id, String name, int price, int quantity, int subtotal) { 13 this.id = id; 14 this.name = name; 15 this.price = price; 16 this.quantity = quantity; 17 this.subtotal = subtotal; 18 } 19 private String id; 20 private String name; 21 private int price; 22 private int quantity; 23 private int subtotal; 24 /** 25 * @return id 26 */ 27 public String getId() { 28 return id; 29 } 30 /** 31 * @param id セットする id 32 */ 33 public void setId(String id) { 34 this.id = id; 35 } 36 /** 37 * @return name 38 */ 39 public String getName() { 40 return name; 41 } 42 /** 43 * @param name セットする name 44 */ 45 public void setName(String name) { 46 this.name = name; 47 } 48 /** 49 * @return price 50 */ 51 public int getPrice() { 52 return price; 53 } 54 /** 55 * @param price セットする price 56 */ 57 public void setPrice(int price) { 58 this.price = price; 59 } 60 /** 61 * @return quantity 62 */ 63 public int getQuantity() { 64 return quantity; 65 } 66 /** 67 * @param quantity セットする quantity 68 */ 69 public void setQuantity(int quantity) { 70 this.quantity = quantity; 71 } 72 /** 73 * @return subtotal 74 */ 75 public int getSubtotal() { 76 return subtotal; 77 } 78 /** 79 * @param subtotal セットする subtotal 80 */ 81 public void setSubtotal(int subtotal) { 82 this.subtotal = subtotal; 83 } 84 /* (非 Javadoc) 85 * @see java.lang.Object#hashCode() 86 */ 87 @Override 88 public int hashCode() { 89 final int prime = 31; 90 int result = 1; 91 result = prime * result + ((name == null) ? 0 : name.hashCode()); 92 return result; 93 } 94 /* (非 Javadoc) 95 * @see java.lang.Object#equals(java.lang.Object) 96 */ 97 @Override 98 public boolean equals(Object obj) { 99 if (this == obj) { 100 return true; 101 } 102 if (obj == null) { 103 return false; 104 } 105 if (!(obj instanceof Item)) { 106 return false; 107 } 108 Item other = (Item) obj; 109 if (name == null) { 110 if (other.name != null) { 111 return false; 112 } 113 } else if (!name.equals(other.name)) { 114 return false; 115 } 116 return true; 117 } 118 119} 120

###問題
init.jspで[明細追加]ボタンを押したときは正しくアイテム名で検索し、データを取得できるのですが、add.jspだと500エラーが発生してしまいます。

eclipseのデバッガを使い、選択したアイテム名が格納されるFormクラスのgoodsNameに何が入っているか調べてみたところ、init.jspの場合は以下の画像のようにアイテム名が正しく入っていましたが、イメージ説明
add.jspで[明細追加]を推した場合は、以下のようにカンマが入ってしまい、検索の邪魔をしてしまっていました。イメージ説明

おそらくinit.jspでボタンを押したときに渡されたアイテム名がgoodsNameの中に残ってしまっていることが原因と考えられるため、前のgoodsNameを削除すればカンマは消えると思うのですが、どうすれば前のgoodsNameを削除できるか分かりません。

どなたか知恵を貸していただけないでしょうか。
よろしくお願い致します。

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

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

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

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

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

jimbe

2022/01/22 17:14

ご質問と直接関係しないかもしれませんが、 RecordManager.findItem はご期待のようには動作しないのではないでしょうか。 単体テストをした方が良いかと思います。
guest

回答1

0

ベストアンサー

add.jsp には 一つのフォームに goodsName が二つあるようです。

投稿2022/01/23 16:52

jimbe

総合スコア12648

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

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

gamavone

2022/02/03 12:44

<div class="footer"> <c:out value="${salesForm.goodsName}" /> <form:hidden path="goodsName" /> <input type="submit" name="toInit" value="確定" /> </div> 上記の<c:out value="${salesForm.goodsName}" />が邪魔をしていたようで、削除したところ正常に動作しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問