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

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

ただいまの
回答率

90.49%

  • Java

    16118questions

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

  • JSP

    1047questions

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

  • Tomcat

    626questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,078

yamanoharu0129

score 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 java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Cart
 */
@WebServlet("/Cart")
public class Cart extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Cart() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response);
        HttpSession session = request.getSession();
        HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart");//保持されてる値を持ってきている
        if(cart == null){//マップが作られていなかったらマップを作る
            cart = new HashMap();
        };
        session.removeAttribute("cart");
        //getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        String countString = request.getParameter("count");
        Integer count = Integer.valueOf(countString);
        HttpSession session = request.getSession();
        HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart");//保持されてる値を持ってきている
        if(cart == null){//マップが作られていなかったらマップを作る
            cart = new HashMap();
        };
        //名前(key)が登録されていなかったら、マップにそのまま名前と個数を登録
        //名前が登録していたら、値をプラスする
        if(!(cart.containsKey(name))){//同じ名前のKeyがなければ実行
            //get(name)はname(key)に対応する値(count)を求める
            System.out.println("名前:"+name+" 個数:"+count);
            cart.put(name,count);//名前と個数を登録
        }else{//同じ名前のKeyがあった時に実行
            System.out.println("名前:"+name+" 入力個数:"+count+" 合計:"+(count+cart.get(name)));
            cart.put(name,count+cart.get(name));
        };
        System.out.println("cart.keySet():"+cart.keySet());
        System.out.println("cart.get(name"+cart.get(count));
        for (String str : cart.keySet()) {
              System.out.println(str + ":" + cart.get(str));
            }
        session.setAttribute("cart", cart);
        getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response);
    }

}

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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina_dev

    2016/08/06 14:20

    session.removeAttribute("clear"); は session の clear って属性を削除しているだけですよ。 cart の中身が clear に入ってないかぎりカートの中身は削除されません。

    また戻り先については提示頂いているソースでは判断いたしかねます

    キャンセル

  • matobaa

    2016/08/06 14:52

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

    キャンセル

  • yamanoharu0129

    2016/08/06 18:27

    修正しました。

    キャンセル

回答 2

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 22:31

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

    キャンセル

  • 2016/08/07 07:44

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

    キャンセル

  • 2016/08/07 07:50

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

    キャンセル

  • 2016/08/07 08:06

    404は解決したということかな。それはよかった。

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

    キャンセル

  • 2016/08/07 13:19

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

    キャンセル

0

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

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1. これは処理の終わりに記載すべき。
        //2. サーブレットコンテキストを取得しなくても、ディスパッチャはrequestから直接取得できる
        //getServletContext().getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response);

        HttpSession session = request.getSession();
        HashMap<String,Integer> cart = (HashMap<String,Integer>)session.getAttribute("cart");

        // 3. cartを作成した後に削除?この処理は不要に思える。
        // actionの値に応じて処理を振り分けるなら、
        // リクエストパラメータからactionの値を取得して、振り分ける処理が必要
        if(cart == null){
            cart = new HashMap();
        };
        session.removeAttribute("cart");

        // 最後に、表示するJSPを決定する
        request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request,response);
    }

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    16118questions

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

  • JSP

    1047questions

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

  • Tomcat

    626questions

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