一回も披露したことのない豆知識

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個
=========================================================================

何度も修正するも自身では解決に至りませんでしたので
皆様のお力をお借りしたく投稿致しました。
ご確認の程、宜しくお願い致します。

A 回答 (3件)

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() 内のほうのエラーが出ている行を削除してください。

なお、上記で言っている意味が分からないようであれば、まず変数のスコープについて復習してください。
    • good
    • 0
この回答へのお礼

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>" );

ここをどのように指定すればよいのか不明でございます。

上記内容をご理解頂きまして
ご指導の程、宜しくお願い致します。


以上

お礼日時:2016/01/16 20:52

serviceメソッドには values2変数の宣言がないし


get_priceメソッドにはrequest変数の宣言がありません。

エラーメッセージの通りです。

しかし、エラーメッセージからソースを見れば
普通は充分分かる話だと思います。

どのようにエラーメッセージが理解出来ないでしょう?
    • good
    • 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 );
}

}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報