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

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

Javaの課題丸投げコミュのサーブレットの質問もよろしいでしょうか?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
http://www.dotup.org/uploda/www.dotup.org19142.zip.html
すみません。サーブレットの問題でも宜しいでしょうか?スレ違いでしたら教えて下さい。課題でわからないものがありこちらで質問させて頂こうと思ったのですが、それ以前の問題に突き当たったのでまずそちらから質問させて頂きます。
課題の方は、学校のoracle10gサーバに対してJDBC接続してテーブルの操作を行うサーブレットを作成するものです。この課題をやるために、まずは自分のノートパソコンでデバッグしたいと考え、開発環境をインストールしておりました。自分のノートパソコンはMacOSXで、オラクルはインストール出来ないので、MySQLをインストールし、EclipseにTomcat6.0.18とplug-in(sysdeo)を入れてとりあえずデバッグ出来る環境を作りました。一応、上記URLのsankoディレクトリにある「MySQLTest.java」の方はEclipse上で問題なく動作したので、MySQLのJDBCドライバのクラスパス設定やTomcatのplug-inのインストールも問題ないと思います。しかし、「SimpleJDBC.java」の方が動作しません(コンパイルは出来ますが実行するとExceptionエラーになります。)。このファイルは、学校のOracle10g環境では動いていました。単純にオラクルのドライバのロード(Class.forName)と接続まわり(DriverManager.getConnection)の2行をMySQL用に変更するだけで使用できるはずだと思ってその二行のみを変更したのですが、駄目でした。。どこが間違えているのかわかりません。。(MySQLTest.javaでは同じ記述でmysqlデータベースに接続できていますので、記述も問題ないと思うのですが。。)やはりクラスパスまわりでしょうか?なお、学校ではodjbc.jarというファイルも使っていたようだったのでこのファイルもダウンロードしてパスを通してみたのですがエラーは変わりませんでした。エラー内容とweb.xmlも念のために添付致します。申し訳ありませんが分かる方教えて下さい。宜しくお願いします。

コメント(21)

Exceptionの内容を書きましょう。かかないと何もわからない。

error.logを確認したけど 78行目でNullポインターえくせぷしょはいてますよ。

てか、なんでOracleいれないの??試用版なんてただで使わせてくれるんだけど。。
OTNのアカウントもっていますか???

あとわいとさんありがとうございます。Exceptionは画面に出力されたものをテキストにコピーしたので、これがExceptionエラーだと思っているのですが、これ以外のことをおっしゃっていますでしょうか。素人ですみません。

78行目のSQL文は学校の環境では同じものでも成功するのですが。。成功すると画面にログ番号とメッセージがnullで表示されます。念のため、strにnullの代わりに文字列を入れてみたのですが結果は同じでした。

オラクルは、サーバの方でしょうか?ノートパソコンにオラクルサーバはちょっと重そうなので控えているのですが。。MySQLでやろうと思っています。こちらの話ですみません。なので、もし自分の端末でMySQL接続出来なければ、学校で直接viで作業するくらいの勢いです。。

>なお、学校ではodjbc.jarというファイルも使っていたようだったのでこのファイルもダウンロードしてパスを通してみたのですがエラーは変わりませんでした。

ClassNotFoundExceptionでてませんか?なおojdbcはOracle専用なのでMYSql用のきっちりとパスを通してください。。


あとわいとさんご回答ありがとうございます。ojdbcは勉強不足でした。このドライバは削除しておきます。なお、MySQL用のドライバは通しています。Eclipseの実行時のプロパティにて、クラスパスのユーザエントリに"mysql-connector-java-5.1.7-bin.jar"を外部jarとして追加しています。この手順は、問題なくMySQLに接続出来ているMySQLTest.javaと同様の手順です。

ClassNotFoundExceptionは出ていないです。添付したテキストファイルが画面をコピーしたものなのですが、この最初が「Servlet JDBC Access counter 1 select * from student」と表示されている以上、doGet()処理がなされているので、クラスは見つかっていると思います。。
>4: voewfy さん
> 「Servlet JDBC Access counter 1 select * from student」

"error.txt" に上記の文言は見付けられなかったのですが、画面に表示されるメッセージを全てコピーしたのでしょうか?

> There have been 2 messages logged. java.lang.NullPointerException
> at SimpleJDBC.doGet(SimpleJDBC.java:78)
...(以下略)

というメッセージと "SimpleJDBC.java" が正しいとすると、

> out.println("</BODY></HTML>");

ここで、エラーが起きていることになるけど本当かなぁ?
まさか、out が null になっているなんてことがあるのか?
78行目って

>out.println("</BODY></HTML>");
でしょ?? outがnullなんで、

その前のメソッド呼び出しでnullポはかずに、そこではいてる理由を考えればよいかと。。
78行目ってここでNullPoはくなら、前でもはいてるはずだね。。
、、、、、食い違っていますね。。。。このソース。。大丈夫???エラーと対応づいてないソースくっつけてませんか??
あとわいとさん、杵搗き餅@反省中さん、失礼致しました。アップする際にコメントを取ったりしたので、行数がズレてしまっていました。あと、Exceptionエラーの一部不明な文言(select * from student)は、試しにWEB-INFの上にあるindex.htmlの入力フォームから文字列を渡してプリントし、どこまで処理が出来ているのを見ていたときのをアップしていました。
今、再度アップしたままの「SimpleJDBC.java」でコンパイル、実行しました。Exception errorは以下の通りです。"There have been"の後の数字は画面を更新する度に増えていきますので少なくともdoGet()の処理はなされているようです。59行目というと、「PreparedStatement pstmt = conn.prepareStatement("INSERT INTO servletStrings (lognum, message) VALUES("+count+",'"+str+"')");」の行です。もう一度学校で動く環境のソースと照らし合わしましたが、全く同じSQLなのですが。。

Simple JDBC

There have been 3 messages logged. java.lang.NullPointerException at SimpleJDBC.doGet(SimpleJDBC.java:59) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:613)
#8

そのエラーは、Webブラウザに表示されたものをコピペしたもののようですね。

SimpleJDBCのinit()で例外が発生しているはずです。
どんな例外が発生しているのか、Tomcatのログを確認してみてください。

外出先から。
コネクションが空でかえって来てるんですね。
たぁぼさん、あとわいとさん、ありがとうございます。
今のところ辿った過程は以下のとおりです。
Tomcatをインストールした/usr/local/apache-tomcat-6.0.18/logsには昨日時点のログしか無く、さんざんエラーを出した本日のログがありませんでした。そこで再度同じ操作をしてエラーを発生させてみたのですが、やっぱりたった今やった操作のログが生成されなかったため、Eclipse上でtomcatを実行するのと本当に/usr/local/apache-tomcat-6.0.18/bin/startup.shから実行するのとでは何かが違う、と思いました。そこで、次にEclipse上に作成したルートディレクトリ「simple-get」(実際のパスは/Users/voewfy/Documents/workspace/simple-getです)をまるごと/usr/local/apache-tomcat-6.0.18/webapps配下に「simple」という別の名前でコピーしました。(名前が同じ場合の影響範囲がわからなかったので)それからEclipse経由でなく、/usr/local/apache-tomcat-6.0.18/bin/startup.sh本体から起動し、ブラウザでhttp://localhost:8080/simple/SimpleJDBCにアクセスし、同じようにブラウザ上にエラーを表示させました。内容は前回ポストしたものと同様です。それからtomcatを停止し、/usr/local/apache-tomcat-6.0.18/logs配下を見てみると、しっかりログが出来ていました。内容は、catalina.outにそれっぽいエラーが発生しています。
"java.lang.ClassNotFoundException: com.mysql.jdbc.Driver"
あとわいとさんご指摘の通りMySQLドライバ関連で「クラスがみつからない」みたいです。。これはなぜでしょうか?なぜ、「MySQLTest.java」ではMySQLに接続出来るのにSimpleJDBC.javaだとこのエラーになるのでしょうか。。?
一応、/usr/local/apache-tomcat-6.0.18/logs配下を全てアップ致しました。見て頂けると助かります。

http://www.dotup.org/uploda/www.dotup.org22348.zip.html
>11: voewfy さん
> あとわいとさんご指摘の通りMySQLドライバ関連で「クラスがみつからない」みたいです。。

まず、疑うべきは MySQL 用のドライバクラスにクラスパスが通っているかどうかです。Tomcat 上の Web アプリなら $ServletHome/WEB-INF/lib に .jar ファイルを置きます。Eclipse 上で開発しているなら、プロジェクトのプロパティからライブラリに追加すれば良いはずです。

以下、余談ですが。

init() の "catch (Exception e)" はやめた方がいいですね。自分が把握してないものまで catch して Exception に気付かなかったりするので。

また、catalina.out には11行目からしっかり、
> java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
> at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
> at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
> at java.lang.Class.forName0(Native Method)
> at java.lang.Class.forName(Class.java:164)
> at SimpleJDBC.init(SimpleJDBC.java:17)
>...
と出ているのですが、このエラーメッセージは Eclipse のコンソールには表示されなかったのでしょうか?
>Tomcatをインストールした/usr/local/apache-tomcat-6.0.18/logs
EclipseのWTPで実行した場合には、専用のディレクトリに%CATALINA_HOME%が割り付けられます。
そっちをみなきゃログなんてありません。

>catalina.outにそれっぽいエラーが発生しています。"java.lang.ClassNotFoundException: com.mysql.jdbc.Driver"

こっちは杵搗き餅@反省中さんのご指摘どおりです。。
でも。Eclipseだったら、コンソールにこれはかれるはずなんですけどね。。。。

まぁ、あとはがんばってCLASSPATHを通してみることです。

では。。

#これ、いいべんきょうですよ。 自称プロのSEでも、クラスパス解決できなくて
#なきついてくるなんてざらですから。。。本当にJavaでやとわれてるのかよ。。と泣きたくなります。
クラスパスを通すときは、相対パスはやめて、絶対パスで通してみてくださいね。。。
相対パスだと、基準点が間違えればその時点でアウト。。。。
相対できりたいなら、先に絶対パス⇒相対パスに変更としていくといいかもしれません。

それと、CLASSPATHが通ってると思っていても、どのクラスローダーに通っているのか
でかなり違ってきます。最悪はここを意識するはめになります。

通常
ブートストラップ クラスローダー⇒拡張クラスローダー⇒システムクラスローダーと通します。
Webシステムの場合、WLSでは(すみません、Tomcatのは調査していません)
EARのクラスローダー⇒ Warのクラスローダーと 通っていきます。

ここからが重要ですが、委譲モデルといって、下位に位置するクラスローダーから上位のクラスローダーにロードされてるクラスの参照は可能ですが、その逆は不可能です。

つまり、あなたが作成したクラスローダーがシステムクラスローダーにあるものが読まれているとして、
その下位にあたるWarのクラスローダーに読まれているクラスの読み込むことは、不可能です。

まぁ、ご参考までに。。
読みにくい箇所があるので訂正

誤:Webシステムの場合、WLSでは(すみません、Tomcatのは調査していません)
正:Webシステムの場合、WLSでは上記に加えて(すみません、Tomcatのは調査していません)
あとわいとさん、杵搗き餅@反省中さん、たぁぼさん、皆様のおかげで解決致しました!
以下、道のりとわかったことを書きます。
(1)MySQLドライバの場所をクラスパスに設定する
a. Eclipse上から起動するときは、実行コンフィグのクラスパスから、MySQLドライバのダウンロード先である/Users/voewfy/Documents/workspace/mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jarを指定したが、これでは駄目。
b. Eclipseでなく直接Tomcat上にアプリを配置してやるときはexport CLASSPATH=$CLASSPATH:.:/Users/voewfy/Documents/workspace/mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jarとしたが、これでは駄目。
(結論)
上記のどちらも不要で、単に$CATALINA_HOME/lib/配下にmysql-connector-java-5.1.7-bin.jarをコピーすると動作しました。現状、クラスパスは設定してません。(echo $CLASSPATHをすると空白が表示されます)
(*ただし、最初にアップしたMySQLTest.javaの方は、ここにコピーしなくとも、a、bどちらのやり方でも実行出来ました。。同じJDBCでも、サーブレット経由か、直接起動かで何かが違うのでしょうね。。もう解決したのでいいです。。)

(2)Eclipse上のExceptionメッセージ
あとわいとさん、杵搗き餅@反省中さんのご指摘通り、Eclipseのコンソールにクラスが見つからないメッセージが大量に出ていました。見逃した理由は、言い訳ですがコンソールに出るメッセージが赤字でなかったからです。黒字のメッセージで、最後に正常起動のような内容が出ていたので、大量のメッセージを上の方までスクロールして見ていませんでした。

(3)Tomcatのmanager(http://localhost:8080/manager)とEclipseの起動の関係
今動かしていてようやくわかったのですが、Eclipse上につくったアプリも、直接自分で%CATALINA_HOME/webapps上に作ったアプリも、managerからは統一して見れるんですね!何か別もののように考えていました。デバッグのため似たようなアプリをEclipseとOS上に大量に作成していたので、大量の「テーブルが既に存在します」エラーが出ていて、それで(2)のメッセージが膨大となっており、それ故「トムキャットの起動メッセージってやけに多いなぁ」程度で気にしていませんでした。。しかし、今全てEclipse上に整理して配置し直し、同じ処理を行うアプリを削除してエラーメッセージを撲滅しました。。こんなに起動メッセージ少ないとは。。

(補足)
MySQLTest.javaで無事にEclipse上からもOS上からもデータベースに接続出来ていたため、またEclipseとTomcat本体の関係を知らなかったために、たったこれだけにもうまるまる二日費やしました。。(涙)がいい勉強になりました。みなさんご協力有り難うございました。

(あと)
学校の課題はこれがメインなのですが、あとこれに追加で余力があればやれというのがあります。。ここまで出来たのでもうぶっちゃけいいのですが、こちらは、また別のトピックを立てて今度は丸投げさせて頂こうと思っています。。とにかく有り難うございました!
お疲れ様です。まずはおめでとうございます。

>Eclipseのコンソールにクラスが見つからないメッセージが大量に出ていました。見逃した理由は、言い訳ですがコンソールに出るメッセージが赤字でなかったからです。

そりゃ、、ご自分でそうしちゃってるのですよね。。標準出力になげれば黒字になります。
Eclipseは標準出力、標準エラー出力をうわがきして出力しているようです。そのときに色変えてるので
標準出力にあれば、そりゃ黒くなります。。

でもね。。。黒かろうが、赤かろうが、プログラムのはいてるメッセージなんて
いらないものはひとつもないんだよ。
今回はそれがわかってよかったですね♪

以上
>16: voewfyさん

お疲れ様でした。勉強し始めの頃なんて、そんなもんでしょう。

課題がまだまだあるみたいですが、頑張ってください。
#14で予想されたとおりですね。

Tomcatも同じで、
Webアプリのクラスパスに通したjarと
WebアプリのWEB-INF/libに入れたjarは、
異なるクラスローダでロードされますね。

なので、WebアプリからClass.forName()とやるなら、
WEB-INF/libにjarを入れなければなりませんね。
>19
補足ありがとうです。

やっぱそれだったんだねぇ〜

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

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

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

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

人気コミュニティランキング