

いいねのリンクを押し、記事ごとのいいねの総数を表示するプログラムを作りたいが、jspを実行しても作動しない。

[![画像の説明をここに入力](https://i.stack.imgur.com/tr40n.png)](https://i.stack.imgur.com/tr40n.png)

**test.jsp**

[code]

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "model.Goods" %>
    <% Goods goods = new Goods(); %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>テスト画面</title>
    </head>
    <body>
    <a href ="/gotoFukuoka/GoodAdd?user_id=<%=rs.getString("user_id")%>?article_id=<%= 
    rs.getString("article_id")%>>いいね</a><br>
    <p>いいね数：<%= goods.getGoodCnt() %></p>
    </body>
    </html>
    
[/code]

**Goods.java(JavaBeans)**

[code]

    package model;
    
    import java.io.Serializable;
    
    public class Goods implements Serializable{
    
        private String article_id;
        private String user_id;
        private int goodCnt;
    
        public int getGoodCnt() {
            return goodCnt;
        }
        public void setGoodCnt(int goodCnt) {
            this.goodCnt = goodCnt;
        }
        
        public Goods() {}
        public Goods(String article_id, String user_id) {
            this.article_id =article_id;
            this.user_id = user_id;
        }
    
        public String getArticle_id() {
            return article_id;
        }
    
        public void setArcticle_id(String article_id) {
            this.article_id = article_id;
        }
    
        public String getUser_id() {
            return user_id;
        }
    
        public void setUser_id(String user_id) {
            this.user_id = user_id;
        }
    
    
    }
    
[/code]

**GoodAdd.java(Servlet)**

[code]

    package servlet;
    
    import java.io.IOException;
    
    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 model.GetGoodLogic;
    import model.GoodLogic;
    import model.Goods;
    
    /**
     * いいね追加のコントローラ
     */
    @WebServlet("/GoodAdd")
    public class GoodAdd extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // リクエストパラメータから検索条件の取得、（JSPからuser_id, article_idを取得）
                request.setCharacterEncoding("UTF-8");
                String user_id = request.getParameter("user_id");
                String article_id = request.getParameter("article_id");
    
                //データをGoods()のコンストラクタに入れる
    
                Goods goods = new Goods(user_id, article_id);
                GoodLogic goodLogic = new GoodLogic();
                goodLogic.goodPlus(goods);
    
                request.setAttribute("goods", goods);
    
        }
    
    }
    
[/code]

**GoodLogic.java(model)**

[code]

    package model;
    
    import dao.GoodsDAO;
    
    public class GoodLogic {
    
        public void goodPlus(Goods goods) {
    
            GoodsDAO dao = new GoodsDAO();
            dao.insert(goods);
        }
    }
    
[/code]

**GetGoodLogic.java(model)**

[code]

    package model;
    
    import dao.GoodsDAO;
    
    public class GetGoodLogic {
        public Goods execute(Goods goods) {
    
            GoodsDAO dao = new GoodsDAO();
            Goods good = dao.select();
            return good;
        }
    }
    
[/code]

**GoodsDAO**

[code]

    package dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import model.Goods;
    
    /*
     * いいねに関するＤＡＯクラス
     */
    public class GoodsDAO {
    
         private final String url = "jdbc:postgresql://localhost:5432/Goods";
            private final String user = "postgres";
            private final String passWord = "test";
    
            /********************************************************************************
             * 「いいね」テーブルから記事IDを検索し、いいねを集計して検索結果を返します。
             ********************************************************************************/
            public ResultSet select(String article_id) {
                Connection con = null;
                PreparedStatement st = null;
                ResultSet rs = null;
    
    
                try {
                     /* JDBCドライバの定義 */
                     Class.forName("org.postgresql.Driver");
    
                     /* PostgreSQLへの接続 */
                     con = DriverManager.getConnection(url, user, passWord);
    
                     /* SELECT文の準備 */
                     String sql = "select article_id, count(*) ";
                     sql += "from Goods ";
                     sql += "group by article_id ";
                     sql += "order by count(*) DESC; ";
                     st = con.prepareStatement(sql);
    
    
                     /* SELECT文の実行 */
                     rs = st.executeQuery();
    
    
                } catch(Exception e) {
                    System.out.println("DBアクセス時にエラーが発生しました。");
                    e.printStackTrace();
                } finally {
                     /* PostgreSQLとの接続を切断 */
                    if(rs != null) {
                        try {
                            rs.close();
                        } catch (SQLException e) {}
                    }
    
                    if(st != null) {
                        try {
                            st.close();
                        } catch (SQLException e) {}
                    }
    
                    if(con != null) {
                        try {
                            con.close();
                        } catch (SQLException e) {}
                    }
                }
    
                return rs;
            }
    
            /********************************************************************************
             * 「いいね」テーブルにいいねを追加します
             ********************************************************************************/
    
            public int insert(Goods goods) {
                Connection con = null;
                PreparedStatement st = null;
                int rs = 0;//更新件数
    
                try {
                     /* JDBCドライバの定義 */
                     Class.forName("org.postgresql.Driver");
    
                     /* PostgreSQLへの接続 */
                     con = DriverManager.getConnection(url, user, passWord);
    
                     /* INSERT文の準備 */
                     String sql = "";
                     sql = "INSERT INTO Goods(user_id, article_id) ";
                     sql += "VALUES(?, ?);";
    
                     st = con.prepareStatement(sql);
                     st.setString(1, goods.getUser_id());
                     st.setString(2, goods.getArticle_id());
    
                     /* SELECT文の実行 */
                     rs = st.executeUpdate();
    
                } catch(Exception e) {
                    System.out.println("DBアクセス時にエラーが発生しました。");
                    e.printStackTrace();
                } finally {
                    /* PostgreSQLとの接続を切断 */
                    if(st != null) {
                        try {
                            st.close();
                        } catch (SQLException e) {}
                    }
    
                    if(con != null) {
                        try {
                            con.close();
                        } catch (SQLException e) {}
                    }
                }
    
    
                return rs;
            }
    
[/code]

**SQL**

[code]

    CREATE TABLE Goods(
      user_id       VARCHAR (30)  NOT NULL,
      article_id    SERIAL        NOT NULL,
      good          NUMERIC       DEFAULT 0,
      PRIMARY KEY (article_id));
    
[/code]


CC BY-SA 4.0
2020-11-02T08:18:25.077
71664
2023-11-22T13:06:45.960
2020-11-04T02:57:04.390
42195
42195
question
java postgresql jsp servlet
Servlet, Java, PostgreSQLにて「いいね機能」を実装するには？


間違っているところは他にもあるかもしれませんが、少なくとも明らかに間違っているのは次の行ですね。

[code]

    <a href ="/gotoFukuoka/GoodAdd?user_id=<%=rs.getString("user_id")%>?article_id=<%= 
    rs.getString("article_id")%>>いいね</a><br>
    
[/code]

二つ目のクエリーパラメーターが`?article_id=`となっているので、`request.getParameter("article_id")`はnullにはなるはず。なので`&article_id=`に変更する必要があります。


CC BY-SA 4.0
2020-11-02T12:04:23.933
71675
2020-11-02T12:04:23.933
21092
71664
answer