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

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

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

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

Java

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

servlet

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

Q&A

0回答

1171閲覧

Java servlet 簡易掲示板の値の保持

genba89000

総合スコア0

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2021/02/17 14:37

編集2021/02/18 11:20

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
見てくださりありがとうございます。
現在、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使用

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

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

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

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

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

K_3578

2021/02/18 06:00

質問は編集できるので、 とりあえず、エラーコードやソースコードはviewやmodel部を分けた上で MarkDownの<code>機能でご提示ください。 ```ここに言語を入力 コード(←を消してここに該当のコードを貼り付ければいいです。) ```
genba89000

2021/02/18 11:18 編集

ありがとうございます。修正いたしました。 もし、本題の方の質問についてわかることがあるようでしたらご教授願います。
K_3578

2021/02/19 01:34

自分もそこまで詳しい訳ではないので見てみるつもりですが、 仕事もあるので夜にでもまた見てみます。teratailはいいね機能に関する質問よく見ますから 言語を絞らずに調べてみたら少しはヒントを得られるかもしれませんね。
hoshi-takanori

2021/02/21 04:38

・サーバー側で情報をどうやって持つか ・いいねを押した人をどうやって見分けるか という課題がありますね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問