実現したいこと
いいねボタンを押したら、ログインした人(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等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
いろいろ調べたがよくわからなかったです。
補足
コードが多くてすみません。有識者の方教えてください。
