前提・実現したいこと
ここに質問の内容を詳しく書いてください。
見てくださりありがとうございます。
現在、ServletおよびJSPの勉強をしています。
Youtubeの評価のようないいねを加算していく簡易掲示板を作成しています。
実行しいいねを押下することでいいねが加算されるところまでは実装できたのですが、実装したいこととして、一回の実行でいいねを一回押下するといいねが1加算されて二回目の押下でいいねがキャンセルすなわち−1されるようにしたいです。(3回目以降もいいねとキャンセルを繰り返す)それに加えてブラウザごとに管理しブラウザを変えて表示した際には前回した1いいねは引き継ぎ一回目の押下で1加算されて合計2いいねになる(2回目の押下でいいねのキャンセルは同様)。といったように
1ブラウザで1いいねまででブラウザを変えるごとにいいねが2、3、4と加算されるようにしたいです。
発生している問題・エラーメッセージ
エラーはありませんが、ただただ加算されてしまう。
該当のソースコード
jsp
1 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="UTF-8"> 8<title>簡易掲示板</title> 9</head> 10<body> 11<h1>なんかの投稿</h1> 12<form action="./index12" method="Post"> 13<font size="5"><a href="./Contorol?action=yoine">いいね</a>:${yoine.yoineCount}人</font> 14</body> 15</html>
SiteEvent
1package model; 2 3public class SiteEvent { 4 private int yoineCount = 0; 5 private int yokunaineCount = 0; 6 7 public void setYoineCount(int yoineCount) { 8 this.yoineCount = yoineCount; 9 } 10 11 public int getYoineCount() { 12 return yoineCount; 13 } 14}
SiteEventLogic
1package model; 2 3public class SiteEventLogic { 4 5 public void yoinePlus(SiteEvent y) { 6 int count = y.getYoineCount(); 7 count++; 8 y.setYoineCount(count); 9 } 10}
servlet
1package servlet; 2 3 4 5import java.io.IOException; 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletContext; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13import model.SiteEvent; 14import model.SiteEventLogic; 15 16 17@WebServlet("/Contorol") 18public class Contorol extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 22 23 @Override 24 protected void doGet(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 27 // 初回起動を判定するための処理 28 // アプリケーションスコープから値を取得 29 ServletContext sc = this.getServletContext(); 30 SiteEvent y = (SiteEvent) sc.getAttribute("yoine"); 31 32 // 初回起動判定の続き 33 // アプリケーションスコープに値がなければnewする 34 if(y == null) { 35 y = new SiteEvent(); 36 sc.setAttribute("yoine", y); 37 } 38 39 // リクエストパラメーターの取得 40 request.setCharacterEncoding("UTF-8"); 41 String yoine = request.getParameter("action"); 42 43 // いいねボタン押されたら 44 if (yoine != null){ 45 46 // SiteEventLogicでいいねを加算 47 SiteEventLogic yl = new SiteEventLogic(); 48 yl.yoinePlus(y); 49 50 // いいねの数をアプリケーションスコープに保存 51 sc.setAttribute("yoine", y); 52 } 53 54 // フォワード 55 RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/keijiban.jsp"); 56 rd.forward(request, response); 57 58 } 59 60}
試したこと
モデルであるjavaでif文を使っていいねのキャンセルなどはしてみたが、それではブラウザごとでは変わらない。
servletの値を保持するスコープが問題?などといったようにかなりの期間考えましたがわからずじまいでした。。
補足情報(FW/ツールのバージョンなど)
MVCにそって設計しています。
netbeans上でJSPの実行ではなく、servletを実行して表示する。
netbeans使用
あなたの回答
tips
プレビュー