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

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

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

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

Q&A

解決済

2回答

15182閲覧

id_product cannot be resolvedとSQLについて

atena

総合スコア20

JSP

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

0グッド

0クリップ

投稿2018/06/07 06:11

編集2018/06/07 06:35

以下の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)

問題のプログラム文

jsp

1<%@ page contentType = "text/html; charset=UTF-8" %> 2<%@ page import = "java.io.*" %> 3<%@ page import = "java.util.*" %> 4<%@ page import = "java.sql.*" %> 5<%! 6String escapeHTML(String s) { 7 return s.replace("&", "&amp;") 8 .replace("\"", "&quot;") 9 .replace("<", "&lt;") 10 .replace(">", "&gt;") 11 .replace("'", "&#39;"); 12} 13%> 14<% 15request.setCharacterEncoding("UTF-8"); 16response.setCharacterEncoding("UTF-8"); 17 18Connection conn = null; 19String msg = ""; 20String key = request.getParameter("key"); 21if(request.getParameter("id") != null){ 22 int id_product = Integer.parseInt(request.getParameter("id")); 23} 24else{ 25 int id_product = 0; 26} 27/* データベース接続 */ 28Class.forName("org.sqlite.JDBC"); 29conn = DriverManager.getConnection("jdbc:sqlite:/home/sys/s216336/apache-tomcat-8.5.31/webapps/a4/shopping.db"); 30 31if(id_product.equals(0)){ 32 /* SQL問い合わせ */ 33 String sql = "select * from products WHERE products.name LIKE \'%" + key + "%\'"; 34 Statement state = conn.createStatement(); 35 ResultSet rs = state.executeQuery(sql); 36 ResultSetMetaData md = rs.getMetaData(); 37 int cols = md.getColumnCount(); 38 39 /* 表開始と表頭 */ 40 if(rs != null){ 41 msg += "<table border=\"1\">\n"; 42 msg += "<tr><th>&nbsp;</th>"; 43 for (int i = 2; i <= cols-3; i++) { 44 msg += "<th>" + md.getColumnLabel(i) + "</th>"; 45 } 46 msg += "</tr>\n"; 47 48 /* 表の各行 */ 49 while(rs.next()){ 50 msg += "<tr>"; 51 msg += "<td>" + rs.getRow() + "</td>"; 52 for (int i = 2; i <= cols-3; i++) { 53 msg += "<td>" + escapeHTML(rs.getString(i)) + "</td>"; 54 } 55 msg += "<td><form><button action=\"products.jsp\" method=\"POST\" name=\"id\" value=\"" + rs.getString(1) + "\">カートに追加</button></form></td>"; 56 msg += "</tr>\n"; 57 } 58 /* 表終了 */ 59 msg += "</table>\n"; 60 } 61 else{ 62 msg += "キーワードと一致する商品はありません。"; 63 } 64 65} 66else{ 67// String sql = "insert into chosenproducts(chosenproduct_id, user_id, product_id, quantity, deleted, created_at) values( , 101, , , ,)"; 68} 69%> 70<!DOCTYPE html> 71<html> 72<head> 73<title>検索</title> 74</head> 75<body> 76 <br> 77 検索結果 78 <br><br> 79 <%= msg %> 80 <br> 81 <input type="button" onclick="location.href='top.jsp'" value="TOPへ戻る" /> 82</body> 83</html>

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

if(rs != null){}

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

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

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

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

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

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

mather

2018/06/07 06:30

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

2018/06/07 06:32

ありがとうございます
guest

回答2

0

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

投稿2018/06/07 06:57

mather

総合スコア6753

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

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

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 06:19

編集2018/06/07 06:35
tkturbo

総合スコア5572

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

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

atena

2018/06/07 06:27

keyのように宣言すると Cannot invoke equals(int) on the primitive type int というエラー文になったのでif文で条件分け処理してみたのですが・・・
tkturbo

2018/06/07 06:35

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

2018/06/07 06: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) ```
mather

2018/06/07 06:44

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

2018/06/07 06:47

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

2018/06/07 06:48

> 素直に == を使えばいい ↑matherさんのこれに1票。(「cannot be resolved」にしかフォーカスしてなかった。>自分)
atena

2018/06/07 06:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問