ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのJSPについて質問です・・

  • mixiチェック
  • このエントリーをはてなブックマークに追加
僕ものぶさんと同じ「10日で覚えるJSP/サーブレット入門教室」
というテキストでJSPを勉強してます。
MySQLにJDBCでアクセスするんでですが、エラーがでてしまいます・・・・・。
コネクターはクラスパス通すんでしょうか?
どなたかアドバイスお願いできませんでしょうか・・・

動作環境
Windous2000
J2SDK1.4.2_12
Tomcat5.0
MySQL4.0
mysql-connector-java-3.0.15-ga-bin.jar

環境変数
CLASSPATH:.;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\ojima\WEB-INF\classes;

CATALINA_HOME:C:\Tomcat 5.0

JAVA_HOME:C:\j2sdk1.4.2_12

Path:;%JAVA_HOME%\bin;C:\mysql\bin

エラー内容
type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: Cannot create resource instance
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.ho.insert_jsp._jspService(insert_jsp.java:70)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


原因

javax.naming.NamingException: Cannot create resource instance
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:132)
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:301)
org.apache.naming.NamingContext.lookup(NamingContext.java:791)
org.apache.naming.NamingContext.lookup(NamingContext.java:138)
org.apache.naming.NamingContext.lookup(NamingContext.java:779)
org.apache.naming.NamingContext.lookup(NamingContext.java:138)
org.apache.naming.NamingContext.lookup(NamingContext.java:779)
org.apache.naming.NamingContext.lookup(NamingContext.java:138)
org.apache.naming.NamingContext.lookup(NamingContext.java:779)
org.apache.naming.NamingContext.lookup(NamingContext.java:151)
org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
javax.naming.InitialContext.lookup(InitialContext.java:347)
org.apache.jsp.ho.insert_jsp._jspService(insert_jsp.java:54)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

以上です。


コメント(50)

>>Class.forName("org.gjt.mm.mysql.Driver");

の一文のみにして実行してみてください

<%@ page contentType="text/html; charset=Windows-31J"
import="java.sql.*,javax.naming.*,javax.sql.*" %>
<html>
<head>
<title>ソフトウェア情報登録</title>
</head>
<body>
<%
Class.forName("org.gjt.mm.mysql.Driver");

%>

</body>
</html>

一文とはこういう事でしょうか??
なんとかつながりました。
ほんとありがとうございます!!
ただいま、フォームからMySQLのフィールドにデータを入れるプログラムを作りたいと思います。
ちょっとがんばってみます!!!!
もしかしたら、また書き込みするかもしれませんが・・・・
>13: おずぃさん

よろしければ解決に至った過程なりを書いていただけると
後々同じ問題で躓いた人が参考にできると思います。
>おずぃさん

おめでとうございます。
スケダイのもおっしゃられてますが、私も解決の過程が
知りたいです。

>もけさん

そういう本なんですよ^^;
それでは語らしていただきます。

ますWEB−INFにコネクターを入れてみました。それでも動かないので、のぶさんのアドバイス通りにClass.forName("org.gjt.mm.mysql.Driver");の一文で実行したところ、エラーなく接続できました。あとはhttp://www.hellohiro.com/jspdb.htmの書いてある通りにSQLにデータを入れて、JSPのコードを書いて実行したところ、SQL内のデータを、見事ブラウザに出力できました。

とそんな感じです。分かりにくかったらごめんなさい^_^;

>もけさん
研究でJSPつかってるもんで^_^;
やっぱPHPとかのほうが流行ってるんでしょうか?
>おずぃさん

レスどうもです。
JSPとPHPというか、MVCモデルを前提にすると、DB接続+情報取
得の部分をサーブレット、JavaBeansで作成し、JSPからはその
サーブレットを呼び出すことでデータを取得する作り方が一般
的ではあります。
より実践的な使用方法であれば、同書の第9日1・2・3時限目の
内容が実践で使用している組み方に近いです。

勉強なので、いろいろやってみるのがいいと思いますよ。
そのうち、サトリが開けるはずです(笑)
どうも、お久しぶりです。
自分なりにプログラム組んでみました。
HTMLから入力したのをJSPで、データベースに入力するのを作ってみました(某参考書を見ながら)
エラーは出ないんですが、うまくデータベースに入りません。
もしよろければ、アドバイスをお願いできませんでしょうか?
soft1.html→koko.jsp

soft1.html
<html>
<head>
<title>ソフトウェア情報登録</title>
</head>
<body>
<h1 style="background:#cccccc">ソフトウェア情報登録</h1>
<form method="POST" action="koko.jsp">
<table border="0">
<tr>
<th style="color:#FFffFF;background:#0086b2;text-align:right;">名前</th>
<td><input type="text" name="nam" size="35" /></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2;text-align:right;">URL</th>
<td><input type="text" name="url" size="100" /></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2;text-align:right;">入手日</th>
<td><input type="text" name="gdate" size="14" />(YYYY/MM/DD)</td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2;text-align:right;">ランク</th>
<td>
<select name="grade">
<option value="5">大変良い</option><option value="4">良い</option>
<option value="3">普通</option><option value="2">悪い</option>
<option value="1">非常に悪い</option>
</select>
</td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2;text-align:right;">メモ</th>
<td><input type="text" name="memo" size="100" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登録" />
<input type="reset" value="取消" />
</td>
</tr>
</table>
</body>
</html>

koko.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
try {
// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://jsp10?useUnicode=true&characterEncoding=SJIS";
con = DriverManager.getConnection(url);
// ステートメントオブジェクトを生成
stmt = con.createStatement();
// 全ての行を検索するSQL文を作成
String sql = "INSERT INTO softlist(nam,url,gdate,grade,memo) VALUES('" + request.getParameter("nam") + "','" + request.getParameter("url") + "','" + request.getParameter("gdate") + "','" + request.getParameter("grade") + "','" + request.getParameter("memo") + "')";
// クエリーを実行して結果セットを取得
ResultSet rs = stmt.executeQuery(sql);
} catch (Exception e) {
out.println("<font color=red><h3>エラー!</h3></font>" + e);
e.printStackTrace();
}
response.sendRedirect("soft1.html");
%>

ながながとすみません。
もし不明な部分があれば、おっしゃってください。
DBコネクションのcommitはどこでしているんでしょうか?

それにしても、JSPの中からいきなりHTMLへリダイレクトとは大胆なプログラムですね(^-^;
>おずぃさん
ソースのコメントとコードの内容がばらばらですね(笑)
もけさんのexecuteQueryを使用するが正解だと思います。
某参考書にもそうあります。
>>もけさん
アドバイスありがとうございます!さっそくやってみました。
エラーが出てしまいました;_;

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
try {
// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://jsp10?useUnicode=true&characterEncoding=SJIS";
con = DriverManager.getConnection(url);
// ステートメントオブジェクトを生成
stmt = con.createStatement();
// 全ての行を検索するSQL文を作成
String sql = "INSERT INTO softlist(nam,url,gdate,grade,memo) VALUES('" + request.getParameter("nam") + "','" + request.getParameter("url") + "','" + request.getParameter("gdate") + "','" + request.getParameter("grade") + "','" + request.getParameter("memo") + "')";
// クエリーを実行して結果セットを取得
ResultSet rs = stmt.executeQuery(sql);
} catch (Exception e) {
out.println("<font color=red><h3>エラー!</h3></font>" + e);
e.printStackTrace();
}
response.sendRedirect("soft1.html");
%>

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

JSPファイル: /test/koko.jsp の中の3行目でエラーが発生しました
生成されたサーブレットのエラーです:
C:\Tomcat 5.0\work\Catalina\localhost\ojima\org\apache\jsp\test\koko_jsp.java:61: シンボルを解決できません。
シンボル: メソッド executeUpdate (java.lang.String)
場所 : org.apache.jsp.test.koko_jsp の クラス
ResultSet rs = executeUpdate(sql);
^
エラー 1 個



org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:332)
org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:412)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


もうどうしていいんだか;;

>>OAさん
DBコネクションのcommitってなんでしょうか?コネクターの場所ですか?
>おずぃ さん

検索なのに"INSERT INTO"ですか?
選択と追加がごっちゃになっているような気がします。
executeUpdateメソッドの戻り値はintで結果の行数になりますよね。
コメントには「// 全ての行を検索するSQL文を作成 」とあっても、実際に発行しているSQL文はINSERTなのでResultSetはそもそもいらないような。

エラーになったときにそこで使用しているクラスやメソッドについてJDKのドキュメントで一度確認すると、案外単純なミスだったりすることがあります。
なんだかんだでJDKのドキュメントは結構役に立ちますよ。
>OAさん
DBがMySQLなので、デフォルトでオートコミットします。
MySQLは明示的に"BEGIN"とかしてトランザクションを開始する
必要があります。
まぁ、どうやるのかは私も勉強なのですが^^;
コミットよりも
conとstmtをクローズしているかどうかが
とても気になります。
>おずぃさん

>String url = "jdbc:mysql://jsp10?useUnicode=true&characterEncoding=SJIS";

ここで接続ユーザーとパスワードを指定してませんが、これだと
無理じゃないでしょうか?
まだ、MySQLのユーザーを作成していないなら、お使いの参考書
にMySQLでのユーザーの作り方があったとおもうので、ユーザー
を作ってください。

ユーザー、パスワードを指定すると

String url = "jdbc:mysql://jsp10?user=nobu&password=nobu&useUnicode=true&characterEncoding=SJIS";

になりますよ。

>response.sendRedirect("soft1.html");

あぁ、私これ知らないメソッドです(笑)
がんばってますね〜。
もうホントに皆さん色々とアドバイス感謝です!

>>フカキョンさん、スケダイさん
おお!ホントだ!コメントが・・・即直しました!!
そしてクローズしてませんでした。

>>のぶさん
ユーザーとパスは作ってますので、ユーザーとパスワードを指定してみました。

今教えていただいたのを参考にプログラムを作ってみました。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
%>
<%
try {
// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");

// データベースへ接続
String url = "jdbc:mysql://jsp10?user=jsp10&password=jsp10&useUnicode=true&characterEncoding=Shift_JIS";
con = DriverManager.getConnection(url);

// ステートメントオブジェクトを生成
stmt = con.createStatement();

// 全ての行を挿入するSQL文を作成
String sql = "INSERT INTO softlist(nam,url,gdate,grade,memo) VALUES('" + request.getParameter("nam") + "','" + request.getParameter("url") + "','" + request.getParameter("gdate") + "','" + request.getParameter("grade") + "','" + request.getParameter("memo") + "')";

// クエリーを実行して結果セットを取得
ResultSet rs = executeUpdate(sql);

//コミット
con.commit();

} catch (Exception e) {
out.println("<font color=red><h3>エラー!</h3></font>" + e);
e.printStackTrace();
}
//データベース接続を閉じる
con.close();
stmt.close();
response.sendRedirect("soft1.html");
%>

やはりエラーが・・・・;_+
皆さんに親切に教えていただいてるのになかなか出来ない自分が恥ずかしいです;;
>おずぃさん

もけさんご指摘の箇所が直っていません。

// クエリーを実行して結果セットを取得
ResultSet rs = executeUpdate(sql);

ResultSetオブジェクトはSELECTの結果を格納するものなので、
executeQueryの戻り値です。executeUpdateは処理結果をInt型
で返すので、この部分が型の不一致でエラーになっていると
思います。

正しくは、

int irtn;
irtn = executeUpdate(sql);

でどうでしょうか?

あと最後の

con.close();
stmt.close();

ですが、

stmt.close();
con.close();

のほうがいいです。
※個人的には"じゃないとダメ"だと思うのですが、コネクショ
ンを破棄すれば派生したステートメントも削除してくれる機能
がありそうなので、"危険"位ですかね・・・。
>>のぶさん もけさん
直してみました。

try {
stmt.close();
}
catch (Exception) {}
try {
con.close();
}
catch (Exception) {}

としたらエラーが出てしまったので

stmt.close();
con.close();

にしました。

やっぱ同じとこでエラーが・・いりんなサイト見たんですが;;

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
%>
<%
try{
// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");

// データベースへ接続
String url = "jdbc:mysql://jsp10?user=jsp10&password=jsp10&useUnicode=true&characterEncoding=Shift_JIS";
con = DriverManager.getConnection(url);

// ステートメントオブジェクトを生成
stmt = con.createStatement();

// 全ての行を挿入するSQL文を作成
String sql = "INSERT INTO softlist(nam,url,gdate,grade,memo) VALUES('" + request.getParameter("nam") + "','" + request.getParameter("url") + "','" + request.getParameter("gdate") + "','" + request.getParameter("grade") + "','" + request.getParameter("memo") + "')";

// クエリーを実行して結果セットを取得
int irtn;
irtn = executeUpdate(sql);

} catch (Exception e) {
out.println("<font color=red><h3>エラー!</h3></font>" + e);
e.printStackTrace();
}
//データベース接続を閉じる
stmt.close();
con.close();
%>
「同じところで」という抽象的なものではなく、エラーをそのまま張っていただかないとよくわからんです。
>おずぃさん

そもそもこのソースのどこでエラーが出ているのでしょう?
以前の方法のように、一度DB接続以降をコメントにして、
徐々にコメント解除してエラーの場所を特定して下さい。
>おずぃ さん

「// クエリーを実行して結果セットを取得 」の前に

System.out.println(sql);

の一文を追加して、コンソールに出力された結果を
教えてもらえませんか。

getParameterが失敗している可能性が有ります。
失礼。私の書いたのがまずってます。

■誤
irtn = executeUpdate(sql);

■正
irtn = stmt.executeUpdate(sql);
eclipseにWTPプラグインいれるとJSPでブレークポイントつかえるよ。
普通のJavaのプログラムに書いて動くのを確認してからJSPにしたほうがよくないです?
>かずきちさん
サーブレットで書いてからってことですか?
先にサーブレットで書くなら意味がないような・・・
良くわかんなくなってきたw
こんにちは。本日、このコミュを発見して、参加しました。
私もJAVAの勉強中の身で、みなさんに色々と質問させていただく事があると思いますが、よろしくお願いします。

早速、このトピックに目がいってしまったのですが、下記の2行を変更してもエラーは出ますか?
もし、既に解決済みだったらスミマセン。。。

// クエリーを実行して結果セットを取得
int irtn;
irtn = executeUpdate(sql);
   ↓
stmt.executeUpdate(sql);
※ResultSet rs= の部分は取っちゃいます。

あと、私がよくJDBC関連のエラーつぶしにすることは、JSP上のSQL文を1行にしてみる。余分な " を取って実行してみる。それと、SQL文を直接DB上で動くか確認する。などです。
JSPでエラーが出るとメンドイので、普通はJSPに込み入ったJavaのコードは書きません。

ログインすると、残り21件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。