前提・実現したいこと
サーブレットでショッピングカート風の機能を作っています。
商品一覧画面にて、注文個数を入力していなかったらエラーメッセージを出したいです。
ステータス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を変数に解決できません」というエラー
試したこと
> req.getAttribute("products",list)の「listを変数に解決できません」というエラー
サーブレットの実行時のエラーなのではなく、そもそも「listという変数が無い」のでコンパイルエラーなのではないですか?
@dodox86
listを宣言した後に該当コードを挿入するとデッドコードになってしまうのですが、なぜなんでしょう?
コードの下の方では宣言されてますよね。
> 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が空なのがコンパイル時点で分かるので、デッドコード、つまり必ず空の無意味なコードになるというようなことだと思います。
@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();
のような形を試したのですが、デッドコードでした。
回答1件
あなたの回答
tips
プレビュー

