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

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

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

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

6513閲覧

ラジオボタン未選択時のエラーメッセージの処理方法

icecleam

総合スコア46

JSP

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/09/14 11:13

add.jspの画面で商品を追加後、ラジオボタンで商品を選択し、削除ボタンで削除できるのですが、ラジオボタンが未選択の時に削除ボタンを押すと、SalesSystemController のERRMSG2を表示する方法を教えていただきたいです。
現在のソースだと、削除ボタンを押すと以下のエラーが出てしまいます。

削除ボタンを押した時に呼び出されるのは
SalesSystemControllerのremoveメソッドなので、おそらくそこにうまく動かない原因があると思います。。

エラー内容

Type Exception Report

メッセージ Request processing failed; nested exception is java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public java.lang.String jp.practice.sales.SalesSystemController.remove(org.springframework.validation.BindingResult,javax.servlet.http.HttpServletRequest,jp.practice.sales.SalesForm,org.springframework.ui.Model)

説明 The server encountered an unexpected condition that prevented it from fulfilling the request.


add.jsp

jsp

1<%@ page session="false" language="java" 2 contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3<%@page import="java.time.format.DateTimeFormatter"%> 4<%@ page import="java.time.LocalDate"%> 5<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 7<%@ page import="java.util.*"%> 8<%@ page import="java.time.*"%> 9<!DOCTYPE html> 10<html> 11<head> 12<link rel="stylesheet" type="text/css" 13 href="/sales/resources/css/common.css" /> 14<title>明細追加画面</title> 15</head> 16<body> 17 <form:form modelAttribute="salesForm" action="/sales/system" var="list"> 18 <div class="header"> 19 <span class="titleName">オンラインショップ</span> 20 <% 21 DateTimeFormatter format = DateTimeFormatter.ofPattern("MM月dd日(E)"); 22 %> 23 <span class="date"><%=format.format(LocalDate.now())%></span> 24 </div> 25 <div class="main"></div> 26 <div>明細追加画面</div> 27 商品: 28 <form:select path="goodsName" items="${nameList}" /> 29 <div> 30 点数: 31 <form:input path="quantity" items="${allList}" /> 32 </div> 33 <div> 34 <input type="submit" name="add" value="明細追加" /> 35 </div> 36 <div class="message"> 37 <font color="#ff0000"> <c:out value="${message}" /></font> <font 38 color="#1e90ff"> <c:out value="${message2}" /> 39 </font> <font color="#1e90ff"> <c:out value="${message4}" /> 40 </font><font color="#1e90ff"> <c:out value="${message5}" /> 41 </font> 42 </div> 43 44 <table border="1"> 45 <tr> 46 <th>削除</th> 47 <th>商品ID</th> 48 <th>商品名</th> 49 <th>単価</th> 50 <th>点数</th> 51 <th>小計</th> 52 </tr> 53 <c:forEach items="${allList}" var="item" varStatus="status"> 54 <tr class="even"> 55 <form:hidden path="quantity" /> 56 <td><input type="radio" name="radio" value="${status.index}" /></td> 57 <td><c:out value="${item.id}" /></td> 58 <td><c:out value="${item.name}" /></td> 59 <td><c:out value="${item.price}" /></td> 60 <td><c:out value="${item.quantity}" /></td> 61 <td><c:out value="${item.subtotal}" /></td> 62 </tr> 63 </c:forEach> 64 </table> 65 <div> 66 合計: 67 <c:out value="${total}" /> 6869 </div> 70 <input type="submit" name="firm" value="確定" /> 71 <input type="submit" name="remove" value="削除" /> 72 </form:form> 73</body> 74</html>

SalesSystemController.java

java

1package jp.practice.sales; 2 3import javax.servlet.http.HttpServlet; 4import javax.servlet.http.HttpServletRequest; 5 6import org.springframework.stereotype.Controller; 7import org.springframework.ui.Model; 8import org.springframework.validation.BindingResult; 9import org.springframework.web.bind.annotation.RequestMapping; 10import org.springframework.web.bind.annotation.SessionAttributes; 11 12/** 13 * Handles requests for the application home page. 14 */ 15@Controller 16@RequestMapping(value = "/system") 17@SessionAttributes 18public class SalesSystemController extends HttpServlet { 19 20 private static final String ERRMSG = "点数には1以上100以下の整数を入力してください。"; 21 private static final String ADDMSG = "明細に追加しました。"; 22 private static final String FIXMSG = "以下のように売上登録しました。"; 23 private static final String DELETE = "選択された明細行を削除しました。"; 24 private static final String ERRMSG2 = "明細行を選択して下さい。"; 25 26 /** 27 * 起動時および登録完了時に呼ばれる。初期画面を表示する。 28 * @param form フォームオブジェクト 29 * @param model モデルオブジェクト 30 * @return Viewとしてinit.jspを指定 31 */ 32 @RequestMapping(value = "/start") 33 public String init(SalesForm form, Model model) { 34 35 model.addAttribute("nameList", RecordManager.makeNameList()); 36 //model.addAttribute("nameList", RecordManager.makeNameList()); 37 //form.setGoodsName(RecordManager.getFirstPersonName()); 38 return "init"; 39 } 40 41 /** 42 * 初期画面から呼ばれる。選択した商品の明細追加画面を表示する。 43 * @param form フォームオブジェクト 44 * @param model モデルオブジェクト 45 * @return Viewとしてadd.jspを指定 46 */ 47 @RequestMapping(params = "add") 48 public String add(SalesForm form,BindingResult result, Model model) { 49 Item item = RecordManager.findItem(form.getGoodsName()); 50 RecordManager.setNewItem(new Item(item.getId(), form.getGoodsName(), item.getPrice(), form.getQuantity(), item.getSubtotal())); 51 Item newItem = RecordManager.getNewItem(); 52 int sb = newItem.getPrice() * newItem.getQuantity(); 53 newItem.setSubtotal(sb); 54 model.addAttribute("nameList", RecordManager.makeNameList()); 55 model.addAttribute("allList", RecordManager.getallList()); 56 if (result.hasErrors() || 1 > form.getQuantity() || form.getQuantity() > 100) { 57 model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); 58 model.addAttribute("message", ERRMSG); 59 return "add"; 60 } else { 61 RecordManager.addToAllList(newItem); 62 model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); 63 model.addAttribute("message2", ADDMSG); 64 return "add"; 65 } 66 } 67 68 /** 69 * 細追加画面から呼ばれる。選択した商品を削除し明細追加画面を表示する。 70 * @param form フォームオブジェクト 71 * @param model モデルオブジェクト 72 * @return Viewとしてadd.jspを指定 73 */ 74 @RequestMapping(params = "remove") 75 public String remove(BindingResult result,HttpServletRequest request,SalesForm form, Model model) { 76 String num = null; 77 num = request.getParameter("radio"); 78 int number = Integer.parseInt(num); 79 RecordManager.removeToAllList(number); 80 81 model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); 82 model.addAttribute("nameList", RecordManager.makeNameList()); 83 model.addAttribute("allList", RecordManager.getallList()); 84 if (result.hasErrors()) { 85 model.addAttribute("message5", ERRMSG2); 86 return "add"; 87 }else { 88 model.addAttribute("message4", DELETE); 89 model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); 90 return "add"; 91 } 92 } 93}

RecordManager.java

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 static List<Item> allList = new ArrayList<>(); 13 14 /** 商品データ */ 15 private static final List<Item> list = new ArrayList<Item>(); 16 static { 17 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 18 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 19 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 20 } 21 22 /** 23 * 更新した商品データ 24 * 確認ボタンを押すとlistに書き込む。 25 */ 26 private static Item newItem; 27 28 /** 29 * 引数で指定された商品名に一致する商品データを返却 30 * @param name 検索キーとなる商品名 31 * @return 検索結果の商品データ 32 */ 33 public static Item findItem(String goodsName) { 34 int index = list.indexOf(new Item("", goodsName, 0,0,0)); 35 return list.get(index); 36 } 37 38 /** 39 * 商品データを返す。 40 * @return 商品データ 41 */ 42 public static List<Item> getNameist() { 43 return list; 44 } 45 46 /** 47 * 明細データを返す。 48 * @return 明細データ 49 */ 50 public static List<Item> getallList() { 51 return allList; 52 } 53 54 /** 55 * リストに商品情報を 1 件追加する 56 */ 57 public static void addToAllList(Item newItem) { 58 Item item = new Item(newItem.getId(), newItem.getName(), newItem.getPrice(),newItem.getQuantity(),newItem.getSubtotal()); 59 allList.add(item); 60 } 61 62 /** 63 * リストに商品情報を 1 件削除する 64 */ 65 public static void removeToAllList(int number) { 66 //Item item = new Item(newItem.getId(), newItem.getName(), newItem.getPrice(),newItem.getQuantity(),newItem.getSubtotal()); 67 int i = 0; 68 for (Item item : allList) { 69 i += 1; 70 if (i == number + 1) { 71 allList.remove(item); 72 return; 73 } 74 } 75 } 76 77 /** 78 * リストに商品情報を クリアする 79 */ 80 public static void clearToAllList(Item newItem) { 81 allList.clear(); 82 } 83 84 /** 85 * newItemを商品データlistに書き込む。 86 */ 87 public static void updateItem() { 88 list.set(list.indexOf(newItem), newItem); 89 } 90 91 /** 92 * newItemにデータを書き込む 93 * @param ni セットする item 94 */ 95 public static void setNewItem(Item ni) { 96 newItem = ni; 97 } 98 99 public static Item getNewItem() { 100 return newItem; 101 } 102 103 public static String[] makeNameList() { 104 String[] nameList = new String[list.size()]; 105 for (int i = 0; i < list.size(); i++) { 106 nameList[i] = (list.get(i)).getName(); 107 } 108 return nameList; 109 } 110 111 public static Item selectItem(String name) { 112 113 for(Item item:list) { 114 if (item.getName().equals(name)) { 115 return item; 116 } 117 } 118 return null; 119 } 120 121 public static int calTotal(List<Item> list) { 122 int total = 0; 123 for(Item item: list) { 124 total += item.getSubtotal(); 125 } 126 return total; 127 } 128}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Controllerのremoveメソッドにて良くない実装があります。

java

1@RequestMapping(params = "remove") 2 public String remove(BindingResult result,HttpServletRequest request,SalesForm form, Model model) { 3 String num = null; 4 num = request.getParameter("radio"); 5 int number = Integer.parseInt(num); 6 RecordManager.removeToAllList(number);
  1. BindingResultは入力項目が格納される引数の次に配置しなければなりません。
  2. SpringMVCがリクエストパラメータを受け取ってオブジェクトへ格納する処理があるのに、自前でHttpServletRequestからリクエストパラメータを取得しているのに、エラーハンドリングがなされていません

1については、例えば以下のようにすると、SalesFromクラスにリクエストパラメータの内容を格納した際に何らかの入力値エラーが発生するとBindingResultへ格納されます。

java

1public String remove(@Valid SalesForm form, BindingResult result, Model model) {

2について

もしHttpServletRequestでラジオボタンのパラメータを取得するのであれば、String numがnullのときや文字列だったときの制御を自前で実装しなければ、Integer.parseIntした際に実行時例外がスローされてしまうでしょう。

そうならないためにも、SalesFormクラスにラジオボタンの値を格納するフィールド(ここでは radio でしょうか)を追加し、そのradioに@NotNullをつけておいて、未入力時のエラーをBindingResultで制御していくと良いでしょう。
後続の if (result.hasErrors()) { で判断できるようになります。

また、radioの型をStringではなく、最初から int にしておくと、SpringMVCが自動的に型を判断し変換してくれ、もし型変換に失敗したときは専用のエラーメッセージが出力されます。

投稿2020/09/14 13:22

A-pZ

総合スコア12011

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

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

icecleam

2020/09/14 15:34

ご回答いただきありがとうございます すみません、2についてなのですが、以下のように実装したのですが@NotNullでエラーが出てしまいます。 エラー内容は「NotNull を型に解決できません」というものです。 ご回答いただいた内容を個人的に実装したものが以下になります。 申し訳ありませんが、目を通していただけると助かります。。 SalesForm.java package jp.practice.sales; import java.util.ArrayList; import java.util.List; public class SalesForm { /** 商品ID */ private String id; /** 商品名 */ private String goodsName; /** 単価 */ private int price; /** 売上点数 */ private int quantity; /** 小景 */ private int subtotal; /** 商品点数 */ private int point; /** 削除番号 */ private int delNumber; /** 合計 */ private int total; /** ラジオボタンの値を格納する */ @NotNull private int radio; List<Item> allList = new ArrayList<>(); public SalesForm() { } /** * @return id */ public String getId() { return id; } /** * @param id セットする id */ public void setId(String id) { this.id = id; } /** * @return price */ public int getPrice() { return price; } /** * @param price セットする price */ public void setPrice(int price) { this.price = price; } /** * @return quantity */ public int getQuantity() { return quantity; } /** * @param quantity セットする quantity */ public void setQuantity(int quantity) { this.quantity = quantity; } /** * @return subtotal */ public int getSubtotal() { return subtotal; } public void setSubtotal(int subtotal) { this.subtotal = subtotal; } /** * @return goodsName */ public String getGoodsName() { return goodsName; } /** * @param goodsName セットする goodsName */ public void setGoodsName(String goodsName) { this.goodsName = goodsName; } /** * @return point */ public int getPoint() { return point; } /** * @param point セットする point */ public void setPoint(int point) { this.point = point; } /** * @return delNumber */ public int getDelNumber() { return delNumber; } /** * @param delNumber セットする delNumber */ public void setDelNumber(int delNumber) { this.delNumber = delNumber; } /** * @return total */ public int getTotal() { return total; } /** * @param total セットする total */ public void setTotal(int total) { this.total = total; } /** * @return radio */ public int getRadio() { return radio; } /** * @param radio セットする radio */ public void setRadio(int radio) { this.radio = radio; } /** * @return allList */ public List<Item> getAllList() { return allList; } } removeメソッド @RequestMapping(params = "remove") public String remove(SalesForm form, BindingResult result, Model model, HttpServletRequest request) { String num = null; num = request.getParameter("radio"); int number = Integer.parseInt(num); RecordManager.removeToAllList(number); model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); model.addAttribute("nameList", RecordManager.makeNameList()); model.addAttribute("allList", RecordManager.getallList()); if (result.hasErrors()) { model.addAttribute("message5", ERRMSG2); return "add"; }else { model.addAttribute("message4", DELETE); model.addAttribute("total", RecordManager.calTotal(RecordManager.getallList())); return "add"; } }
A-pZ

2020/09/14 23:44

まだrequest.getParameterが残っているようです。SalesFromにradioの内容が入るのですから、request.getParameterは不要です。 @NotNullが利用できない(インポートはされていますよね?)のであれば、import javax.validation.constraints.NotEmpty; をして、別の @NotEmpty をお試しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問