JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > JSP(データベース)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/12/18  田中宏和
Last Update 2003/02/10
JSP(データベース)編
◆JSPとは?
JSPとはHTMLの中にJavaのプログラムを埋め込み、サーバー側でそれをサーブレットのクラスファイルにコンパイルしサーブレットとして動作してHTMLファイルを作りブラウザに返すしくみです。JSPを使う最大のメリットは画面デザインの変更が容易であることです。つまり、画面デザインとJavaでの業務ロジックを分離することにより、開発効率が大幅に向上します。
◆ここで作成するプログラム
JSPからデータベースに接続してその結果を画面に表示したいと思います。
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.0
Tomcat 4.1.12
データベース MySQL (バージョン3.23.49)
◆Java実行環境の構築
アプリケーション編を参考にしてJava実行環境を構築してください。
◆Tomcatを使用可能にする
サーブレット編を参考にしてTomcatを使用可能にしてください。
◆データベースの用意
JDBC(MySQL)編を参考にして、データベースのインストール、データベースの起動、データベースの作成、テーブルの作成、データの追加を行ってください。
◆TomcatでMySQLのJDBCドライバを使用可能にする
mysql-connector-java-○.○-bin.jarファイルを[Tomcatのフォルダ]\shared\lib または、[WEBアプリケーションのフォルダ]\WEB-INF\libの下にコピーしてください。コピーしたらTomcatを再起動してください。
◆データベースに接続するJSPの作成
■JSPファイル
jspdb1.jsp(ここからダウンロード)
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*" %>
<%
Connection con = null;
Statement stmt = null;
try {
  // ドライバクラスをロード
  Class.forName("org.gjt.mm.mysql.Driver");
  // データベースへ接続
  String url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS";
  con = DriverManager.getConnection(url);
  // ステートメントオブジェクトを生成
  stmt = con.createStatement();
  // 全ての行を検索するSQL文を作成
  String sql = "SELECT * FROM HELLO_WORLD_TABLE";
  // クエリーを実行して結果セットを取得
  ResultSet rs = stmt.executeQuery(sql);
%>
<html>
<head>
<title>JSPでDB接続</title>
</head>
<body>
<table border="1">
<tr>
<th>NO</th>
<th>言語</th>
<th>メッセージ</th>
</tr>
<%
  // 検索された行数分ループ
  while(rs.next()){
%>
<tr>
<td><%=rs.getInt("NO") %></td>
<td><%=rs.getString("LANGUAGE") %></td>
<td><%=rs.getString("MESSAGE") %></td>
</tr>
<%
  } // end while
%>
</table>
</body>
</html>
<%
} catch (Exception e) {
  out.println("<font color=red><h3>エラー!</h3></font>" + e);
  e.printStackTrace();
} finally {
  // データベースへの接続をクローズします
  try {
    if (stmt!=null) {
      stmt.close();
    }
    if (con!=null) {
      con.close();
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
}
%> 
 
■表示
作成したJSPファイルを[Tomcatのフォルダ]\webapps\examples\jsp の下に置いてください。ブラウザで見てみます。
http://localhost:8080/examples/jsp/jspdb1.jsp
おおおお!表示されましたね!
 
◆データベースへの接続の処理を行うクラスを作成
JSPからデータベースに接続を行うと、接続するためのコードを直接書かなくてはならなくなり、複数のページでデータベースに接続する場合では効率がよくありません。また、データベースのドライバクラスやURLが変わった場合もすべてのJSPファイルを修正しなければならなくなります。そこでデータベースに接続するための簡単なクラスを作成して利用することにします。
■データベースにアクセスするクラス
DatabaseAccess.java(ここからダウンロード)
package javahello;
import java.sql.*;

public class DatabaseAccess {
  private String driver;
  private String url;
  private String user;
  private String passwd;
  private Connection con;
  private Statement stmt;
  private ResultSet rs;

  /**
   * コンストラクタ
   */
  public DatabaseAccess() {
    driver = "org.gjt.mm.mysql.Driver";
    url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS";
    user = "";
    passwd = "";
  }
  /**
   * データベースに接続
   */
  public synchronized void open() throws Exception {
    // ドライバクラスをロード
    Class.forName(driver);
    // データベースへ接続
    con = DriverManager.getConnection(url,user,passwd);
    // ステートメントオブジェクトを生成
    stmt = con.createStatement();
  }
  /**
   * データベースから切断
   */
  public synchronized void close() throws Exception {
    if (stmt!=null) {
      stmt.close();
    }
    if (con!=null) {
      con.close();
    }
  }

  /**
   * クエリーを実行(検索)
   */
  public ResultSet executeQuery(String sql) throws Exception {
    return stmt.executeQuery(sql);
  }
  /**
   * クエリーを実行(新規、更新、削除)
   */
  public int executeUpdate(String sql) throws Exception {
    return stmt.executeUpdate(sql);
  }
}
 
■コンパイル
コマンドプロンプト
C:\JavaHello\JSPDB>javac DatabaseAccess.java

C:\JavaHello\JSPDB>

コンパイルしてできたDatabaseAccess.classファイルを[Tomcatのフォルダ]\webapps\examples\WEB-INF\classes\javahelloの下にコピーしてください。javahelloフォルダは新たに作成します。コピーしましたらTomcatを再起動します。
■JSPファイルの作成
次にJSPファイルを作成します。
jspdb2.jsp(ここからダウンロード)
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*" %>
<jsp:useBean id="db" class="javahello.DatabaseAccess" />
<%
try {
  // データベースに接続
  db.open();
  // 全ての行を検索するSQL文を作成
  String sql = "SELECT * FROM HELLO_WORLD_TABLE";
  // クエリーを実行して結果セットを取得
  ResultSet rs = db.executeQuery(sql);
%>
<html>
<head>
<title>JSPでDB接続</title>
</head>
<body>
<table border="1">
<tr>
<th>NO</th>
<th>言語</th>
<th>メッセージ</th>
</tr>
<%
  // 検索された行数分ループ
  while(rs.next()){
%>
<tr>
<td><%=rs.getInt("NO") %></td>
<td><%=rs.getString("LANGUAGE") %></td>
<td><%=rs.getString("MESSAGE") %></td>
</tr>
<%
  } // end while
%>
</table>
</body>
</html>
<%
} catch (Exception e) {
  out.println("<font color=red><h3>エラー!</h3></font>" + e);
  e.printStackTrace();
} finally {
  // データベースへの接続をクローズします
  try {
    db.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}
%> 
 
これで少しすっきりしましたね。
■表示
作成したJSPファイルを[Tomcatのフォルダ]\webapps\examples\jsp の下に置いてください。ブラウザで見てみます。
http://localhost:8080/examples/jsp/jspdb2.jsp
おおおおお!表示されましたね!
 
◆データベースへの接続をプールするクラスの作成
上で作成したクラスでも問題なく動くのですが、表示される度に毎回データベースに接続しているので表示に多少時間がかかります。特にアクセスが増えると接続の生成、破棄が繰り返し行われるので効率がよくありません。その問題を改善するために、データベースへの接続を複数保存(プール)しておいてそれを貸し出してくれるクラスを作成します。こうすることによって、データベースに毎回接続しなくて済むので表示速度が向上します。
■接続をプールするクラス
DBConnectionPool.java(ここからダウンロード)
package javahello;
import java.sql.*;
import java.util.*;

public class DBConnectionPool {
  private String driver; // ドライバクラス
  private String url; // URL
  private String user; // ユーザー名
  private String password; // パスワード

  private int maxConnection; // 最大接続数
  private int checkedOut; // 貸し出している接続数
  private Vector connectionPool = new Vector();
  private static DBConnectionPool instance;

  /**
   * インスタンスを取得
   */
  public static synchronized DBConnectionPool getInstance() {
    if (instance == null) {
      instance = new DBConnectionPool();
    }
    return instance;
  }
  /**
   * コンストラクタ
   */
  private DBConnectionPool() {
    this.driver = "org.gjt.mm.mysql.Driver";
    this.url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS";
    this.user = "";
    this.password = "";
    this.maxConnection = 10;
  }
  /**
   * コネクションを取得
   */
  public synchronized Connection getConnection() throws Exception {
    Connection con = null;
    if (connectionPool.size() > 0) {
      con = (Connection) connectionPool.firstElement();
      connectionPool.removeElementAt(0);
      try {
        if (con.isClosed()) {
          con = getConnection();
        }
      } catch (SQLException e) {
        con = getConnection();
      }
    } else if (maxConnection == 0 || checkedOut < maxConnection) {
      con = newConnection();
    }
    if (con != null) {
      checkedOut++;
    }
    return con;
  }
  /**
   * 新規にコネクションを作成
   */
  private Connection newConnection() throws Exception {
    Class.forName(driver);
    return DriverManager.getConnection(url, user, password);
  }
  /**
   * コネクションを返却
   */
  public synchronized void freeConnection(Connection con) {
    connectionPool.addElement(con);
    checkedOut--;
    notifyAll();
  }
  /**
   * すべてのコネクションを開放
   */
  public synchronized void release() {
    Enumeration enumConnections = connectionPool.elements();
    while (enumConnections.hasMoreElements()) {
      Connection con = (Connection)enumConnections.nextElement();
      try {
          con.close();
      } catch (SQLException e) {
      }
    }
    connectionPool.removeAllElements();
  }
}
 
■コンパイル
コマンドプロンプト
C:\JavaHello\JSPDB>javac DBConnectionPool.java

C:\JavaHello\JSPDB>

コンパイルしてできたDBConnectionPool.classファイルを[Tomcatのフォルダ]\webapps\examples\WEB-INF\classes\javahelloの下にコピーしてください。javahelloフォルダは新たに作成します。コピーしましたらTomcatを再起動します。
■JSPファイルの作成
次にJSPファイルを作成します。
jspdb3.jsp(ここからダウンロード)
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="java.sql.*,javahello.DBConnectionPool" %>
<%!
DBConnectionPool pool;
%>
<%
Connection con = null;
Statement stmt = null;
try {
  // コネクションプールクラスのインスタンスを取得
  pool = DBConnectionPool.getInstance();
  // データベースへの接続を取得
  con = pool.getConnection();
  // ステートメントオブジェクトを生成
  stmt = con.createStatement();
  // 全ての行を検索するSQL文を作成
  String sql = "SELECT * FROM HELLO_WORLD_TABLE";
  // クエリーを実行して結果セットを取得
  ResultSet rs = stmt.executeQuery(sql);
%>
<html>
<head>
<title>JSPでDB接続</title>
</head>
<body>
<table border="1">
<tr>
<th>NO</th>
<th>言語</th>
<th>メッセージ</th>
</tr>
<%
  // 検索された行数分ループ
  while(rs.next()){
%>
<tr>
<td><%=rs.getInt("NO") %></td>
<td><%=rs.getString("LANGUAGE") %></td>
<td><%=rs.getString("MESSAGE") %></td>
</tr>
<%
  } // end while
%>
</table>
</body>
</html>
<%
} catch (Exception e) {
  out.println("<font color=red><h3>エラー!</h3></font>" + e);
  e.printStackTrace();
} finally {
  // データベースへの接続をクローズします
  try {
    if (stmt!=null) {
      stmt.close();
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
  if (con!=null) {
    // データベースへの接続を返却します
    pool.freeConnection(con);
  }
}
%> 
 
■表示
作成したJSPファイルを[Tomcatのフォルダ]\webapps\examples\jsp の下に置いてください。ブラウザで見てみます。
http://localhost:8080/examples/jsp/jspdb3.jsp
おおおおお!表示されましたね!
 
◆データソースを使用してコネクションプーリング
JNDIサービスを利用してデーターソース(DataSource)を使用できる環境ではコネクションをプールするクラスを作らなくてもコネクションプーリングを行うことができます。Tomcat4以上ではJNDIサービスを利用できるのでデータソースが使用できます。データソースを使用してデータベースに接続する方法はJDBC(データソース)編を参照してください。
■関連
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JDBC(MySQL)編
JDBC(データソース)編
■ツール
ツールの部屋

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME