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

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

新規登録して質問してみよう
ただいま回答率
85.33%
DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

572閲覧

JavaScript いいねボタンを押したらDBに保存されるようにしたい

webserver2

総合スコア1

DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2025/01/28 00:49

編集2025/01/28 02:30

実現したいこと

いいねボタンを押したら、ログインした人(NAME)、がいいねした商品(ID)がH2コンソールに保存されるようにしたい。

発生している問題・分からないこと

何が間違っているのかわからない

該当のソースコード

JavaScript

1 <div class="col-md-6"> 2 <h2 class="product-name"> 3 <%= itemName != null ? itemName : "<span style='font-size: 14px;'>商品名未設定</span>" %> 4 <!-- いいねボタン --> 5 <button class="like-button" onclick="likeButtonClick()">いいね</button> 6 <span id="likeCount"></span> 7 <div id="message" style="color: green; margin-top: 10px;"></div> <!-- メッセージ表示用 --> 8 9 <script> 10 function likeButtonClick() { 11 const userName = "ユーザー名"; // 実際のログインユーザー名をここに設定 12 const productId = "<%= id %>"; // JSPで動的に商品IDを埋め込む 13 14 fetch('LikeServlet', { 15 method: 'POST', 16 headers: { 17 'Content-Type': 'application/x-www-form-urlencoded', 18 }, 19 body: `NAME=${userName}&ID=${productId}` 20 }) 21 .then(response => response.json()) 22 .then(data => { 23 // いいね数を更新 24 document.getElementById('likeCount').textContent = `いいね数: ${data.likeCount}`; 25 // 完了メッセージを表示 26 document.getElementById('message').textContent = "いいね!が完了しました。"; 27 }) 28 .catch(error => { 29 console.error('エラー:', error); 30 document.getElementById('message').textContent = `エラーが発生しました: ${error.message}`; 31 }); 32 } 33 </script> 34</h2>

DAO

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7 8public class LikeDAO { 9 private static final String URL = "jdbc:h2:tcp://localhost/~/han_gw"; // H2接続URL 10 private static final String USER = "sa"; // ユーザー名 11 private static final String PASSWORD = ""; // パスワード(適切な値に変更) 12 13 public static int addLikeAndGetCount(String ID, String NAME) throws Exception { 14 Connection conn = null; 15 PreparedStatement insertStmt = null; 16 PreparedStatement countStmt = null; 17 ResultSet rs = null; 18 19 try { 20 // JDBCドライバをロード 21 Class.forName("org.h2.Driver"); // H2のJDBCドライバ 22 23 // データベース接続 24 conn = DriverManager.getConnection(URL, USER, PASSWORD); 25 26 // データを挿入 27 String insertSQL = "INSERT INTO LIKE_TABLE (ID, NAME) VALUES (?, ?)"; 28 insertStmt = conn.prepareStatement(insertSQL); 29 insertStmt.setString(1, ID); 30 insertStmt.setString(2, NAME); 31 insertStmt.executeUpdate(); 32 33 // いいね数を取得 34 String countSQL = "SELECT COUNT(*) AS likeCount FROM LIKE_TABLE WHERE ID = ?"; 35 countStmt = conn.prepareStatement(countSQL); 36 countStmt.setString(1, ID); 37 rs = countStmt.executeQuery(); 38 39 if (rs.next()) { 40 return rs.getInt("likeCount"); 41 } else { 42 return 0; 43 } 44 } finally { 45 // リソースの解放 46 if (rs != null) rs.close(); 47 if (insertStmt != null) insertStmt.close(); 48 if (countStmt != null) countStmt.close(); 49 if (conn != null) conn.close(); 50 } 51 } 52} 53

JavaServlet

1package tool; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.sql.Connection; 6import java.sql.DriverManager; 7import java.sql.PreparedStatement; 8import java.sql.ResultSet; 9import java.sql.SQLException; 10 11import javax.servlet.ServletException; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16 17@WebServlet("/LikeServlet") 18public class LikeServlet extends HttpServlet { 19 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 String userName = request.getParameter("NAME"); // 名前 21 String productId = request.getParameter("ID"); // 商品ID 22 23 response.setContentType("application/json"); 24 PrintWriter out = response.getWriter(); 25 26 Connection conn = null; 27 PreparedStatement stmt = null; 28 ResultSet rs = null; 29 30 try { 31 // データベース接続情報 32 String url = "jdbc:h2:tcp://localhost/~/han_gw"; // H2の接続URL 33 String dbUser = "sa"; // ユーザー名 34 String dbPassword = ""; // パスワード(適切な値に変更) 35 36 // H2のJDBCドライバをロード 37 Class.forName("org.h2.Driver"); 38 conn = DriverManager.getConnection(url, dbUser, dbPassword); 39 40 // データを挿入 41 String sql = "INSERT INTO LIKE_TABLE (id, name) VALUES (?, ?)"; 42 stmt = conn.prepareStatement(sql); 43 stmt.setString(1, productId); // 商品ID 44 stmt.setString(2, userName); // ユーザー名 45 stmt.executeUpdate(); 46 47 // いいね数を取得 48 String countSql = "SELECT COUNT(*) AS likeCount FROM LIKE_TABLE WHERE id = ?"; 49 stmt = conn.prepareStatement(countSql); 50 stmt.setString(1, productId); // 商品ID 51 rs = stmt.executeQuery(); 52 int likeCount = 0; 53 if (rs.next()) { 54 likeCount = rs.getInt("likeCount"); 55 } 56 57 // 成功メッセージをJSONで返す 58 out.print("{\"likeCount\": " + likeCount + ", \"message\": \"いいね!が完了しました。\"}"); 59 out.flush(); 60 61 } catch (Exception e) { 62 e.printStackTrace(); 63 out.print("{\"likeCount\": 0, \"message\": \"エラーが発生しました: " + e.getMessage() + "\"}"); 64 out.flush(); 65 } finally { 66 try { 67 if (rs != null) rs.close(); 68 if (stmt != null) stmt.close(); 69 if (conn != null) conn.close(); 70 } catch (SQLException se) { 71 se.printStackTrace(); 72 } 73 } 74 } 75} 76

JavaScript

1<%@ page import="java.sql.*, java.io.*" %> 2<% 3 // データベース接続情報 4 String url = "jdbc:h2:tcp://localhost/~/han_gw"; // H2の接続URL 5 String user = "sa"; 6 String password = ""; 7 8 // POSTデータを取得 9 String userName = request.getParameter("Name"); 10 String ID = request.getParameter("ID"); // productIdをIDに変更 11 12 Connection conn = null; 13 PreparedStatement stmt = null; 14 ResultSet rs = null; 15 16 try { 17 // レスポンスの設定 18 response.setContentType("application/json"); // ここでコンテンツタイプを設定 19 20 // H2のJDBCドライバをロード 21 Class.forName("org.h2.Driver"); 22 conn = DriverManager.getConnection(url, user, password); 23 24 // データを挿入 25 String sql = "INSERT INTO LIKE_TABLE (id, name) VALUES (?, ?)"; 26 stmt = conn.prepareStatement(sql); 27 stmt.setString(1, ID); // productIdをIDに変更 28 stmt.setString(2, userName); // userNameを使用 29 stmt.executeUpdate(); 30 31 // いいね数を取得 32 String countSql = "SELECT COUNT(*) AS likeCount FROM LIKE_TABLE WHERE id = ?"; 33 stmt = conn.prepareStatement(countSql); 34 stmt.setString(1, ID); // productIdをIDに変更 35 rs = stmt.executeQuery(); 36 int likeCount = 0; 37 if (rs.next()) { 38 likeCount = rs.getInt("likeCount"); 39 } 40 41 // 成功メッセージをJSONで返す 42 out.print("{\"likeCount\": " + likeCount + ", \"message\": \"いいね!が完了しました。\"}"); 43 out.flush(); 44 45 } catch (Exception e) { 46 e.printStackTrace(); 47 out.print("{\"likeCount\": 0, \"message\": \"エラーが発生しました。\"}"); 48 out.flush(); 49 } finally { 50 try { 51 if (rs != null) rs.close(); 52 if (stmt != null) stmt.close(); 53 if (conn != null) conn.close(); 54 } catch (SQLException se) { 55 se.printStackTrace(); 56 } 57 } 58%> 59

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

いろいろ調べたがよくわからなかったです。

補足

コードが多くてすみません。有識者の方教えてください。

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

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

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

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

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

Lhankor_Mhy

2025/01/28 01:03

Java タグを追加した方が回答が付きやすそうな気がします。
webserver2

2025/01/28 01:23

コメントありがとうございます。                                             そのようにさせていただきます。
int32_t

2025/01/28 02:17

ボタンを押したら、期待に反してどういう動作をするのでしょうか? サーブレットのコードのどこまで期待通りに動いてますか?
webserver2

2025/01/28 02:32

ボタンを押したら、エラーが発生しましたと出ます。
int32_t

2025/01/28 02:38

「エラーが発生しました」の後、error.message の部分には何と表示されていますか。
jimbe

2025/01/28 02:40

>ボタンを押したら、エラーが発生しましたと出ます。 その文言の直前に色々英文などが出たはずで、それに何処で何が起きたのかが書かれています。
webserver2

2025/01/28 02:41

いいねボタンを押したら、ボタンの下にエラーが発生しましたと緑色で表示されます。
int32_t

2025/01/28 02:45 編集

「エラーが発生しました:」だけで後に何もないですか? もしそうなら、ブラウザの開発者ツールを開いて、その状態でボタンを押して、コンソールへ表示されるエラーを見てください。 また、開発者ツールのネットワークタブも見て、サーブレットとの通信がどうなっているか確認してくさだい。
jimbe

2025/01/28 02:47

LikeServlet クラスの 62 行目を e.printStackTrace(); ↓ e.printStackTrace(out); とすると詳細が表示されると思います。
webserver2

2025/01/28 02:53

<script> function likeButtonClick() { const userName = "ユーザー名"; // 実際のログインユーザー名をここに設定 const productId = "874"; // JSPで動的に商品IDを埋め込む fetch('LikeServlet', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: `NAME=&ID=` }) .then(response => response.json()) .then(data => { if (data.success) { // いいね数を更新 document.getElementById('likeCount').textContent = `いいね数: `; // 完了メッセージを表示 document.getElementById('message').textContent = "いいね!が完了しました。"; } else { // エラーメッセージを表示 document.getElementById('message').textContent = "エラーが発生しました。"; } }) .catch(error => { console.error('エラー:', error); document.getElementById('message').textContent = `エラーが発生しました: `; }); } </script>                                             いいねボタンを押したときのページのソースです。
int32_t

2025/01/28 03:13

ああ、なるほど、JSPの${の問題っぽいですね。
YT0014

2025/01/28 03:35 編集

JavaとJavaScriptは、別モノだと理解されていますか? ご提示いただいている中では、最初のものがHTML+JavaScriptだけどJava処理が混じっているのでJSPかと、DAOとしている2つ目と3つ目がJava、最後がHTML+JavaなのでJSPでしょう。 また、それぞれが、クライアントとサーバのどちらで動作するか、ご理解されていますでしょうか? エラーメッセージは、サーバで動作した場合、ログに出力されるのですが、ログファイルは確認されていますか? 加えて、「H2コンソール」は、H2データベース用の操作ツールです。 H2データベースそのものではないので、ご認識を改めていただくようお願いいたします。 H2独自の問題の可能性もありますので、「H2 Database」タグの追加もご検討ください
webserver2

2025/01/28 03:17

何をしたら治りますか?
YT0014

2025/01/28 03:39

ところで、DAOと最後のJSPは、使用されていないのでは?
guest

回答2

0

コードを共有していただきありがとうございます。問題が発生している箇所を確認するために、いくつかのポイントを見直してみましょう ●●●●

  1. ユーザー名の設定:

    javascript

    1const userName = "ユーザー名"; // 実際のログインユーザー名をここに設定

    この部分は固定の文字列になっています。実際のログインユーザー名を取得して変数に代入してください。例えば、サーバーサイドからユーザー名を動的に取得してJavaScriptに渡す必要があります。

  2. 商品IDの取得:

    javascript

    1const productId = "<%= id %>"; // JSPで動的に商品IDを埋め込む

    JSP内でidが正しく設定されていることを確認してください。

  3. JavaScript関数の位置:
    JavaScript関数likeButtonClick<h2>タグ内に書かれています。通常、JavaScriptはHTMLの<head>タグか<body>タグの末尾に配置します。

  4. サーバーサイドのエラーハンドリング:
    LikeServlet内でのエラー処理は問題ないように見えますが、デバッグのために詳細なエラーメッセージを確認することが重要です。

例えば、以下のようにユーザー名と商品IDを動的に取得し、JavaScriptに渡すコードを改善します:

修正案

JSPファイル:

jsp

1<div class="col-md-6"> 2 <h2 class="product-name"> 3 <%= itemName != null ? itemName : "<span style='font-size: 14px;'>商品名未設定</span>" %> 4 </h2> 5 <!-- いいねボタン --> 6 <button class="like-button" onclick="likeButtonClick()">いいね</button> 7 <span id="likeCount"></span> 8 <div id="message" style="color: green; margin-top: 10px;"></div> <!-- メッセージ表示用 --> 9 10 <script> 11 function likeButtonClick() { 12 const userName = "<%= session.getAttribute("userName") %>"; // サーバーからユーザー名を取得 13 const productId = "<%= id %>"; // JSPで動的に商品IDを埋め込む 14 15 fetch('LikeServlet', { 16 method: 'POST', 17 headers: { 18 'Content-Type': 'application/x-www-form-urlencoded', 19 }, 20 body: `NAME=${userName}&ID=${productId}` 21 }) 22 .then(response => response.json()) 23 .then(data => { 24 // いいね数を更新 25 document.getElementById('likeCount').textContent = `いいね数: ${data.likeCount}`; 26 // 完了メッセージを表示 27 document.getElementById('message').textContent = "いいね!が完了しました。"; 28 }) 29 .catch(error => { 30 console.error('エラー:', error); 31 document.getElementById('message').textContent = `エラーが発生しました: ${error.message}`; 32 }); 33 } 34 </script> 35</div>

これにより、実際のログインユーザー名を動的に取得して利用できるようになります。また、JavaScriptの関数をHTMLの末尾に移動することで、全ての要素が読み込まれた後にスクリプトが実行されるようにします。

投稿2025/01/28 06:12

編集2025/01/29 04:29
victoria88paul

総合スコア2

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

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

0

JSP中に ${式} があるとJavaの式としてサーバ側で処理されてしまうので、JavaScript側で評価してもらうには \${式} と書きます。

投稿2025/01/28 03:17

int32_t

総合スコア21871

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

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

webserver2

2025/01/28 03:20

どこにあるか教えてください。
int32_t

2025/01/28 05:07

「該当のソースコード」の一つ目のソース中に複数あります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問