- PR -

JDBCによるデータベースからの検索

投稿者投稿内容
ぷりん
会議室デビュー日: 2004/08/31
投稿数: 8
投稿日時: 2004-09-23 14:41
ぷりんです。

JSPを勉強しているものです。
セレクト画面での選んだキーワードによるデータベース
からの検索をしようとしています。

HTML上でのselect画面からのデータベース検索はできました。
以下のようなもので成功しました。
<select name="key" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>


そのselectの部分を直接書くのではなく,
データベースから呼び出したいのですが・・。
javaBeanを使うところで手間取っています。
ご教授お願いいたします。

以下がプログラムです。

<%@ page contentType="text/html; charset=Shift_JIS"
import="java.sql.*,jutyu.kaisyamei" %>

<jsp:useBean id="kaisyamei" scope="request" class="jutyu.kaisyamei" />

<%
//データベース設定
String sv = "localhost"; //サーバ名
String db = "recycle"; //データベース名
String user = ""; //ユーザ名
String pass = ""; //パスワード
String encode = "Shift_JIS"; //文字コード
//データベースに接続する
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://" + sv + "/" + db
+ "?user=" + user
+ "&password=" + pass
+ "&useUnicode=true&characterEncoding=" + encode;
Connection conn = DriverManager.getConnection(url);
//データを取得する
kaisyamei.executeQuery(conn);
%>
<html>
<head>
<title>データを検索する</title>
</head>
<body>

//SQLを組み立てる
if (request.getMethod().equals("POST")) {
key= cnvString(request.getParameter("key"));

//キーワードが入力されたときはデータを絞り込む
if (key.equals("") == false) {
sql += " WHERE id = '" + key + "'";
}
}


<FORM name="MyForm">
<SELECT NAME="MySt" onChange="onChange()">
<OPTION VALUE=0>選択してください
<%=kaisyamei.getOptions() %>
</SELECT>
<INPUT name="MyText1">
</FORM>

<SCRIPT LANGUAGE="JavaScript">
<!--
function onChange () {
data=new Array(
new Array('name') <%=kaisyamei.getArrays() %>
);
KOUMOKU = data[document.MyForm.MySt.selectedIndex];
document.MyForm.MyText1.value=KOUMOKU[1];

}
//-->
</SCRIPT>

<%
//取り出したデータを表示する
out.println("<table border=\"1\">");
out.println("<tr>");
out.println("<td>ID</td>");
out.println("<td>名前</td>");
out.println("</tr>");
while (rs.next()) {
out.println("<tr>");
out.println("<td>" + rs.getInt("id") + "</td>");
out.println("<td>" + rs.getString("name") + "</td>");
out.println("</tr>");
}
out.println("</table>");

//データベース接続を閉じる
conn.close();
%>
</body>
</html>



エラーは,
while (rs.next()) {
^
out.println("<td>" + rs.getInt("id") + "</td>");

out.println("<td>" + rs.getString("name") + "</td>");

とうので,rs のところにでてきます。
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2004-09-23 14:52
rs が定義されてないだけでは?

また、kaisyamei が何物かわかりませんが、executeQuery の後で sql を
組み立てているのはよいのですか?

どういったエラーが出たのかも書いたほうがよいですよ。
ぷりん
会議室デビュー日: 2004/08/31
投稿数: 8
投稿日時: 2004-09-23 14:55
ボアさん。早速のお返事ありがとうございまs。
一つめです。
kaisyameiというのは,javaファイルです。
以下のようなプログラムです。

package jutyu;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import java.util.ArrayList;
public class kaisyamei implements Serializable {
private ArrayList array;
public void executeQuery(Connection conn) throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM buhinmei");
array = new ArrayList();
while (rs.next()) {
array.add(
new String[] {
rs.getString("id"),
rs.getString("name")});
}
rs.close();
stmt.close();
}
public String getArrays() {
StringBuffer ret = new StringBuffer();
for (int i = 0; i < array.size(); i++) {
String[] current = (String[]) array.get(i);
ret
.append(",new Array('")
.append(current[0])
.append("','")
.append(current[1])
.append("')");
}
return ret.toString();
}
public String getOptions() {
StringBuffer ret = new StringBuffer();
for (int i = 0; i < array.size(); i++) {
String[] current = (String[]) array.get(i);
ret
.append("<OPTION VALUE=")
.append(i+1)
.append(">")
.append(current[0])
.append("</OPTION>");
}
return ret.toString();
}
}
ぷりん
会議室デビュー日: 2004/08/31
投稿数: 8
投稿日時: 2004-09-23 14:56
二つ目です。
エラー内容な

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

JSPファイル: /jsp/shisaku/s1.jsp の中の行: 60でエラーが発生しました

生成されたサーブレットのエラーです:
[javac] Compiling 1 source file

C:\Program Files\Apache Group\Tomcat 4.1\work\Standalone\localhost\examples\jsp\shisaku\s1_jsp.java:103: シンボルを解決できません。
シンボル: 変数 rs
場所 : org.apache.jsp.s1_jsp の クラス
while (rs.next()) {
^



JSPファイル: /jsp/shisaku/s1.jsp の中の行: 60でエラーが発生しました

生成されたサーブレットのエラーです:
C:\Program Files\Apache Group\Tomcat 4.1\work\Standalone\localhost\examples\jsp\shisaku\s1_jsp.java:105: シンボルを解決できません。
シンボル: 変数 rs
場所 : org.apache.jsp.s1_jsp の クラス
out.println("<td>" + rs.getInt("id") + "</td>");
^



JSPファイル: /jsp/shisaku/s1.jsp の中の行: 60でエラーが発生しました

生成されたサーブレットのエラーです:
C:\Program Files\Apache Group\Tomcat 4.1\work\Standalone\localhost\examples\jsp\shisaku\s1_jsp.java:106: シンボルを解決できません。
シンボル: 変数 rs
場所 : org.apache.jsp.s1_jsp の クラス
out.println("<td>" + rs.getString("name") + "</td>");
^
エラー 3 個


at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:130)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:293)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:370)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:473)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:190)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:324)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:395)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:673)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:615)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:786)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)

YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-09-23 15:31
引用:

ぷりんさんの書き込み (2004-09-23 14:56) より:
生成されたサーブレットのエラーです:
[javac] Compiling 1 source file

C:Program FilesApache GroupTomcat 4.1workStandalonelocalhostexamplesjspshisakus1_jsp.java:103: シンボルを解決できません。
シンボル: 変数 rs
場所 : org.apache.jsp.s1_jsp の クラス
while (rs.next()) {


このエラーの意味はわかりますか?
念の為説明すると、単なる構文誤りによるコンパイルエラーです。
rsと言う変数が宣言されていないか、宣言されていてもスコープ外に
なっていると言う意味です。
rsを宣言しているところと、使用しているとこをが適切かをチェックすれば
原因がわかると思います。

あと、コードを貼り付けるときは[code]〜[/code]で囲ってくださいね。


ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2004-09-23 15:35
「シンボルを解決できません。」そのまんまですね。
が、そもそもここで ResultSet を参照することからして違うような。

処理の流れを追ってみたほうがよいですよ。
ぷりん
会議室デビュー日: 2004/08/31
投稿数: 8
投稿日時: 2004-09-23 15:38
YOU@ITさん。お返事ありがとうございます。
rsが宣言されていませんでした(><)
rsをいれたところもっとエラーが増えてしまいました・・・。
構文そのものを理解してないようです(><)
cordeすいませんでした。

どういうふうに検索をしたらよいのでしょうか・・。

初心者ながら、身分に合わない課題が降りかかって,
対応に困っております。
 
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 11:02
Java、データベースアクセス、HTMLなどについての基本的な知識なしにプログラムを組もうと
されている、という印象を受けます。正直言って、掲示板に頼るのは無理があるでしょう。

まずは「課題を投げた人」から時間的な猶予をもらって、基本的なところを勉強した上で、
不明な点を掲示板で聞くようにしたらどうでしょうか。また、周囲に質問できる人はいない
のでしょうか? 掲示板よりはよっぽど素早い回答が返ってくると思いますが。

もし時間の猶予ももらえない、周りに聞く人もいない、ということであれば、まず時間内に
解決するのは無理だ、ということを伝えて対応を考えてもらう必要があるでしょう。

スキルアップ/キャリアアップ(JOB@IT)