質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

JSPでDBの内容をブラウザに表示させる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,548

score 25

実現したいこと

JSPからDBにアクセスし、その結果をブラウザにリスト表示させる。

現段階で出来ていること

EclipseでJavaを書き、DBで作ったテーブルから
内容を持ってきて表示させることはできました。
イメージ説明

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //-----------------
            // 接続
            //-----------------
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/testdb", // "jdbc:postgresql://[場所(Domain)]:[ポート番号]/[DB名]"
                    "postgres", // ログインロール
                    "takahashi"); // パスワード
            statement = connection.createStatement();

            //-----------------
            // SQLの発行
            //-----------------
            //ユーザー情報のテーブル
            resultSet = statement.executeQuery("SELECT * FROM member");

            //-----------------
            // 値の取得
            //-----------------
            // フィールド一覧を取得
            List<String> fields = new ArrayList<String>();
            ResultSetMetaData rsmd = resultSet.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                fields.add(rsmd.getColumnName(i));
            }

            //結果の出力
            int rowCount = 0;
            while (resultSet.next()) {
                rowCount++;

                System.out.println("---------------------------------------------------");
                System.out.println("--- Rows:" + rowCount);
                System.out.println("---------------------------------------------------");

                //値は、「resultSet.getString(<フィールド名>)」で取得する。
                for (String field : fields) {
                    System.out.println(field + ":" + resultSet.getString(field));
                }
            }


        } finally {
            //接続を切断する
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }

}


続いてこちらのサイトを参考に、まず上記のMain.javaをコンパイルし
次も同様に参考にしたソースコードに少し手を加えて
以下のようなJSPファイルを作り保存しました。

<%@ page import="java.sql.* atmarkit.Main"
    contentType="text/html; charset=euc-jp" %>
<%
// 内容: データベースにアクセスする

// Main のインスタンスを生成する
Main db = new Main();

// データベースへのアクセス
db.open();

// メンバーを取得
ResultSet rs = db.getResultSet("select * from member");

// メンバー一覧表示用のテーブル
String tableHTML = "<table border=1>";
tableHTML += "<tr bgcolor=\"000080\"><td><font color=\"white\">メンバーID</font></td>"
    + "<td><font color=\"white\">名前</font></td>"
    + "<td><font color=\"white\">カナ</font></td>";

// 取得された各結果に対しての処理
while(rs.next()) {

    int id = rs.getInt("member_id"); // メンバーIDを取得
    String name = rs.getString("name"); // メンバー名を取得
    String kana = rs.getString("kana"); // メンバー名(カナ)を取得

    // 文字コードを EUC_JP からUnicode へ変換
    name = new String(name.getBytes("8859_1"), "EUC_JP");
    kana = new String(kana.getBytes("8859_1"), "EUC_JP");

    // テーブル用HTMLを作成
    tableHTML += "<tr><td align=\"right\">" + id + "</td>"
              + "<td>" + name + "</td><td>" + kana + "</td></tr>";
}

tableHTML += "</table>";

// データベースへのコネクションを閉じる
db.close();

%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>データベースへのアクセス</title></head>
<body>
<p>-- データベースへのアクセス --</p>
<p>
<b>メンバーの一覧</b><br>
<%= tableHTML %>
</p>
</body>
</html>


そして保存したファイルにhttp://localhost:8080/examples/10-1.jspといった感じで
アクセスすると下記のようなエラーが表示されました。

The method open() is undefined for the type等で検索をしてみましたが
参考になりそうなサイトは見つかりませんでした。

エラー内容

HTTPステータス 500 – Internal Server Error
タイプ 例外報告

メッセージ JSPのクラスをコンパイルできません:

説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。

例外

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

JSPファイル: [/10-1.jsp] の中の[10]行目でエラーが発生しました
The method open() is undefined for the type Main
7: Main db = new Main();
8:  
9: // データベースへのアクセス
10: db.open();
11:  
12: // メンバーを取得
13: ResultSet rs = db.getResultSet("select * from member");


JSPファイル: [/10-1.jsp] の中の[13]行目でエラーが発生しました
The method getResultSet(String) is undefined for the type Main
10: db.open();
11:  
12: // メンバーを取得
13: ResultSet rs = db.getResultSet("select * from member");
14:  
15: // メンバー一覧表示用のテーブル
16: String tableHTML = "<table border=1>";


JSPファイル: [/10-1.jsp] の中の[40]行目でエラーが発生しました
The method close() is undefined for the type Main
37: tableHTML += "</table>";
38:  
39: // データベースへのコネクションを閉じる
40: db.close();
41:  
42: %>
43: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:213)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:473)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:392)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:362)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:346)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

不足内容等あればご指摘ください。
ご教授のほどよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kitten

    2019/02/18 15:21

    mts10806さんazuapricotさんご回答ありがとうございます。

    説明がうまくできておらずすみません。
    お二方がおっしゃる通り「JavaからDBに接続し取得した内容をjspに渡す」
    ということをやりたいと考えています。

    JavaからDBに接続、取得の部分はできていると思うのですが
    そこから先がどのようにしたら良いのか分かりません。

    キャンセル

  • azuapricot

    2019/02/18 15:36

    「Servlet jsp 値受け渡し」でぐぐってみると良いかもしれませんね

    キャンセル

  • m.ts10806

    2019/02/18 15:48

    ひとまず回答しています。
    euc-jpからは今すぐ脱却しましょう。

    キャンセル

回答 2

+2

JSPもコンパイルされて動くので、結局できることはサーブレットとほぼ同じですが

そもそも、エラーメッセージで言われている通り、Mainクラスにopenメソッドとかcloseメソッドが無いので、呼び出せていないですね。

JSPでやりたいなら、Mainクラスにメソッドを追加すればよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

過去質問が参考になるかもしれませんが、
Webであればサーブレットで作り直しするのが一番簡単で簡潔です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/18 16:28

    もう少し勉強してそれでも分からなければ
    また戻ってこようかと思います。
    ありがとうございました。

    キャンセル

  • 2019/02/18 16:30

    私が回答に記載した過去質問は参考にされましたか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る