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

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

ただいまの
回答率

90.53%

  • JSP

    929questions

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

id_product cannot be resolvedとSQLについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 198

atena

score 10

以下の2点についてお聞きしたいです。

①このエラーはどうすれば取れるでしょうか?

エラー文

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: 

JSPファイル: [/products.jsp] の中の[31]行目でエラーが発生しました
id_product cannot be resolved
28: Class.forName("org.sqlite.JDBC");
29: conn = DriverManager.getConnection("jdbc:sqlite:/home/sys/s216336/apache-tomcat-8.5.31/webapps/a4/shopping.db");
30: 
31: if(id_product.equals(0)){
32:     /* SQL問い合わせ */
33:     String sql = "select * from products WHERE products.name LIKE \'%" + key + "%\'";
34:     Statement state = conn.createStatement();


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:212)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:495)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:379)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:351)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:335)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:368)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

問題のプログラム文

<%@ page contentType = "text/html; charset=UTF-8" %>
<%@ page import = "java.io.*" %>
<%@ page import = "java.util.*" %>
<%@ page import = "java.sql.*" %>
<%!
String escapeHTML(String s) {
    return s.replace("&", "&amp;")
            .replace("\"", "&quot;")
            .replace("<", "&lt;")
            .replace(">", "&gt;")
            .replace("'", "&#39;");
}
%>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

Connection conn = null;
String msg = "";
String key = request.getParameter("key");
if(request.getParameter("id") != null){
    int id_product = Integer.parseInt(request.getParameter("id"));
}
else{
    int id_product = 0;
}
/* データベース接続 */
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:/home/sys/s216336/apache-tomcat-8.5.31/webapps/a4/shopping.db");

if(id_product.equals(0)){
    /* SQL問い合わせ */
    String sql = "select * from products WHERE products.name LIKE \'%" + key + "%\'";
    Statement state = conn.createStatement();
    ResultSet rs = state.executeQuery(sql);
    ResultSetMetaData md = rs.getMetaData();
    int cols = md.getColumnCount();

    /* 表開始と表頭 */
    if(rs != null){
        msg += "<table border=\"1\">\n";
        msg += "<tr><th>&nbsp;</th>";
        for (int i = 2; i <= cols-3; i++) {
            msg += "<th>" + md.getColumnLabel(i) + "</th>";
        }
        msg += "</tr>\n";

        /* 表の各行 */
        while(rs.next()){
            msg += "<tr>";
               msg += "<td>" + rs.getRow() + "</td>";
                for (int i = 2; i <= cols-3; i++) {
                       msg += "<td>" + escapeHTML(rs.getString(i)) + "</td>";
            }
            msg += "<td><form><button action=\"products.jsp\" method=\"POST\" name=\"id\" value=\"" + rs.getString(1) + "\">カートに追加</button></form></td>";
            msg += "</tr>\n";
        }
        /* 表終了 */
        msg += "</table>\n";
    }
    else{
        msg += "キーワードと一致する商品はありません。";
    }

}
else{
//    String sql = "insert into chosenproducts(chosenproduct_id, user_id, product_id, quantity, deleted, created_at) values( , 101, , , ,)";
}
%>
<!DOCTYPE html>
<html>
<head>
<title>検索</title>
</head>
<body>
    <br>
    検索結果
    <br><br>
    <%= msg %>
    <br>
    <input type="button" onclick="location.href='top.jsp'" value="TOPへ戻る" />
</body>
</html>

②「SQL文の結果が何も得られなかった時」という条件式を

if(rs != null){}

で実行できなかった原因について教えていただいけると幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/06/07 15:30

    タイトルにない質問を付け加えると見落とされます。もし聞きたいことが複数あるなら質問の冒頭に「下記2点についてお聞きしたいです」など書いておくことをおすすめします。

    キャンセル

  • atena

    2018/06/07 15:32

    ありがとうございます

    キャンセル

回答 2

+1

2つ目の質問に関してですが、 executeQuery の結果が0件でも null にはなりません。
ResultSet から値を取得してリスト化するなりして、その件数が0件であることを確認しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

if(request.getParameter("id") != null){
    int id_product = Integer.parseInt(request.getParameter("id"));
    // ↑ここで宣言している。ここは「ifブロックの中」
}
else{
    int id_product = 0;
    // ↑ここで宣言している。ここは「ifブロックの中」
}
/* データベース接続 */
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:/home/sys/s216336/apache-tomcat-8.5.31/webapps/a4/shopping.db");

if(id_product.equals(0)){
    // ↑ここで使用している。ここは宣言した「ifブロックの外」

↑「id_product」の宣言がifブロックの中で行われています。
これでは、ifブロックの外で使うことができません。

以下、コメント(2018/06/07 15:27)に返信。

keyのように宣言すると

Cannot invoke equals(int) on the primitive type int

というエラー文になったのでif文で条件分け処理してみたのですが・・・

int id_product; // <= ここは「ifブロックの外」
if(request.getParameter("id") != null){
    id_product = Integer.parseInt(request.getParameter("id")); // <= 値を設定するだけ
}else{
    id_product = Integer.parseInt(request.getParameter("id")); // <= 値を設定するだけ
}


↑こうすればいいだけじゃね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/07 15:27

    keyのように宣言すると

    Cannot invoke equals(int) on the primitive type int

    というエラー文になったのでif文で条件分け処理してみたのですが・・・

    キャンセル

  • 2018/06/07 15:35

    コメントへの返信を回答本体に追記しました。

    キャンセル

  • 2018/06/07 15:41

    やってみましたが解決しませんでした.

    ```
    org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:

    JSPファイル: [/products.jsp] の中の[32]行目でエラーが発生しました
    Cannot invoke equals(int) on the primitive type int
    29: Class.forName("org.sqlite.JDBC");
    30: conn = DriverManager.getConnection("jdbc:sqlite:/home/sys/s216336/apache-tomcat-8.5.31/webapps/a4/shopping.db");
    31:
    32: if(id_product.equals(0)){
    33: /* SQL問い合わせ */
    34: String sql = "select * from products WHERE products.name LIKE \'%" + key + "%\'";
    35: Statement state = conn.createStatement();


    Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:212)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:495)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:379)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:351)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:335)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:368)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    ```

    キャンセル

  • 2018/06/07 15:44

    プリミティブなint型にはequalsメソッドが使えないと言われているので、素直に == を使えばいいと思いますが…。

    キャンセル

  • 2018/06/07 15:47

    解決しました。ありがとうございます!!

    キャンセル

  • 2018/06/07 15:48

    > 素直に == を使えばいい

    ↑matherさんのこれに1票。(「cannot be resolved」にしかフォーカスしてなかった。>自分)

    キャンセル

  • 2018/06/07 15:50

    tkturboさんもありがとうございます。すごく初歩的なミスでした・・・恥ずかしい

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JSP

    929questions

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