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}" /> 68 円 69 </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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/14 15:34
2020/09/14 23:44