トップページ -> 実践知識 -> Tomcat を用いた Java サーブレット・プログラミング -> Eclipse を使用しての Java サーブレット+データベース・プログラム開発
[サイトマップへ]  

Eclipse を使用しての Java サーブレット+データベース・プログラム開発

サイト構成 連絡先,業績 実践知識 コンピュータ 教材 サポートページ

この Web ページでは, Eclipse を使い, Java サーブレットプログラムを作る手順を,見本となるプログラムと図解で説明する. ここでの Java サーブレットプログラムは,JDBC を使って,リレーショナルデータベースを操作します.

【補足説明】

下記の 2つのサーバは別物です. 2つを同時に動かすことはできません(ポートを奪い合うことができないので).一方を動かすときは,もう一方を止めることになる.

  1. Eclipse 内部の tomcat サーバ:

    Eclipse では,Eclipse 内部の tomcat サーバが動き, Java サーブレットの動作テストなどに使う.

  2. 公開 tomcat サーバ:

    Eclipse とは無関係の tomcat サーバ(C:\tomcat55\bin\tomcat5w.exe 等で起動する Tomcat サーバのこと).当然, 公開 tomcat サーバが管理するディレクトリも Eclipse とは独立している.

なお,「Eclipse 内部の tomcat サーバ」を使えるようには, Eclipse で「新規サーバの定義」を行う必要があります.これは,1回行うだけで十分です.


必要となるソフトウエア

あらかじめ決めておく事項と設定内容

前もって,Tomcat インストールディレクトリを調べておいてください.

 

前もって, Spring 2 インストールディレクトリを調べておいてください.この Web ページでは,次のように書きます.

データベースシステムに関する項目

データベースシステムに関するいくつかの設定内容があります. この Web ページでは,設定内容を下記のように書きますので, 違う設定にする場合には, この Web ページの説明を読み替えてください.


テスト用データベースの作成

テスト用データベースとして,下記の SQL コマンドで,テーブル commodity が作られ,データが入っていること.

      CREATE TABLE commodity (
          type INTEGER primary key not null,
          name VARCHAR(32) not null,
          price INTEGER );
      INSERT INTO commodity VALUES( 1, 'apple', 50 );
      INSERT INTO commodity VALUES( 2, 'orange', 20 );
      INSERT INTO commodity VALUES( 3, 'strawberry', 100 );
      INSERT INTO commodity VALUES( 4, 'watermelon', 150 );
      INSERT INTO commodity VALUES( 5, 'melon', 200 );
      INSERT INTO commodity VALUES( 6, 'banana', 100 );
      SELECT * FROM commodity;

※ SQL の実行は,Eclipse のデータツール・プラットホーム を使って,簡単にできます. データツール・プラットホームの使用法については, MySQLPostgreSQLJava DB (Derby) の場合に分けて,別の Web ページで説明している.


Eclipse での操作手順

以下,Eclipse を使います. プロジェクトの作成クラスの定義実行という一連の操作を,図解で説明する.

Eclipse の使用にあたって,事前に決めておく事項

Java サーブレット・プログラムを動かすために,Eclipse のプロジェクト等を作ります. この Web ページでは,Eclipse のプロジェクト名,Java パッケージ名,Java サーブレットのクラス名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).

----------------------ここから---------------------
package hoge.hoge.com;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.sql.*;
import java.text.DecimalFormat;
import java.util.Properties;

/**
 * Servlet implementation class for Servlet: HelloWorld
 *
 */
 public class HelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
		// 決まり文句
		private static String PostgresJDBCDriver = "org.postgresql.Driver";
		private static String MySQLJDBCDriver = "org.gjt.mm.mysql.Driver";
		private static String JavaDBJDBCDriver = "org.apache.derby.jdbc.EmbeddedDriver";
		private static String HiRDBDriver = "JP.co.Hitachi.soft.HiRDB.JDBC.PrdbDriver";
		// 下記の変数を正しく設定する
		// DBNAME, USER, PASS, JDBCDriver, DBURL
		
		// PostgreSQL 用デフォルト
		// Eclipse で PostgreSQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
		//     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
		//     その後インポートすべきファイルとして,次のファイルを指定
		//       C:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar
		final private static String DBNAME = "testdb"; // Database Name
		final private static String USER = "testuser"; // user name for DB.
		final private static String PASS = "hoge$#34hoge5"; // password for DB.
		final private static String JDBCDriver = PostgresJDBCDriver;
		final private static String DBURL = "jdbc:postgresql://localhost/" + DBNAME;

		// MySQL 用デフォルト
		// Eclipse で MySQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
		// http://dev.mysql.com/downloads/connector/ から,Connector/J をダウンロード
		// c:\Program Files\Java\mysql-connector-java-5.1.6\ に置く.
		//     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
		//     その後インポートすべきファイルとして,次のファイルを指定
		//       c:\Program Files\Java\mysql-connector-java-5.1.6\mysql-connector-java-5.1.6-bin.jar を追加
		// final private static String DBNAME = "testdb"; // Database Name
		// final private static String USER = "testuser"; // user name for DB.
		// final private static String PASS = "hoge$#34hoge5"; // password for DB.
		// final private static String JDBCDriver = MySQLJDBCDriver;
		// final private static String DBURL = "jdbc:mysql://localhost/" + DBNAME;   

		// JavaDB用デフォルト
		// final private static String DBNAME = "dbdir;create=true"; // Java DB の場合は,Java DB データベースディレクトリ(相対)
		// final private static String DBDIR = "C:\\Program Files\\eclipse3.5\\eclipse\\"; // データベースが存在するディレクトリ
                // DTP, DBViewer などを使ってデータベースを生成した場合は Eclipse インストールディレクトリ
                // ij などを使ってデータベースを生成した場合は,c:\\<ワークスペース>\\<プロジェクト名>
		// final private static String USER = ""; // user name for DB. Java DB (Derby) の場合は空
		// final private static String PASS = ""; // password for DB. Java DB (Derby) の場合は空
		// final private static String JDBCDriver = JavaDBJDBCDriver;
		// final private static String DBURL = "jdbc:derby:" + DBDIR + DBNAME;

		// HiRDB用デフォルト
		// Eclipse で HiRDB を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
		//     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
		//     その後インポートすべきファイルとして,次のファイルを指定
		//       C:\win32app\hitachi\hirdb_s\CLIENT\UTL\pdjdbc.jar
		// ユーザ名,パスワード: C:/windows/HiRDB.iniのPDUSERの値を調べておく
		// final private static String USER = "ユーザ名"; // user name for HiRDB. see C:/windows/HiRDB.ini
		// final private static String PASS = "パスワード"; // password for HiRDB. see C:/windows/HiRDB.ini
		// final private static String JDBCDriver = HiRDBDriver;
		// final private static String HiRDBServerName = "hitachi-664320D"; // HiRDB サーバのコンピュータ名
		// final private static String DBURL = "jdbc:hitachi:PrdbDrive://DBID=22200,DBHOST=" + HiRDBServerName + ",ENCODELANG=MS932"; // 'DBID=22200' is in "conf\pdsys";

		// この先は決まり文句
		private static Statement stmt = null;
		
		/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public HelloWorld() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		// Connection
		try {
			connect( USER, PASS );
			// 実行するSQL文と,出力フォーマットを記述する

			ResultSet rs = execute( "select * from commodity" );;
			DecimalFormat dformat = new DecimalFormat ("#,###円");
			
			/* HTTP レスポンス */
		    response.setContentType("text/html;charset=iso-2022-jp");
		    PrintWriter out = response.getWriter();
		    out.println("<HTML>");
		    out.println("<p>");
		    out.println("Database");
		    out.println("</HTML>");
		   
			while(rs.next()){		 
				int t = rs.getInt("type");
		        	String n = rs.getString("name");
		        	int p = rs.getInt("price");
		        	out.println("<p>" + t + " " + n + " " + dformat.format( p ) );
			}

			rs.close();
			stmt.close();
			disconnect();
		}
		catch (Exception e) {
			// Error Message and Error Code
			System.out.print(e.toString());
			if (e instanceof SQLException) {
				System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
			}
			// Print Stack Trace
			e.printStackTrace();
			if (conn != null) {
				try {
					conn.rollback();
					conn.close();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		}	
	}
	
	/*
	 *  Service Functions
	 *  ここから先は,決まり文句を関数化したもの.
	 */
	static Connection conn = null;
	// database open
	public static void connect( String user, String pass ) 
	throws SQLException, ClassNotFoundException {
		try {
			// JDBC Driver Loading
			Class.forName(JDBCDriver).newInstance();
			System.setProperty("jdbc.driver",JDBCDriver);
		}
		catch (Exception e) {
			// Error Message and Error Code
			System.out.print(e.toString());
			if (e instanceof SQLException) {
				System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
			}
			// Print Stack Trace
			e.printStackTrace();
		}
		try {
			// Connection
			if ( user.isEmpty() && pass.isEmpty() ) {
				conn = DriverManager.getConnection(DBURL);			
			}
			else {
				Properties prop = new Properties();
				prop.put("user", user);
				prop.put("password", pass);
				conn = DriverManager.getConnection(DBURL,prop);	
			}
		}
		catch (Exception e) {
			// Error Message and Error Code
			System.out.print(e.toString());
			if (e instanceof SQLException) {
				System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
			}
			// Print Stack Trace
			e.printStackTrace();
			if (conn != null) {
				conn.rollback();
				conn.close();
			}
		}
	}
	// database close
	public static void disconnect()
	    throws SQLException {
		try {
			conn.close();
		}
		catch (Exception e) {
			// Error Message and Error Code
			System.out.print(e.toString());
			if (e instanceof SQLException) {
				System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
			}
			// Print Stack Trace
			e.printStackTrace();
			if (conn != null) {
				conn.rollback();
				conn.close();
			}
		}
	}
	public static ResultSet execute( String sql )
	    throws SQLException {
		try {	
			conn.setReadOnly(true);
			// Execute 'commit' Automatically after each SQL
			// conn.setAutoCommit(true);		 
			// Query Exection 		 
			stmt = conn.createStatement();
			return stmt.executeQuery(sql);
		}
		catch (Exception e) {
			// Error Message and Error Code
			System.out.print(e.toString());
			if (e instanceof SQLException) {
				System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
			}
			// Print Stack Trace
			e.printStackTrace();
			if (conn != null) {
				conn.rollback();
				conn.close();
			}
			return null;
		}
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}   	  	   
}
----------------------ここまで----------------------

  • ソースを保存

    「ファイル」→「保管」または CTRL+S で保存される. 保存時にコンパイルされる

    コンパイル時のエラーや警告があれば, Eclipse 内の問題・ビューに表示されるので確認する.

  • 下記の「Java サーブレット・プログラムのテスト実行」に進んでください.

    Java サーブレット・プログラムのテスト実行

    Eclipse のプロジェクト・エクスプローラを使用して,上記で作ったJava サーブレットのプログラム をテスト実行してみます.

    1. 実行したいサーブレットのクラスを選び,右クリック

      Eclipse のプロジェクト・エクスプローラで,実行したいクラス名.java (つまり HelloWorld.java)右クリック

    2. 実行 (Run As)」→「サーバーで実行 (Run on Server)」と操作

    3. サーバの選択

      ウインドウが開くので, 「ローカルホストの Tomcat v5.5 サーバ」が選択されていることを確認の後,「次へ (Next)」をクリック.

    4. 次はデフォルトのままでよい

      終了」をクリック.

      下記のエラーが出て,Eclipse 内部の Tomcat サーバが起動しない場合には,C:\tomcat55\bin\tomcat5w.exe を使い,公開 Tomcat サーバを停止する

      ※ すでに,C:\tomcat55\bin\tomcat5w.exe などを使って,「公開 Tomcat サーバを稼働させている」ときは, Eclipse 内部の Tomcat サーバが起動しない(ポートを奪い合うので)ので, C:\tomcat55\bin\tomcat5w.exe を使って, 公開 Tomcat サーバを停止させて下さい.

    5. Eclipse 内部の Tomcat サーバが起動することを確認

      コンソール・ビューに表示される.

    6. 実行結果の確認

      Eclipse の 組み込み Web ブラウザ (Internal Web ブラウザ)が開き,そこに実行結果が出る. 実行結果は次のようになる.

      Database
      
      1 apple 50円
      
      2 orange 20円
      
      3 strawberry 100円
      
      4 watermelon 150円
      
      5 melon 200円
      
      6 banana 100円
      

      組み込みWeb ブラウザ内のアドレスバーの部分は,

      
      http://localhost:8080/hoge/HelloWorld
      

      のようになっていることを確認しておきます.(「hoge」の部分は,実際のプロジェクト名に読み替えて下さい).

    7. (参考)うまくいかない場合

      • Eclipse を再起動するとうまく動く可能性がある.

      • 「Database」とだけ表示されるが,肝心の中身が表示されない場合.

        原因としては,プログラム中に書かれたユーザ名,パスワード名,データベース論理名の記述ミスが考えられます.確認してください. あるいは,上記に書いた手順での「jar ファイルのインポート」が正しく行われていない(あるいは,この Web ページ自体のミス)可能性があります.

      • エラーメッセージが出て,Eclipse 内部の tomcat サーバ が起動しない場合.

        C:\tomcat55\bin\tomcat5w.exe を実行してみる. サーバが stop できる状態(STOP ボタンが有効になっている状態)になって いたら,「公開 Tomcat サーバを稼働させている」ということなので, エラーが出て当然. STOP ボタンを押して,公開 Tomcat サーバを停止し,もう1度,上記の操作を行う.

      • 「接続できない」という意味のエラーが出た場合.

        「Apache Derby」→「Stop Derby Network Server (Derby ネットワーク・サーバの停止)」と操作し,もう1度実行するとうまくいく場合がある.

    Java サーブレット・プログラムのデバッグについては,「Eclipse を使用しての Java サーブレット・プログラム開発」の Web ページ を見てください.


    エクスポート (Eclipse の Export 機能を利用)

    Eclipse でエクスポートを行い、単体で動くようにします。

    1. プロジェクト・エクスプローラから、エクスポートしたいプロジェクト derbydb を選択し、  右クリックメニューから、「エクスポート」を選択
    2. .選択ダイアログ
       「Web」→「WARファイル」→「次へ」
      
    3. WARエクスポートダイアログ
       Webモジュール:「derbydb」
       宛先:「C:\tomcat55\webapps\derbydb.war」
      

      混乱を防ぐために、エクスポートしたいプロジェクトの名前をそのまま付ける。

       「ソースファイルのエクスポート」「既存ファイルを上書き」→必要ならチェック  「終了」で、エクスポートが実行される

    4. Apache 側の設定

      apacheインストールディレクトリのconfフォルダ内 にあるworkers2.propertiesに以下の2行を追加

          [uri:/derbydb/*]
          group=lb
      
    5. 動作確認 

       直接(tomcat5w.exeから)Tomcatを実行し、Eclipseとは無関係にサーブレットが動くことを確認する。 http://localhost:8080/derbydb/HelloWorld

       また、Apacheとの連携も従来どおり行える(別途、apache サーバを起動のこと)。  なお、WEB-INFなどの、サーブレット実行に必要なディレクトリは、実行時に作成される。


    参考Webページ: http://allabout.co.jp/internet/java/closeup/CU20070119A/index4.htm

    参考Webページ: http://www.atmarkit.co.jp/fjava/javafaq/jdbc/jdbc01.html

    参考Webページ: http://d.hatena.ne.jp/benikujyaku/20070127 (Apache Derby の導入のWebページ)

    http://www.itarchitect.jp/enterprise/-/30601-3.html