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

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

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

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

Java

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

servlet

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

Q&A

解決済

1回答

4635閲覧

インプットが空欄だったらエラーメッセージを出す

poporian_a

総合スコア8

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2020/05/21 03:07

編集2020/05/22 02:48

前提・実現したいこと

サーブレットでショッピングカート風の機能を作っています。
商品一覧画面にて、注文個数を入力していなかったらエラーメッセージを出したいです。
ステータス500にいくのではなく、エラー文字付の前画面に遷移したいです。(説明画像あり)

input値が在庫を超えているとエラーメッセージを出す、という内容はできているので、それに類似して作ろうとしているのですがうまくいきません

該当のソースコード

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); //注文個数のパラメーター取得 String[] values=req.getParameterValues("number");       //これがうまくいきません↓ if(values == null) { req.setAttribute("stockErrorMsg2", "空欄はだめです");       //productsは、遷移前のプログラムでスコープに保存した商品リストです req.setAttribute("products", list); RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/list.jsp"); rd.forward(req, res); }   //商品ごとの注文個数リスト List<Number> no = new ArrayList<Number>(); for(int i=0;i<values.length;i++) { int number = Integer.parseInt(values[i]); no.add(new Number(number)); } try { //DB接続 ConnectionDb db = new ConnectionDb(); db.conn(); //入力値を含めたリストを作る List<Stock> list = new ArrayList<Stock>(); String query = "SELECT S.ITEM_ID,ITEM_NAME,STOCK,PRICE " + "FROM PRODUCT_NAME AS N " + "JOIN PRODUCT_STOCK AS S " + "ON N.ITEM_ID = S.ITEM_ID " + "JOIN PRODUCT_PRICE AS P " + "ON S.ITEM_ID = P.ITEM_ID "; PreparedStatement stmt = db.con.prepareStatement(query); ResultSet rs = stmt.executeQuery(); int counter = 0; while (rs.next()) { String itemName = rs.getString("ITEM_NAME"); int price = rs.getInt("PRICE"); int stock = rs.getInt("STOCK"); String itemId = rs.getString("ITEM_ID"); Number numbr = no.get(counter); list.add(new Stock(stock,itemName,price,itemId,numbr)); counter++; } req.setAttribute("stocks", list); //在庫を超える入力があった時点でループを終了(入力値がマイナスの時も追加) boolean isShortage = false; for(int i=0; i < list.size(); i++) { if( list.get(i).getStock() < Integer.parseInt(values[i]) || Integer.parseInt(values[i]) < 0){ isShortage = true; break; } } if(isShortage) {//在庫切れの時に、true         //これはうまくいっています!!↓ req.setAttribute("stockErrorMsg", "在庫がありません"); req.setAttribute("products", list); RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/list.jsp"); rd.forward(req, res); } else { RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/stockOK.jsp"); dispatcher.forward(req, res); rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } }

###発生するエラー

  • req.getAttribute("products",list)の「listを変数に解決できません」というエラー

試したこと

###画像イメージ
イメージ説明

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

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

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

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

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

dodox86

2020/05/22 03:01

> req.getAttribute("products",list)の「listを変数に解決できません」というエラー サーブレットの実行時のエラーなのではなく、そもそも「listという変数が無い」のでコンパイルエラーなのではないですか?
poporian_a

2020/05/22 03:06 編集

@dodox86 listを宣言した後に該当コードを挿入するとデッドコードになってしまうのですが、なぜなんでしょう?
dodox86

2020/05/22 03:13

コードの下の方では宣言されてますよね。 > List<Stock> list = new ArrayList<Stock>(); 宣言してもダメな方って、どうやっていますか。 > //これがうまくいきません↓ > if(values == null) { > req.setAttribute("stockErrorMsg2", "空欄はだめです"); > //productsは、遷移前のプログラムでスコープに保存した商品リストです > req.setAttribute("products", list); List<Stock> list = new ArrayList<Stock>(); とか、 List<Stock> list = null; req.setAttribute("products", list); などとやっていませんか。試していないので分かりませんが、listが空なのがコンパイル時点で分かるので、デッドコード、つまり必ず空の無意味なコードになるというようなことだと思います。
poporian_a

2020/05/22 04:18 編集

@dodox86 //入力値を含めたリストを作る List<Stock> list = new ArrayList<Stock>(); String query = "SELECT S.ITEM_ID,ITEM_NAME,STOCK,PRICE " + "FROM PRODUCT_NAME AS N " + "JOIN PRODUCT_STOCK AS S " + "ON N.ITEM_ID = S.ITEM_ID " + "JOIN PRODUCT_PRICE AS P " + "ON S.ITEM_ID = P.ITEM_ID "; PreparedStatement stmt = db.con.prepareStatement(query); ResultSet rs = stmt.executeQuery(); int counter = 0; while (rs.next()) { String itemName = rs.getString("ITEM_NAME"); int price = rs.getInt("PRICE"); int stock = rs.getInt("STOCK"); String itemId = rs.getString("ITEM_ID"); Number numbr = no.get(counter); list.add(new Stock(stock,itemName,price,itemId,numbr)); counter++; } req.setAttribute("stocks", list); //在庫を超える入力があった時点でループを終了(入力値がマイナスの時も追加) boolean isShortage = false; for(int i=0; i < list.size(); i++) { if( list.get(i).getStock() < Integer.parseInt(values[i]) || Integer.parseInt(values[i]) < 0){ isShortage = true; break; } } if(isShortage) {//在庫切れの時に、true req.setAttribute("stockErrorMsg", "在庫がありません"); req.setAttribute("products", list); RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/list.jsp"); rd.forward(req, res); } else { RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/stockOK.jsp"); dispatcher.forward(req, res); }     //うまくいかない↓ if(values == null) { req.setAttribute("stockErrorMsg2", "空欄はだめです"); req.setAttribute("products", list); RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/list.jsp"); rd.forward(req, res); } rs.close(); stmt.close(); のような形を試したのですが、デッドコードでした。
guest

回答1

0

自己解決

###解決しました
JSPのinput欄に直接コードを入れ込みました。ただ、要素の意味だったりなんだったりなどはまだ理解していないので、コツコツ調べます。

全体コード

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ショッピング</title> <style> div{color:red} </style> </head> <body> <h1>注文画面</h1> <h2 align="right">ID:<c:out value="${userId}" /> 名前:<c:out value="${name}" /></h2> <hr> <form action="/shopping_cart/StockServlet" method="post"> <table> <tr> <th>商品名</th> <th>値段</th> <th>個数</th> </tr> <c:forEach var="product" items="${products}"> <tr> <td align="left">${product.itemName}</td> <td align="center">${product.price}</td> <td align="right"><input type="number" name="number" min="0" value = "0" step = "1" placeholder = "空欄はだめです"></td> </tr> </c:forEach> <tr> <td></td> <td> <input type="submit" value="注文">    <input type="reset" value="クリア"> <div>${stockErrorMsg}</div> </td> </tr> </table> </form> </body> </html>

###該当部分コード

<input type="number" name="number" min="0" value = "0" step = "1" placeholder = "空欄はだめです">

###画像
イメージ説明

投稿2020/05/22 05:25

poporian_a

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問