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

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

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

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

2回答

7454閲覧

aタグをクリックしてsessionの中身を消したい

yamanoharu0129

総合スコア47

JSP

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2016/08/06 05:13

編集2016/08/06 06:39

jspの
<a herf="cart?action=clear"><button>クリア</button></a>
でdoGETでcart(sessionで作ったhashmap)の中身を消し、同じページに戻りたいのですが、クリアを押すと404エラーが出ます。
単に、session.removeAttribute("clear");
だけではいけないのはわかるのですが、何をどう付け加えればいいのかわかりません。
御教授お願いします。

修正します。

同一のjspのformからキーと値を入力して、POSTで送ってhashmapのcartに登録して、現在のカート内容のdiv内に表示しています。クリアボタンを押すcartの中身が削除されて、下記のtable内の値の表示が消えるようにしたいです。
関係性ですが、サーブレットでの処理はすべて同じサーブレット内で行い。フォームからの入力、表示、クリアボタンもshow.jsp内にあります。
show.jpのフォームからPOSTでdoPOST内でsessionでhashmap内に名前と個数を登録します。
登録した情報をカートの内容の部分に追加していきます。クリアのボタンを押すとcart内の値をすべて削除し、show.jspのカート内容の部分が消えるようにしたいです。処理はこのCart.javaとshow.jspだけで行っています。

Cart.java

import

1import java.util.HashMap; 2 3import javax.servlet.ServletException; 4import javax.servlet.annotation.WebServlet; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8import javax.servlet.http.HttpSession; 9 10/** 11 * Servlet implementation class Cart 12 */ 13@WebServlet("/Cart") 14public class Cart extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 /** 18 * @see HttpServlet#HttpServlet() 19 */ 20 public Cart() { 21 super(); 22 // TODO Auto-generated constructor stub 23 } 24 25 /** 26 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 27 */ 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response); 30 HttpSession session = request.getSession(); 31 HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart");//保持されてる値を持ってきている 32 if(cart == null){//マップが作られていなかったらマップを作る 33 cart = new HashMap(); 34 }; 35 session.removeAttribute("cart"); 36 //getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response); 37 } 38 39 /** 40 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 41 */ 42 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 43 request.setCharacterEncoding("utf-8"); 44 String name = request.getParameter("name"); 45 String countString = request.getParameter("count"); 46 Integer count = Integer.valueOf(countString); 47 HttpSession session = request.getSession(); 48 HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart");//保持されてる値を持ってきている 49 if(cart == null){//マップが作られていなかったらマップを作る 50 cart = new HashMap(); 51 }; 52 //名前(key)が登録されていなかったら、マップにそのまま名前と個数を登録 53 //名前が登録していたら、値をプラスする 54 if(!(cart.containsKey(name))){//同じ名前のKeyがなければ実行 55 //get(name)はname(key)に対応する値(count)を求める 56 System.out.println("名前:"+name+" 個数:"+count); 57 cart.put(name,count);//名前と個数を登録 58 }else{//同じ名前のKeyがあった時に実行 59 System.out.println("名前:"+name+" 入力個数:"+count+" 合計:"+(count+cart.get(name))); 60 cart.put(name,count+cart.get(name)); 61 }; 62 System.out.println("cart.keySet():"+cart.keySet()); 63 System.out.println("cart.get(name"+cart.get(count)); 64 for (String str : cart.keySet()) { 65 System.out.println(str + ":" + cart.get(str)); 66 } 67 session.setAttribute("cart", cart); 68 getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response); 69 } 70 71}

show.jsp

pageEncoding="UTF-8"%> <%@ page import="java.util.HashMap" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ショッピングカート</title> </head> <body> <div style="border:#000000 solid 1px;"> <form action="Cart" method="POST"> <table> <tr><td>名前:</td><td><input type="text" name="name" value="ごはん"></td><td></td></tr> <tr><td>個数:</td><td><input type="text" name="count" value="1"></td><td></td></tr> <tr><td></td><td></td><td><button>更新</button></td></tr> </table> </form> </div> <br> <div style="border:#000000 solid 1px;"> <table> <% HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart"); %> <thead><tr><td>現在のカートの内容</td></tr></thead> <tbody> <% if(cart != null){ for(String name : cart.keySet()){ %> <tr><td bgcolor="#00bfff"><%= name %></td><td><%= cart.get(name) %></td><td></td></tr> <% } };%> </tbody> </table> <a href="cart?action=cart"> <button>カートをクリア</button></a> </div> </body> </html>

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

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

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

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

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

asahina_dev

2016/08/06 05:20

session.removeAttribute("clear"); は session の clear って属性を削除しているだけですよ。 cart の中身が clear に入ってないかぎりカートの中身は削除されません。 また戻り先については提示頂いているソースでは判断いたしかねます
matobaa

2016/08/06 05:52

カートに物を入れるページ、カートに物を入れるサーブレット、カートの中身を表示するページ、カートをクリアするボタンがあるページ、クリアするサーブレット、クリアした結果を表示するページの関係性を図示して添付してもらえないでしょうか。
guest

回答2

0

ベストアンサー

404 ということは、クリックしてからサーブレットまで届いていないようです。
<a href="cart?action=cart"> とのことですが、~/cart というURLとサーブレットの対応付けはできているか確認してください。
Cart.java では @WebServlet("/Cart") と書いてあるので、これとあわせてみてください。

投稿2016/08/06 13:26

matobaa

総合スコア2493

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

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

A-pZ

2016/08/06 13:31

補足すると、Javaでは大文字小文字を区別するので、hrefの値はCart?action=..とすべき、ですね。
yamanoharu0129

2016/08/06 22:44

書き間違いがありました。 <a herf="cart?action=clear">です。 <a href="Cart?action=cart"> で消せるようになったのですが、何故か二回クリックしないと消えませんでした…
asahina_dev

2016/08/06 22:50

そりゃ JSPからHTMLへの変換のタイミングが・・・・
matobaa

2016/08/06 23:06

404は解決したということかな。それはよかった。 ところで、actionに clear を指定されたかどうかの判定が入ってないよ。StrutsのDispatchActionを使っているわけじゃないんだから、 if(action.equals("clear")) みたいな判定がどこかにないとへん。
yamanoharu0129

2016/08/07 04:19

forwardを最後に書いて、 String action = request.getParameter("action"); if(action.equals("clear")){ session.removeAttribute("cart"); } で動きました。変換のタイミングやactionでの動かし方がよくわかっていなかったので、助かりました。ありがとうございました。
guest

0

サーブレットの実装を見ましたが、以下やや変な実装をしているように感じました。

java

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 3 //1. これは処理の終わりに記載すべき。 4 //2. サーブレットコンテキストを取得しなくても、ディスパッチャはrequestから直接取得できる 5 //getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response); 6 7 HttpSession session = request.getSession(); 8 HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart"); 9 10 // 3. cartを作成した後に削除?この処理は不要に思える。 11 // actionの値に応じて処理を振り分けるなら、 12 // リクエストパラメータからactionの値を取得して、振り分ける処理が必要 13 if(cart == null){ 14 cart = new HashMap(); 15 }; 16 session.removeAttribute("cart"); 17 18 // 最後に、表示するJSPを決定する 19 request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response); 20 }

行コメントでレビューしましたが、これら3箇所直すべきかと。

投稿2016/08/07 00:27

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問