Javaプログラミングから離れて年月が経ってしまったそんな時、
急遽、Java演習の依頼を受けてしまいました。
下記のソースコードはブラウザのパラメータを受け取り、
その値をDB(MySQL)上で検索して画面上に表示する簡単なJavaサーブレットです。
【action.java】
=========================================================================
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class action extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Action!</title></head><body>");
out.println("<h1>Profuct name is " + getValue(request) + " </h1>" );
out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" );
out.println("<p><a href=\"./form.html\">Return to input form</a>");
out.println("</body></html>");
out.close();
}
private String getValue( HttpServletRequest request ) {
String values = request.getParameter( "name" ); // ブラウザから送られた値を受け取る
if( values != null ) {
return( values );
}
return( "error occured!" );
}
// Access sample_db and returns price
private int get_price( String values2, PrintWriter out ) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
values2 = getValue(request);
int price = 0;
try {
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/sample_db", // url form of db
"admin", // user name
"******" // password
);
stmt = conn.createStatement();
rs = stmt.executeQuery( "SELECT price FROM product WHERE name = '" + values2 +"'" );
rs.first();
price = rs.getInt( "price" ); // get the value of the first column
} catch ( SQLException ex ) {
out.println( "SQLException: " + ex.getMessage() + "<br>" );
out.println( "SQLState: " + ex.getSQLState() + "<br>");
out.println( "VendorError: " + ex.getErrorCode() + "<br>");
}
finally {
if( rs != null ) {
try { rs.close(); } catch (SQLException ex) {}
rs = null;
}
if( stmt != null ) {
try { stmt.close(); } catch (SQLException ex) {}
rs = null;
}
}
return( price );
}
}
=========================================================================
上記ソースコードをコンパイル(javac)しても
以下のエラーが発生してしまいます。
【エラーメッセージ】
=========================================================================
action.java:25: エラー: シンボルを見つけられません
out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" );
^
シンボル: 変数 values2
場所: クラス action
action.java:44: エラー: シンボルを見つけられません
values2 = getValue(request);
^
シンボル: 変数 request
場所: クラス action
エラー2個
=========================================================================
何度も修正するも自身では解決に至りませんでしたので
皆様のお力をお借りしたく投稿致しました。
ご確認の程、宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
2 箇所のエラーはどちらも「シンボル: 変数」の所に書いてある変数がエラーの発生している文のある場所では定義されていないのが理由です。
最初の方はメソッドのその文の直前までである
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Action!</title></head><body>");
out.println("<h1>Profuct name is " + getValue(request) + " </h1>" );
で values2 が定義されていません。
2 番目の方はメソッドのその文の直前までである
private int get_price( String values2, PrintWriter out ) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
で request が定義されていません。
No.1 様の回答でも正常に動作しますが、get_price() の引数を変更したくないならば、
out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" );
を
out.println("<h1>Price of " + getValue(request) + " is " + get_price( getValue(request), out ) + " </h1>" );
にして、get_price() 内のほうのエラーが出ている行を削除してください。
なお、上記で言っている意味が分からないようであれば、まず変数のスコープについて復習してください。
hitomura様
ご返信ありがとうございます。
最初に投稿したJavaソースコードが若干誤っておりましたが、
ご指摘のとおり、主メソッド(service)にて変数を定義しておりませんでした。。
そこで改めて、今回の実装したい処理の流れをご説明させて頂きます。
下記に処理フローをご提示致しました。
ご確認願います。
1)
HTMLファイル:form.htmlにてフォーム欄に入力された値を
メソッド:getValueにて取得する
2)
取得した値:valuesをDB検索するメソッド:get_priceにて渡す
3)
受け渡された値:values2をDBでキーワード検索して一致した値の
price値:priceを引数として返す
4)
HTMLファイル:form.htmlの検索ボタン押下すると
次の画面にて「検索した値は【price値】です」と表示する
上記内容がそもそも実装したい一連のプログラムとなります。
その場合に最終的に表示させるメソッド:serviceへprice値を表示するには
以下の出力命令文では実装不可であることは認識しております。
out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" );
ここをどのように指定すればよいのか不明でございます。
上記内容をご理解頂きまして
ご指導の程、宜しくお願い致します。
以上
No.3
- 回答日時:
serviceメソッドには values2変数の宣言がないし
get_priceメソッドにはrequest変数の宣言がありません。
エラーメッセージの通りです。
しかし、エラーメッセージからソースを見れば
普通は充分分かる話だと思います。
どのようにエラーメッセージが理解出来ないでしょう?
No.1
- 回答日時:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class action extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Action!</title></head><body>");
out.println("<h1>Profuct name is " + getValue(request) + " </h1>" );
out.println("<h1>Price of " + getValue(request) + " is " + get_price( request, out ) + " </h1>" );
out.println("<p><a href=\"./form.html\">Return to input form</a>");
out.println("</body></html>");
out.close();
}
private String getValue( HttpServletRequest request ) {
String values = request.getParameter( "name" ); // ブラウザから送られた値を受け取る
if( values != null ) {
return( values );
}
return( "error occured!" );
}
// Access sample_db and returns price
private int get_price( HttpServletRequest request, PrintWriter out ) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String values2 = getValue(request);
int price = 0;
try {
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/sample_db", // url form of db
"admin", // user name
"******" // password
);
stmt = conn.createStatement();
rs = stmt.executeQuery( "SELECT price FROM product WHERE name = '" + values2 +"'" );
rs.first();
price = rs.getInt( "price" ); // get the value of the first column
} catch ( SQLException ex ) {
out.println( "SQLException: " + ex.getMessage() + "<br>" );
out.println( "SQLState: " + ex.getSQLState() + "<br>");
out.println( "VendorError: " + ex.getErrorCode() + "<br>");
}
finally {
if( rs != null ) {
try { rs.close(); } catch (SQLException ex) {}
rs = null;
}
if( stmt != null ) {
try { stmt.close(); } catch (SQLException ex) {}
rs = null;
}
}
return( price );
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初心者です。csvファイルの...
-
JavamailでGmailのお気に入りフ...
-
java シンボルが見つかりません
-
URL\正規表現@java
-
JSPからパラメータを取得してサ...
-
Javaの質問です。テキストファ...
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
Junitテストでvoid戻り値メッソ...
-
シャットダウンフックが呼ばれない
-
EXCEL VBA で、0から?1から?
-
テキストボックスに入力された...
-
べき乗
-
グレイコードの変換
-
C# ListBoxのインデックスの値...
-
javaで質問です。 文字列2023/2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
csv出力について
-
九九を横に表示する。
-
InputStream.read()でタイムア...
-
テキストファイルから空白行をよむ
-
Java int sum = 0は必要ですか?
-
javaのfor文が機能してないみた...
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
以下のJAVAプログラムでご質問...
-
Class.forNameでエラーになる
-
ソケットを使ったサーバとクラ...
-
テキストファイルにおいて任意...
-
テキストファイルの任意の文字...
-
JAVAでエラーがでる。
-
Inputstreamについて
-
ObjectInputStreamとStreamCorr...
-
Windowsでの標準入力の終了の仕方
-
[JAVA]エラーが解決できません。
おすすめ情報