Tomcat と PostgreSQL で Web アプリケーションを! (Servlet/JSP)
下記は、Redhat 6.2 のシステムを使用し、必要なすべてのモジュールが /usr/local/src にダウンロードされているものとして説明をします。また、ほとんどのモジュールを /usr/local にインストールします。# はプロンプトで、スーパーユーザー(root) での作業であることを意味します。$ もプロンプトですが、一般ユーザーでの作業であることを意味します。
JDK
JDK を入手しインストールします。
Java(TM)
2 Platform, Standard Edition より JDK 1.3をダウンロードする。Linux の場合、利用するバージョンによって注意事項があるのでJava(TM)
2 SDK 1.3.1 Linux 版 インストールガイド を必ずチェックしてください。
# cd /usr/local/src # sh j2sdk-1_3_1_02-linux-i386.bin Sun Microsystems, Inc. Binary Code License Agreement READ THE TERMS OF THIS AGREEMENT AND ANY PROVIDED SUPPLEMENTAL LICENSE TERMS (COLLECTIVELY "AGREEMENT") ... Do you agree to the above license terms? [yes or no] yes ... Done. # mv jdk1.3.1_02 /usr/local/
利用するシェルに応じた形式で、 JAVA_HOME, PATH, CLASSPATH 環境変数を設定します。
sh, bash 系の場合: JAVA_HOME=/usr/local/jdk1.3.1_02 CLASSPATH=.:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME CLASSPATH PATH csh 系の場合: setenv JAVA_HOME /usr/local/jdk1.3.1_02 setenv CLASSPATH .:$JAVA_HOME/lib/tools.jar set path=($path $JAVA_HOME/bin) 動作チェック: # java -version java version "1.3.1_02" Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_02-b02) Java HotSpot(TM) Client VM (build 1.3.1_02-b02, mixed mode) #
Apache + Tomcat 4
バイナリーおよびソースを入手します。
Apache (Http Server) | http://www.apache.org/dist/httpd/ |
Tomcat 4 (Servlet 2.3/JSP 1.2) | http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/ |
HTTP サーバーである Apacheのインストール。DSO(Dynamic Shared Object) をサポートするように設定します。
# gzip -dc apache_1.3.22.tar.gz | tar xf - # cd apache_1.3.22 # ./configure --enable-module=so Configuring for Apache, Version 1.3.22 + using installation path layout: Apache (config.layout) ... # make # make install
Apache の設定ファイルである httpd.conf をチェックします。Redhat で既に HTTP サーバーが起動している場合、それを停止するか、新しくインストールした Apache の Port を変更(たとえば 8080、ただし Tomcat でデフォルトで設定されているポートがあるので注意が必要)する。
# /usr/local/apache/bin/apachectl configtest Syntax OK #
Servlet/JSP である Tomcat のインストール。必要なものが揃っているバイナリ版(jakarta-tomcat-4.0.1.tar.gz)をインストールします。Pure Java なコードなのでバイナリーがどのマシンでも動作します...ソースから作る場合、多くのアーカイブが必要になります。ソースパッケージに含まれる BUILDING.txt を参照してください。
# cd /usr/local/src # gzip -dc jakarta-tomcat-4.0.1.tar.gz | tar xf - # mv jakarta-tomcat-4.0.1 /usr/local/
ApacheとTomcatを連携させるための mod_webappのインストール。バイナリー版は、glibc 2.2 対応のものしかないため Redhat 6.2 ではソース(webapp-module-1.0.1-tc401-src.tar.gz)から作ります。また、Tomcat 4.0.1 に含まれている warp.jar は SSL に対応していないので入れ替えます。mod_webapp のコンパイルには GNU autoconf, libtool が必要ですが、Redhat にはパッケージに含まれているのでそのまま利用できます。
# cd /usr/local/src # gzip -dc webapp-module-1.0.1-tc401-src.tar.gz | tar xf - # cd webapp-module-1.0.1-tc401 # sh support/buildconf.sh --- Running the "buildconf" script for APR buildconf: checking installation... ... --- All done # ./configure --with-apxs=/usr/local/apache/bin/apxs \ > --enable-java=/usr/local/jdk1.3.1_02 \ > --with-tomcat=/usr/local/jakarta-tomcat-4.0.1 # make # cp apache-1.3/mod_webapp.so /usr/local/apache/libexec/ # cp java/warp.jar /usr/local/jakarta-tomcat-4.0.1/server/lib/
Apache の設定ファイル httpd.conf に mod_webapp モジュールをロードする設定を追加します。
# edit /usr/local/apache/conf/httpd.conf LoadModule webapp_module libexec/mod_webapp.so AddModule mod_webapp.c <IfModule mod_webapp.c> WebAppConnection warpConnection warp localhost:8008 WebAppDeploy examples warpConnection /examples WebAppInfo info </IfModule>
ここで、WebAppDeploy を記述する際に、パスを指定する部分で最後にスラッシュ(/)を入れないと configtest でエラーになることがある。(WebAppDeploy
examples warpConnection /examples/
)
変更したの設定ファイル httpd.conf をチェックします。
# /usr/local/apache/bin/apachectl configtest Syntax OK #
Tomcat自身は、HTTPサーバとして使用しないので設定ファイルを変更します。機能を使用しないようにコメントアウトします。SSL対応 HTTPサーバーとしても使用しないなら、その記述もコメントアウトします。
# edit /usr/local/jakarta-tomcat-4.0.1/conf/server.xml <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <!-- <Connector className="org.apache.catalina.connector.http.HttpConnector" port="8080" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="60000"/> -->
動作させるには、まず、Tomcat を起動してから Apache を起動します。Tomcat 起動のために、CATALINA_HOME 環境変数を設定しておきます。JAVA_HOME 環境変数も設定されてなければなりません(上記 JDK 1.3 のインストールを参考にしてください)。
sh, bash 系の場合: CATALINA_HOME=/usr/local/jakarta-tomcat-4.0.1 export CATALINA_HOME csh 系の場合: setenv CATALINA_HOME /usr/local/jakarta-tomcat-4.0.1 Tomcat の起動: # /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh start Guessing CATALINA_HOME from catalina.sh to ... Setting CATALINA_HOME to ... Using CLASSPATH: ... Using CATALINA_BASE: ... Using CATALINA_HOME: ... Using JAVA_HOME: ... Tomcat の停止: # /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh stop Guessing CATALINA_HOME from catalina.sh to ... Setting CATALINA_HOME to ... Using CLASSPATH: ... Using CATALINA_BASE: ... Using CATALINA_HOME: ... Using JAVA_HOME: ...
最後に Apache を起動して、ブラウザーを使って動作確認をします。
# /usr/local/apache/bin/apachectl start
ブラウザーでアクセス(http://<servername>:8080/info/)してみると以下のような場面が表示されます。ここで、URL を指定する際に最後に必ずスラッシュ(/)を指定して下さい。JSPのサンプルは http://<servername>:8080/examples/jsp/ にアクセスすることで確認できます。Apache の設定で、Port を 8080 としたので URL に 8080 ポートを指定しています。
Webアプリケーションは、Apacheの設定ファイル(httpd.conf)に WebAppDeploy を記述し、Tomcatの設定ファイル(server.xml)にContextを記述することで追加することができます。
PostgreSQL
ソースを入手します。(SRA の FTP サーバーから最新のものを入手)
PostgreSQL 7.1.3 | ftp://ftp.sra.co.jp/pub/cmd/postgres/7.1.3/patches/postgresql-7.1.3-patched.tar.gz |
Ant (build tool) | http://jakarta.apache.org/ant/index.html |
ソースを展開しコンパイルするのですが、JDBC対応のドライバを作るために ANT をインストールする必要があります。
ANTのインストール。必要なものが揃っているバイナリ版(jakarta-ant-1.4.1-bin.tar.gz)をインストールします。これも、Pure Java なコードなのでバイナリーがどのマシンでも動作します。
# cd /usr/local/src # gzip -dc jakarta-ant-1.4.1-bin.tar.gz | tar xf - # mv jakarta-ant-1.4.1 /usr/local/
ANT 利用のために、ANT_HOME, PATH 環境変数を設定しておきます。
sh, bash 系の場合: ANT_HOME=/usr/local/jakarta-ant-1.4.1 PATH=$PATH:$ANT_HOME/bin export ANT_HOME PATH csh 系の場合: setenv ANT_HOME /usr/local/jakarta-ant-1.4.1 set path=($path $ANT_HOME/bin)
PostgreSQLのインストール。もし、古いバージョンの PostgerSQL を利用している場合、pg_dumpallの実行や postmasterプロセスを終了させてください。/usr/local/pgsql のバックアップもね!make check は、データーベースを作ってテストするので、一般ユーザーで作業を行います。PostgreSQL では、管理用のユーザーが必要なので、はじめにユーザーを作ってしまいます。
データーベース管理のための専用ユーザー postgres を作ります。 旧バージョンをインストールしてある場合既に存在しているので必要ありません。
# groupadd postgres # useradd -g postgres -m postgres # passwd postgres New UNIX password: Retype new UNIX password: # su postgres postgres$ (継承していると思うが...一応、コンパイルに必要な環境変数を設定しておく) postgres$ JAVA_HOME=/usr/local/jdk1.3.1_02 postgres$ CATALINA_HOME=/usr/local/jakarta-tomcat-4.0.1 postgres$ ANT_HOME=/usr/local/jakarta-ant-1.4.1 postgres$ PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin postgres$ export JAVA_HOME CATALINA_HOME ANT_HOME PATH postgres$ postgres$ cd /usr/local/src postgres$ gzip -dc postgresql-7.1.3-patched.tar.gz | tar xf - postgres$ cd postgresql-7.1.3 postgres$ ./configure --enable-multibyte=EUC_JP --with-java postgres$ make (GNU make) ... All of PostgreSQL is successfully made. Ready to install. postgres$ make check ... ======================
All 76 tests passed.
======================
... postgres$ exit # make install
出来上がった JDBC ドライバーは、デフォルトのインストール先では Tomcat などで利用する際の設定が面倒なので JRE(JDK) が利用するデフォルトの CLASSPATH にコピーしてしまいます。
# cp /usr/local/pgsql/share/java/postgresql.jar $JAVA_HOME/jre/lib/ext/
ここで必要なら /etc/ld.so.conf に /usr/local/pgsql/lib を追加して /sbin/ldconfig コマンドを実行します。Solaris などは LD_LIBRARY_PATH 環境変数に /usr/local/pgsql/lib を追加する。
# edit /etc/ld.so.conf <追加 /usr/local/pgsql/lib > # /sbin/ldconfig
また、コマンドをフルパスで入力するのは大変なので PATH 環境変数に /usr/local/pgsql/bin を追加しておくと良いでしょう。
データ格納用のディレクトリを作成し、 所有権を postgres にしてデータベースを初期化します。データーベースの初期化から ユーザー(postgres) で作業してください。
# mkdir /usr/local/pgsql/data # chown postgres /usr/local/pgsql/data # su - postgres postgres$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data ... Success. You can now start the database server using: /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data or /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start
PostgreSQL の設定ファイル postgresql.conf を編集して、JDBC などで利用できるように設定します。
postgres$ edit /usr/local/pgsql/data/postgresql.conf tcpip_socket = on silent_mode = on
サーバーを起動したら使用可能になります。
postgres$ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
環境変数 PGDATA にデータを格納するディレクトリー(/usr/local/pgsql/data)を指定しておくことで -D オプションは省略できます。
PostgreSQL を使用できるユーザを登録します。(PostgreSQLを利用できる UNIXアカウントを登録する)作業は ユーザー(postgres) で行ってください。createuserコマンドを使用して登録しますが、Servlet/JSP での利用が目的なので apache で利用するアカウントを登録しておきます。(デフォルトは nobody)
1番目の質問 作成するユーザのアカウント名を入力します。
2番目の質問 このユーザがデータベースを作れるかどうか決定します。
3番目の質問 このユーザが新たにユーザを登録できるかどうか決定します。
postgres$ /usr/local/pgsql/bin/createuser Enter name of user to add: nobody Shall the new user be allowed to create databases? (y/n) y Shall the new user be allowed to create more new users? (y/n) n CREATE USER postgres$
各プログラムの起動とシステムへの登録
各ユーザーが設定しておくと便利な環境変数
sh, bash 系の場合 | JAVA_HOME=/usr/local/jdk1.3.1_02 CLASSPATH=.:$JAVA_HOME/lib/tools.jar CATALINA_HOME=/usr/local/jakarta-tomcat-4.0.1 ANT_HOME=/usr/local/jakarta-ant-1.4.1 PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin:/usr/local/pgsql/bin export JAVA_HOME CLASSPATH CATALINA_HOME ANT_HOME PATH |
csh 系の場合 | setenv JAVA_HOME /usr/local/jdk1.3.1_02 setenv CLASSPATH .:$JAVA_HOME/lib/tools.jar setenv CATALINA_HOME /usr/local/jakarta-tomcat-4.0.1 setenv ANT_HOME /usr/local/jakarta-ant-1.4.1 set path=($path $JAVA_HOME/bin $ANT_HOME/bin /usr/local/pgsql/bin) |
システム起動時に Tomcat や Apache を起動させたい場合、/etc/rc.d 以下にスクリプトを用意しておく(Linux の場合、chkconfig コマンドを利用できるように設定しておくと便利)
Tomcat | /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh start /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh stop |
Apache | /usr/local/apache/bin/apachectl start /usr/local/apache/bin/apachectl stop |
PostgreSQL | #!/bin/sh # # Config Variables # PGACCOUNT="postgres" PGDATA="/usr/local/pgsql/data" POSTMASTER="/usr/local/pgsql/bin/postmaster" PG_CTL="/usr/local/pgsql/bin/pg_ctl" # Source function library. . /etc/rc.d/init.d/functions # case "$1" in start) echo -n "Starting postgres: " su - $PGACCOUNT -c "$POSTMASTER -D $PGDATA" echo touch /var/lock/subsys/postgres ;; stop) echo -n "Stopping postgres: " $PG_CTL -m f -D $PGDATA stop echo rm -f /var/lock/subsys/postgres ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 |
動作テスト
まず、PostgreSQL 単体でデータベースをテストしてその内容を Servlet/JSP を使って表示してみましょう。
createuser で登録されたユーザーで操作を行います。(ここでは、pguser で、上記セクションの環境設定が済んでいるものとします)
データベースを作成し、作成したデータベースに接続します。
pguser$ createdb emaillist CREATE DATABASE pguser$ psql emaillist Welcome to psql, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit emaillist=#
ここからは、 PostgreSQL をインタラクティブに操作できます。emaillist=# がプロンプトになります。簡単なテーブルを作ったりデータを入力したりしてみましょう。
emaillist=# create table ELIST ( emaillist(# NAME varchar(40) not null, emaillist(# EMAIL varchar(80)); CREATE emaillist=# emaillist=# emaillist=# insert into ELIST values ( emaillist(# '加藤 裕子', emaillist(# 'y-kato@foobar.co.jp'); INSERT 18734 1 emaillist=# emaillist=# insert into ELIST values ( emaillist(# '佐藤 肇', emaillist(# 'h-sato@foobar.co.jp'); INSERT 18735 1 emaillist=# emaillist=# insert into ELIST values ( emaillist(# '鈴木 一郎', emaillist(# 'i-suzuki@foobar.co.jp'); INSERT 18736 1 emaillist=# emaillist=# select * from ELIST; name | email -----------+--------------------- 加藤 裕子 | y-kato@foobar.co.jp 佐藤 肇 | h-sato@foobar.co.jp 鈴木 一郎 | i-suzuki@foobar.co.jp (3 rows) emaillist=# emaillist=# delete from ELIST where EMAIL = 'i-suzuki@foobar.co.jp'; DELETE 1 emaillist=# select NAME from ELIST; name ----------- 加藤 裕子 佐藤 肇 (2 rows) emaillist=# \q pguser$ pguser$ vacuumdb emaillist VACUUM pguser$
ここで psql の簡単な操作一覧とコマンド一覧を載せておきます。詳細はマニュアルを読んでください。
● 操作一覧
テーブルの作成 | create テーブル名 (フィールド1, フィールド2, ...); |
データの追加 | insert into テーブル名 values (データ1, データ2, ...); |
データの表示 | select * from テーブル名; select フィールド1, フィールド2, ... from テーブル名; |
データの変更 | update テーブル名 set フィールド=データ, フィールド=データ, ... where フィールド=データ; |
データの削除 | delete from テーブル名 where フィールド=データ; |
テーブルの削除 | drop table テーブル名; |
● コマンド一覧
\? | ヘルプを表示 |
\q | psql を終了 |
\g | SQL 文を実行。SQL 文の最後に、セミコロン「;」を書くと、 その SQL 文が実行されるが、セミコロンを書かずに、最後に 「\g」と書いても、同じように実行される。 |
\i | 他のファイルに書かれている内容を取り込む。 一連の SQL 文を、事前にファイルに記述しておき、 「\i ファイル名」とすることにより、一度に SQL 文を実行することができる。 |
\d | データベースの内容を表示 |
\e | 直前に発行した SQL 文をエディタで編集。 環境変数 EDITOR に設定されているエディタが起動される。編集を終了後、 SQL 文が実行される。 |
\h | SQL 文のコマンドの簡単なヘルプを表示 |
では、JDBC がきちんと利用できるか Java インタプリタを使用してテストしてみます。以下の内容で、TestPGSQL.java というファイルを作成します。
import java.sql.*; public class TestPGSQL { public static void main(String argv[]) { Connection conn = null; Statement stat = null; ResultSet rset = null; String sql = null; String url = "jdbc:postgresql:emaillist"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url,"postgres",""); stat = conn.createStatement(); sql = "select * from ELIST"; rset = stat.executeQuery(sql); while (rset.next()) { String name = rset.getString("NAME"); String email = rset.getString("EMAIL"); System.out.println("VALUES = " + name + "\t" + email); } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); if (stat != null) stat.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
作成したファイルをコンパイルして実行してみます。
pguser$ javac TestPGSQL.java pguser$ java TestPGSQL VALUES = 加藤 裕子 y-kato@foobar.co.jp VALUES = 佐藤 肇 h-sato@foobar.co.jp pguser$
Java インタプリタによる動作確認が出来たので、きちんと Servlet を利用してブラウザでアクセスできるか確認します。以下の内容で、pgsqlServlet.java というファイルを作成します。作業はスーパーユーザー(root) で行ってください。
import java.io.*; import java.text.*; import java.util.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class pgsqlServlet extends HttpServlet { private Connection handler; public void init(ServletConfig conf) throws ServletException { String PGUrl = "jdbc:postgresql://localhost/emaillist"; String PGUser = "postgres"; String PGPasswd = ""; try{ Class.forName("org.postgresql.Driver"); handler = DriverManager.getConnection(PGUrl, PGUser, PGPasswd); } catch (Exception ex){ throw new ServletException("JDBC Error"); } } public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { try{ Statement stat = handler.createStatement(); String query ="SELECT * FROM ELIST"; ResultSet rs = stat.executeQuery(query); res.setContentType("text/html; charset=EUC-JP"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>JDBC Test</title>"); out.println("</head>"); out.println("<body>"); out.println("<center><h1>E-Mail List</h1>"); out.println("<table border=\"1\">"); out.println("<tr><td>氏名</td><td>メール</td></tr>"); while(rs.next()){ String name = rs.getString(1); String email = rs.getString(2); out.println("<tr><td>" + name + "</td><td>" + name + "</td></tr>"); } out.println("</table>"); out.println("</body>"); out.println("</html>"); stat.close(); } catch (Exception ex){ PrintWriter out = res.getWriter(); out.println("<html><head>"); out.println("<title>PG_Servlet error</title>"); out.println("</head>"); out.println("<body>"); out.println(ex.getMessage()); out.println("</body></html>"); return; } } }
# javac -classpath /usr/local/jakarta-tomcat-4.0.1/common/lib/servlet.jar \ > pgsqlServlet.java
コンパイルした Java のコード(Servlet)を、Web アプリケーションとして利用できるようにするには、決められたディレクトリー構成と幾つかの設定ファイルが必要になります。まず、web.xml にサーブレットを登録することで、WEB-INF/classesの下に置いたServletを指定したサーブレット名でアクセス出来るようになります。
【web.xml の例】 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>pgsqlServlet</servlet-name> <servlet-class>pgsqlServlet</servlet-class> </servlet> </web-app>
次に、web.xml, pgsqlServlet.class といったファイルを以下のようなディレクトリー構成にします。Tomcat では、webapps という Servlet を置くところがデフォルト(docBase:デフォルトのルート)で存在するので、その下に pgtest という Web アプリケーションを構築します。
/usr/local/jakarta-tomcat-4.0.1/webapps/pgtest/WEB-INF/web.xml /usr/local/jakarta-tomcat-4.0.1/webapps/pgtest/WEB-INF/classes/pgsqlServlet.class
Web アプリケーションとして利用できるように、Tomcat へ Context の追加と Apache へ WebAppDeploy の追加を行ないます。
Tomcat への Context の追加は、Tomcat の設定ファイルである server.xml を編集します。Host タグ内に登録してください。
/usr/local/jakarta-tomcat-4.0.1/conf/server.xml:
● ブラウザにわたす Web アプリケーションの設定
... <!-- Tomcat Examples Context --> ... </ResourceParams> </Context> <!-- MyTest WebApp Context --> <Context path="/pgtest" docBase="pgtest" debug="0" reloadable="true" > </Context> </Host> ...
Apache への WebAppDeploy の追加は、Apache の設定ファイルである httpd.conf を編集します。
/usr/local/apache/conf/httpd.conf:
● Apache の設定
... <IfModule mod_webapp.c> WebAppConnection warpConnection warp localhost:8008 WebAppDeploy examples warpConnection /examples WebAppDeploy pgtest warpConnection /pgtest WebAppInfo info </IfModule>
ここで、WebAppDeploy を記述する際に、パスを指定する部分で最後にスラッシュ(/)を入れないと configtest でエラーになることがある。(WebAppDeploy
pgtest warpConnection /pgtest/
)
それぞれの設定ファイルの編集が終わったら、tomcatと apache を再起動します。
# /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh stop # /usr/local/jakarta-tomcat-4.0.1/bin/catalina.sh start # /usr/local/apache/bin/apachectl restart
ここで、URLに Servlet を指定(http://<servername>:8080/pgtest/servlet/pgsqlServlet)すると Servlet (pgsqlServlet.class) が実行されます。
実際の Servlet や JSP、クラスの作成方法等については専門の書籍やドキュメントを参照してください。