• ベストアンサー

【JSPがブラウザで表示されません】

こんばんわ。 教えて頂きたいのですが、以下のjspを記述しましたが番号・名前・電話番号の項目表示のみで肝心のテーブル内容が表示されません。 何が原因かわからず困っています。 教えて下さい!お願い致します。 <%@page contentType="text/html; charset=Shift_JIS" pageEncoding="Shift_JIS"%> <%@page import="java.sql.*"%> <%! // サーブレットのinitメソッドに相当 public void jspInit() { try { // JDBCドライバをロード Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (Exception e) { e.printStackTrace(); } } %> <html> <head><title>テーブル_JSP版</title></head> <body> <P>データベース一覧</P> <table border='1'><tr><th>番号</th><th>名前</th><th>電話番号</th></tr> <% // データベースへのアクセス開始 Connection con = null; Statement stmt = null; ResultSet rs = null; try { // データベースに接続するConnectionオブジェクトの取得 con = DriverManager.getConnection("jdbc:sqlserver://localhost;DatabaseName=Name","ID","PW"); // データベース操作を行うためのStatementオブジェクトの取得 stmt = con.createStatement(); // SQL()を実行して、結果を得る rs = stmt.executeQuery( "SELECT 番号, 名前, 電話番号 FROM Table"); // 得られた結果をレコードごとに表示 while (rs.next()) { %> <tr> <%-- レコードのCUSTOMER_NUMフィールドを表示 --%> <td><%= rs.getString("番号")%></td> <%-- レコードのNAMEフィールドを表示 --%> <td><%= rs.getString("名前")%></td> <%-- レコードのPHONEフィールドを表示 --%> <td><%= rs.getString("電話番号")%></td> </tr> <% } } catch (Exception e) { e.printStackTrace(); } finally { // データベースとの接続をクローズ try { rs.close(); } catch (Exception e) {} try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} } %> </table> </body> </html>

質問者が選んだベストアンサー

  • ベストアンサー
noname#33813
noname#33813
回答No.9

>ホスト に TCP/IP 接続できませんでした。 >java.net.ConnectException: Connection refused: connect のエラーということはSQLServerへの接続が上手くいっていないようです。 プログラムの動き的には >con = DriverManager.getConnection("jdbc:sqlserver://localhost;DatabaseName=Name","ID","PW"); 上記の行で例外が発生し50行目のcatchで例外が拾われていると思われます。 まずは、この接続設定が本当に正しいか確認してください。 接続設定が正しいとするとSQLServer側の問題かもしれません。 このメッセージで検索したところ、参考URLのページが該当しましのたでご一読ください。 ここからはプログラム側の話でなく、SQLServer側の話になりますので もし解決に至らないようであればSQLServerのカテゴリで質問した方が良いと思います。 ※ARIA9はSQLServerは素人です・・・・

参考URL:
http://www.javaroad.jp/bbs/answer.jsp?q_id=20061017121052450
earlgyreprince
質問者

お礼

ARIA9さま ありがとうございます☆ SQLServerの1433ポートは空いていたので localhostの部分をSQLServerのIPアドレス+1433で繋がりました! 本当にありがとうございます♪ 感謝致します! 最後に1点だけよろしいでしょうか? SQL構文に日本語が入ると文字化けでエラーになるのですが これは"jdbc:sqlserver://localhost;DatabaseName=Name","ID","PW"); の部分に何か記述が必要なのでしょうか? この部分だけお願いします!

その他の回答 (11)

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.12

定かであありませんが pageEncoding="Shift_JIS"を pageEncoding="Windows-31J" または上記を省略した上で contentType="text/html; charset=Shift_JIS"を contentType="text/html; charset=Windows31-J" に変更すれば可能性はあると 思います。

参考URL:
http://www.atmarkit.co.jp/fjava/rensai3/mojibake02/mojibake02.html
earlgyreprince
質問者

お礼

fortranxpさま pageEncoding="Windows-31J"でしっかり表示されました! 長くご丁寧にご教授頂きまして本当にありがとうございます☆ 感謝いたします♪

earlgyreprince
質問者

補足

fortranxpさま ありがとうございます! 月曜日になりますがさっそくチャレンジしてみます☆

noname#33813
noname#33813
回答No.11

No.1です >SQL構文に日本語が入ると文字化けでエラーになるのですが >これは"jdbc:sqlserver://localhost;DatabaseName=Name","ID","PW"); >の部分に何か記述が必要なのでしょうか? これについてもエラー内容がわかれば記述して頂けませんでしょうか。 ただ、エラーが起きるといわれてもわかりません。 文字化けということですが、具体的になにが文字化けするのでしょう。 例えば、記述されている下記SQLが SELECT 番号, 名前, 電話番号 FROM Table 下記のように(?かどうかはわかりませんが)化けるためSQLエラーになるということでしょうか? SELECT ????, ????, ???????? FROM Table もし、こういうことでしたらjspのjavaEncodingとプログラムの文字コードが一致していないためだと思います。 ちょっと文字化けするとだけ書かれても判りかねますので もう少し情報を頂けませんか?

earlgyreprince
質問者

お礼

ARIA9さま この度はご丁寧にご教授頂きました事、とても感謝致します! 勉強不足ですのでこれからまだまだ頑張りたいと思います☆ ありがとうございました♪

earlgyreprince
質問者

補足

ARIA9さま 度々申し訳ありません。 文字化けのエラーは解消されました。 SQL接続が成功した後に変えたプログラムの記述に誤りがありました・・・ エラーは出ないのですが<table border='1'>から始まる項目に「電話番号(1)」があるとしますとそれが「電話番号@」とかになります。 これはしょうがないのでしょうか? 度々で申し訳ありませんがご教授下さいませ。

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.10
参考URL:
http://msdn2.microsoft.com/ja-jp/library/ms378845.aspx
earlgyreprince
質問者

お礼

fortranxpさま ありがとうございます☆ URL参考になりました! SQLServerのIPアドレスをlocalhostに記述した所、表示されました。 助かりました! ほんとうにありがとうございました♪

noname#33813
noname#33813
回答No.8

No.1です >エラーはTomcatのLogにて確認致しました。 ExceptionのprintStackTraceメソッドは標準出力となりますので 通常、Tomcatで定義しているログには残りません。 なお、その画面は残念ながらコンパイルエラーになっています。 >out.write(e.get.Message()); getの後ろのピリオドは不要です。 >C:\Program Files\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\wl_jsp\org\apache\jsp\test_005fJdbcCustomerTable_jsp.java:19: シンボルを解決できません。 >シンボル: 変数 out >場所 : org.apache.jsp.test_005fJdbcCustomerTable_jsp の クラス >out.write(e.get.Message()); 追加する場所を間違えています。 51行目のe.printStackTrace()の下に追加してください。 それがわかるように } finally { ←を明示しておいたのですが・・・ ちょっとわかりにくかったかもしれませんね。 最初から行番号を提示すれば良かったです。すいません。

earlgyreprince
質問者

補足

ARIA9さま 教えて頂いている立場なのに・・・ こちらこそ分からず申し訳ありませんでした。 おっしゃる通り記述した所、このメッセージがブラウザに表示されました。 ホスト に TCP/IP 接続できませんでした。 java.net.ConnectException: Connection refused: connect 宜しくお願い致します。

noname#33813
noname#33813
回答No.7

No.1です <table border='1'><tr><th>番号</th><th>名前</th><th>電話番号</th></tr> → ここがループ内の処理になりますので、少なくともwhileループ内には到達していません。 </table> やはりtry{}catch(){}の途中で例外があがっているように思います。 例外が出ていないというのは何をもって確認しました? Exceptionのスタックトレースがコンソールにでていないことは確認しましたか? ためしに catch (Exception e) { e.printStackTrace(); } finally { のe.printStackTrace();の下に out.write(e.getMessage()); を追加してみてください。 これで例外が発生していればブラウザ上にエラーメッセージが表示されますので そちらの内容を回答に補足してください。

earlgyreprince
質問者

お礼

何度もすみません。 Tomcatのstdout.logというテキストに以下のメッセージがありました。 関係ありますでしょうか? com.microsoft.sqlserver.jdbc.SQLServerException: ホスト に TCP/IP 接続できませんでした。 宜しくお願い致します。

earlgyreprince
質問者

補足

ARIA9さま ありがとうございます。 エラーはTomcatのLogにて確認致しました。 おっしゃる通り記述した所、以下のエラーがでました。 2007-04-13 12:56:15 StandardWrapperValve[jsp]: サーブレット jsp のServlet.service()が例外を投げました org.apache.jasper.JasperException: JSPのクラスをコンパイルできません JSPファイル: /test_JdbcCustomerTable.jsp の中の3行目でエラーが発生しました 生成されたサーブレットのエラーです: C:\Program Files\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\wl_jsp\org\apache\jsp\test_005fJdbcCustomerTable_jsp.java:19: シンボルを解決できません。 シンボル: 変数 get 場所 : java.lang.Exception の クラス out.write(e.get.Message()); ^ JSPファイル: /test_JdbcCustomerTable.jsp の中の3行目でエラーが発生しました 生成されたサーブレットのエラーです: C:\Program Files\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\wl_jsp\org\apache\jsp\test_005fJdbcCustomerTable_jsp.java:19: シンボルを解決できません。 シンボル: 変数 out 場所 : org.apache.jsp.test_005fJdbcCustomerTable_jsp の クラス out.write(e.get.Message()); ^ エラー 2 個 お手数をお掛けしまして申し訳ありませんがお願いいたします。

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.6

jspInit(){} をはずしたらどうなりますか? そもそもこれはJSP変換後サーブレットに なったときに現れるメソッドみたいで JSPを初期化してしまうみたいです。

earlgyreprince
質問者

お礼

fortranxpさま jspInit(){}を外してみましたが同じ結果でした。。。

earlgyreprince
質問者

補足

fortranxpさま ありがとうございます☆ なるほど!そうなのですか? 明日、試してみます♪ ありがとうございます!!

noname#33813
noname#33813
回答No.5

No.1です >ちなみにaccessでODBCリンクしたmdbを見にいく場合は >パスを指定する必要があるのでしょうか? とのことですが、プログラムを見る限りJDBCは直接SQLServerに繋ぎにいっていますよね。 ということは少なくともプログラム側でmdbにアクセスする必要はまったくないと思うのですが。 プログラム側からmdbを経由する必要があるとすると SQLServer←ODBCリンク←mdb←ODBC設定しておいてODBC-JDBCブリッジドライバ←プログラムからコールになったと思いますが・・・

earlgyreprince
質問者

お礼

ARIA9さま お世話になっております。 ブラウザ表示中にソースを見たらこんな感じでした。 これってテーブル内容表示まで行ってないのでしょうか? 宜しくお願い致します。 <html> <head><title>テーブル_JSP版</title></head> <body> <P>データベース一覧</P> <table border='1'><tr><th>番号</th><th>名前</th><th>電話番号</th></tr> </table> </body> </html>

earlgyreprince
質問者

補足

ARIA9さま ご回答ありがとうございます☆ なるほど! 明日、もう1度チャレンジしてみます。 ありがとうございます♪

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.4

SQLserver2000 JDBCドライバーを WEB-INF\libに配置してますか? http://www.microsoft.com/japan/msdn/sqlserver/downloads/jdbc/default.aspx

参考URL:
http://www.microsoft.com/japan/msdn/sqlserver/downloads/jdbc/default.aspx
earlgyreprince
質問者

補足

fortranxpさま ありがとうございます☆ SQLserver2005なのでマイクロソフトのHPより ダウンロードして配備されております。 よろしくお願い致します。

noname#33813
noname#33813
回答No.3

No.1です >もう1点ご教授頂きたいのですが、これはODBCを通じて直接SQLServerへ見に行っているのでしょうか? すいません。SQLServerは詳しくないので詳細はわかりかねます。 要は、そもそもDBのテーブルにレコードが無ければ 無いものは取れないわけで、Java側の問題かどうか切り分けるために、 JavaからではなくDBの中身を確認した方が良いんではないかということです。 なのでaccessでODBC接続を使用してSQLServerに接続するのでも構いませんし、 質問者様が普段使われているツールがあるのでしたらそれでも構いません。

earlgyreprince
質問者

補足

ARIA9さま ありがとうございます☆ 確かめた所、確かにテーブルにレコードはあるのですが・・・ 一度、問題を切り分けて調べてみたいと思います。 ちなみにaccessでODBCリンクしたmdbを見にいく場合は パスを指定する必要があるのでしょうか? 記述の場所が分からないので申し訳ありません。 何度もすみません。

noname#33813
noname#33813
回答No.2

No.1です SELECT * FROM テーブル名 だとしてもWHERE句が無い以上、当該テーブルの全レコードを取得するはずです。 なので、そもそもテーブル上にレコードがあるのか疑問です。 もし、レコードが1件以上取得できていることの確認をプログラム上で取りたいのであれば、 while (rs.next()) のループ内にたどり着いていることを確認することです。 例えばwhileの下の行に「System.out.println("ループの中に入ったよ!");」とかで。 まぁ、今のままでもループ内の<tr>タグなどが出力されているかで確認は取れますが。 ループ内に一度もたどり着いていないのであればレコード取得件数は0件です。 ループ内にたどり着いている場合、rs.getString(列名)で取得している 列の値がNULL(ブランク文字)だと思われます。 どちらにせよ、一度SQLServerの当該テーブルを クエリアナライザなどで確認した方が良いでしょう。

earlgyreprince
質問者

補足

ARIA9さま ありがとうございます☆ クエリアナライザですか・・・ 初めて聞いた名前なので一度調べてやってみます。 もう1点ご教授頂きたいのですが、これはODBCを通じて直接SQLServerへ見に行っているのでしょうか? mdbのアプリケーションパスを指定する必要はないのでしょうか? xml等 度々申し訳ありませんがお願い致します。

関連するQ&A