金子邦彦研究室プログラミングTomcat を用いた Java サーブレット・プログラミングEclipse を使用しての Java サーブレット+データベース・プログラム開発

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

このページでは, 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 ページの説明を読み替えてください.

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

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

create table commodity (
    id 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;

Eclipse での操作手順

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

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

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

動的 Web プロジェクトの新規作成

下記の手順で,動的 Web プロジェクトを新規に作成する.

  1. (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く

    「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作する.

  2. プロジェクトの新規作成の開始

    ファイル」→「新規 (New)」→「プロジェクト (Project)
    または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」

  3. Web」の展開

    新規プロジェクトのウインドウが開くので, 「Web」を展開する.

    [image]
  4. 動的 Webプロジェクト (Dynamic Web Project)」の選択

    展開した「Web」の下にある 「動的 Webプロジェクト (Dynamic Web Project)」を選び, 「次へ」をクリック.

    [image]
  5. プロジェクト名の設定など

    設定用のウインドウが開くので,下記の設定を行う. 設定が終わったら,「次へ」をクリック.

    [image]
  6. 次の「プロジェクト・ファセット」は,デフォルトのままでよい

    次へ」をクリック.

    * このウインドウが開かないことがある.気にしなくてよい.

    [image]
  7. 次の「Web モジュール」は,デフォルトのままでよい

    終了」をクリック.

    [image]
  8. もし「関連付けられたパースペクティブを開きますか?」と聞いてきたら,「はい」をクリック

    * このウインドウが開かないことがある.気にしなくてよい.

    [image]
  9. 作成されたプロジェクトの確認

    プロジェクト・エクスプローラで,いま作成した動的 Web プロジェクト hoge が表示されていることを確認する.

    [image]

(Java DB (Derby) を使うときのみ) Apache Derby ネーチャーの追加と,サーバの開始

Java DB (Derby) を使うときに限り,プロジェクトへのApache Derby ネーチャーの追加 と,Java DB (Derby) サーバの開始を行う. これは, Java DB (Derby) を使うための追加的な設定です

  1. プロジェクト・エクスプローラで,プロジェクト名 hoge右クリック
  2. 「Apache Derby」→「Apache Derby ネーチャーの追加」

    「Apache Derby」が候補として現れないときは, Java DB (Derby) インストール の手順に従って,インストールと設定を行う.

  3. 「Apache Derby」→「Derby ネットワーク・サーバの開始」

    ポート1527 で Derby サーバが起動します.

    「Derby ネットワーク・サーバの開始」が選べない状態になっているときは, すでに開始済みなので,この手順は不要.

リレーショナルデータベース・ソフトウェアとして,Java DB (Derby) 以外を使う場合は,上記は不要です.

プロジェクトへの Spring プロジェクト・ネイチャーの追加

今度は,Spring JDBC を使うための設定です.

プロジェクトへの Spring プロジェクト・ネーチャーの追加を,次の操作で行う.

  1. プロジェクト・エクスプローラで,プロジェクト名 hoge右クリック
    [image]
  2. Spring ツール (Spring Tools)」→「Spring プロジェクト・ネーチャーの追加」と操作.

    Spring ツール (Spring Tools)」が候補として現れないときは, Eclipse の SpringIDE プラグイン の手順に従って,インストールを行う.

  3. プロジェクトの下に,「Spring Elements」が増えるので確認しておく.

    プロジェクト名 HelloWorld の左横の 「+」をクリックして展開すると, 「Spring Elements」が増えている. (Spring プロジェクト・ネーチャーの追加ができたことが分かる).

    [image]

WebContent\WEB-INF\lib への,jar ファイルのインポート

次の2種類の jar ファイルを,今度は,WebContent\WEB-INF\lib にインポートします.

プロジェクトの WebContent\WEB-INF\lib へのインポートを行う手順を下記に示す.

  1. プロジェクト構成物の表示

    プロジェクト・エクスプローラで, プロジェクト名 hoge の左横の「+」をクリックして展開すると,「Java リソース; src」などが現れる(その他,いろいろ,プロジェクトの構成物が現れる).

    * すでに展開済みのときは,この手順は不要.

    [image]
  2. WebContent の展開

    WebContent の左横の「+」をクリックして展開する.

    * すでに展開済みのときは,この手順は不要.

    [image]
  3. WEB-INF の展開

    WEB-INF の左横の「+」をクリックして展開する.

    * すでに展開済みのときは,この手順は不要.

    [image]
  4. WEB-INF の下の lib を右クリックし,「インポート」を選ぶ.
    [image]
  5. インポート・ソースの選択

    一般」→「ファイルシステム」と操作した後, 「次へ」をクリック.

    [image]
  6. ファイルの指定

    インポートの手順は下記の通りである.

    1. 今出ているウインドウで,ソース・ディレクトリとして,各ファイルのディレクトリを指定.
    2. すると,ソース・ディレクトリの下に,ファイルの一覧が表示される. ここで,インポートすべきファイルを選ぶ. インポートすべきファイルをチェックする
    3. 以上の操作の後,「終了」をクリック.
    [image]

    インポートするファイルが複数あるので, lib を右クリックし,「インポート」を選ぶという手順に戻って,やり直す必要がある. (つまり,ファイルの数だけ,インポートの操作を繰り返す). 上にも書きましたが,インポートすべきファイルは,次の2種類です.

  7. インポートの結果,ファイルが増える

    インポートの結果,ファイルが増えたことを確認したいときは,プロジェクト・エクスプローラで,「lib」を展開する.

    [image]

Java パッケージ作成

Eclipse のプロジェクト・エクスプローラを使って, Java パッケージを作成します. Java パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. このページでは,作成するJava パッケージ名は,hoge.hoge.com と書く. (Java パッケージ名を変えるときは,読み替えてください).

  1. (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く

    「ウインドウ」→「ビューの表示」→「プロジェクト・エクスプローラ」 と操作する.

    Java パッケージの作成,クラスの作成などの作業は,プロジェクト・エクスプローラで行う.

  2. Java パッケージを新規作成すべきプロジェクトの選択

    プロジェクト・エクスプローラに,プロジェクト一覧が表示されているはずです. Java パッケージを新規作成したいプロジェクト名 hoge右クリックして, 「新規」→「パッケージ」と操作する.

    [image]
  3. Java パッケージ名の設定

    「Java パッケージ (Java package)」名前として,Java パッケージ名 hoge.hoge.comを記入する.

    その後,「終了」をクリック.

    [image]
  4. Java パッケージの確認

    プロジェクト・エクスプローラにおいて, Java パッケージ hoge.hoge.com が増えていることを確認する.

    * プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト hoge の左横の「+」をクリックして展開した後, 下の 「Java リソース; src」の左横の「+」をクリックして展開して下さい.

    [image]

サーブレットの作成

  1. 新規サーブレットの作成の開始

    プロジェクト・エクスプローラにおいて, サーブレットを作成したいJava パッケージ名 hoge.hoge.com右クリック

    * プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト名の下の 「Java リソース; src」を展開して下さい.

    [image]
  2. 新規 (New)」→「その他 (Other)」と操作する.
  3. サーブレットの選択

    サーブレットを作成したいので, 「Web」→「サーブレット (Servlet)」と操作し, 「次へ」をクリックします.

    [image]
  4. サーブレットのクラス名等の指定

    新規に作成するサーブレットについて,Java パッケージ名,クラス名等を入力できるウインドウが開くので,設定を行う.

    1. 「Java パッケージ (Java package)」(3行目): Java パッケージ名 「hoge.hoge.com」を設定.

      *hoge.hoge.com」になっていなければ修正すること.

    2. 「クラス名」(4行目の「名前」のところ): HelloWorld
    [image]
  5. 次はデフォルトのままでよい

    次へ」をクリックします.

    [image]
  6. 次はデフォルトのままでよい

    終了」をクリックします.

    [image]
  7. 作成されたクラスの確認

    プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.com の左横の「+」をクリックして展開すると, クラスファイル HelloWorld.java が現れるはず.確認しておく.

    [image]

クラス定義と実行

  1. プロジェクト構成物の表示

    プロジェクト・エクスプローラで, プロジェクト名 hoge の左横の「+」をクリックして展開すると,「Java リソース; src」などが現れる(その他,いろいろ,プロジェクトの構成物が現れる).

    * すでに展開済みのときは,この手順は不要.

    [image]
  2. Java パッケージ一覧の表示

    プロジェクト・エクスプローラで, 「Java リソース; src」の左横の「+」をクリックして展開すると,Java パッケージ一覧などが現れる.

    * すでに展開済みのときは,この手順は不要.

    [image]
  3. クラスファイル一覧の表示

    プロジェクトエクスプローラで, 先ほど作成したJava パッケージ名 hoge.hoge.com の左横の「+」をクリックすると, クラスファイル一覧が現れる.

    * すでに展開済みのときは,この手順は不要.

    [image]
  4. 定義したいクラスのファイルを開く

    HelloWorld クラスを定義したいので, プロジェクト・エクスプローラの クラスファイル一覧の中から, 「HelloWorld.java」をダブルクリックします. すると,エディタが開きます.

    このように,Eclipse のプロジェクト・エクスプローラで,定義したいクラスの「クラス名.java」ダブルクリックすると,エディタが開くことになっています.

    [image]

    * なお,別のクラスを追加したいときは, Java パッケージ名を右クリックして「新規」→「クラス」です.

  5. エディタでクラス HelloWorld を定義する

    下記のクラス定義をカットアンドペーストしてみて下さい(テスト用に作ったクラス定義です). (Java パッケージ名を「hoge.hoge.com」と書いているので,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 にインポートしておく.
            // https://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
        }                
    }
    ----------------------ここまで----------------------
    
  6. ソースを保存

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

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

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

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

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

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

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

    [image]
  2. 実行 (Run As)」→「サーバーで実行 (Run on Server)」と操作
  3. サーバの選択

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

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

    終了」をクリック.

    [image]

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

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

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

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

    [image]
  6. 実行結果の確認

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

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

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

    http://localhost:8080/hoge/HelloWorld
    

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

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