更新:$Date:: 2014-12-08 18:21:30 +0900#$, $Rev: 288 $
Javaのサーブレット開発をEclipse+Tomcatでやろうとすると、メジャーな開発環境の割には初心者向けの入門ドキュメントが少ないことに気が付かされる。また、EclipseもTomcatもバージョンアップが激しく、書籍やネット上の情報では既に古くなってしまっていることも多い。
というわけでそれなら自分で書いてみようと、2013年5月現在のサーブレット開発環境の設置・構築入門メモを作ってみた。Eclipseの操作についていろいろ細かく書いているので、Eclipse+Tomcat入門という位置づけで、初心者向けの文章。
なおこのページは、以前に、はてなダイアリーで書いた記事「[Tomcat][Java] Eclipseでサーブレット開発環境を作る(Tomcat編)」を加筆修正しました。
というわけで、まずEclipse公式ページからIDEをダウンロードする。
http://www.eclipse.org/downloads/
なお注意点として、Tomcat周りについてはJava EEに含まれているWTP(Web Tools Platform)を利用する。そのためEclipse用のTomcatプラグインはインストールしなくて良い。古いドキュメント類では eclipsetotal.com のプラグインを別途インストールするように書かれているものが多いけど、これは現在のEclipseでは不要である。(これに気が付くまでかなり長いことハマってしまった……)
ダウンロード対象の候補は下記2つあるけど、この2つは同梱プラグインの違いでしかない。
今回はTomcatで動くJavaアプリを書くのが目的なので、WTP(Web Tools Platform)などその辺のプラグインが最初から入っている"Eclipse IDE for Java EE Developers"を選べば良い。
ダウンロードしたら、展開して出てくる[Eclipse]フォルダを好きなディレクトリに置くだけでインストールは完了する。ここでは C:\Program Files に置くこととする。なお、日本語化は面倒なのでしていない。まぁだいたい英語のままでも分かるし、日本語は問題なく通るからだいじょうぶです。
これも素直に公式ページからダウンロードするだけで良い。
http://tomcat.apache.org/download-70.cgi
Tomcatは配布形式が色々あるのだが、Windows上で使うならば[Core]のzipファイルをダウンロードすれば良い。
ダウンロード後に、好きなディレクトリに展開する。私の場合、C:\localというディレクトリ下に置いた。(C:\local\apache-tomcat-7.0.39)
なお、Tomcatの設定(server.xmlなど)はすべてEclipse内からおこなうので、手動でTomcatの設定をする必要はない。ダウンロードしてきたzipファイルを展開し、それだけでインストール完了である。
これは普通に、Sun……じゃなくてOracleのページからダウンロードするだけでよい。
http://www.oracle.com/technetwork/java/javase/downloads/
JDKの[DOWNLOAD]ボタンをクリックし、[Accept License Agreement]をチェックしてWindows x86 (jdk-7u21-windows-i586.exe) をダウンロードし、ダブルクリックしてインストールする。なお、利用しているのが64bit版Windowsならば、Windows x64の方をインストールする。
というわけで必要なものがインストールできたので、さっそくEclipseを使ってHello Worldのサーブレットを作ってみよう。Eclipseを起動して以下の順におこなえば簡単にできる……はず。
まずサーブレットを動かすプロジェクトを作成する。プロジェクト名は、"TomcatTest"と名付けておこう。
Windows版のEclipseではデフォルトの文字エンコードがMS932になっていてハマることがあるので、UTF-8に変えておこう。
具体的には、Project ExplorerのTomcatTestプロジェクトを右クリックし[Properties]。[Resource]→[Text file encoding]を、[Other]のUTF-8にしておけばよい。
これでプロジェクトの準備ができたので、HelloWorldクラス(サーブレット)を追加する。
response.getWriter().write("Hello, World!");
これで、HelloWorld.java全体は、こんな感じになる。自分で書いたのは、doGet内の1行だけであることに注意:
package com.example.part1; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloWorld */ @WebServlet("/HelloWorld") public class HelloWorld extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloWorld() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().write("Hello, World!"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
Eclipseの画面下部の[Server]タブから、今作ったTomcatTestプロジェクトを設定し、Tomcatを起動する。なお[Server]タブが見つからない場合、メニューの[Window]→[Show View]→[Servers]で表示できる。
これでTomcatが正しく起動できた。
ではさっそく、Webブラウザで確認してみよう。ブラウザを開いて、
http://localhost:8080/TomcatTest/HelloWorld
にアクセスすれば、"Hello World!"が表示されるはずである。
JSPファイルを作りたい場合は、WebContentディレクトリ下に置けば良いだけである。
たとえばhello.jspは、WebContentディレクトリを右クリックして[New]→[Other]から[Web]→[JSP File]として作ればよい。(簡単なので説明省略)
Tomcatアプリケーションは通常、war形式でファイル一式をまとめて配布する(war形式とは、classファイルや設定のxmlファイルなどをまとめて、zip形式でアーカイブしたもの)。開発が終わったらプロジェクト一式をwarファイルにしよう。
先ほど作ったTomcatTestプロジェクトを右クリックし、[Export]を選択する。
[Select]のウィンドウで、[Web]→[WAR file]を選択する。
ファイル保存先の[Destination]が空欄になっているので、横の[Browse]ボタンから出力先ディレクトリを設定する。[Finisih]ボタンでwarファイルができあがる。
できあがったwarファイルを、サービスをおこなうTomcatサーバのwebappsディレクトリに設置すれば、通常は自動的にデプロイされる。
Hello Worldが書けるようになったので、次にデータベースを扱うサーブレットのサンプルを作ってみる。データベースは扱いが一番簡単な、SQLiteを使ってみよう。
まず、SQLiteの本体をインストールする。公式ホームページからWindows用のバイナリがダウンロード可能だ。
http://www.sqlite.org/
メニューから[Download]を選択し、[Precompiled Binaries for Windows]の中の"A command-line shell for accessing and modifying SQLite databases."と書かれているファイルをダウンロードする。
バージョンによって数字は多少違うだろうが、私がダウンロードしたものは[sqlite-shell-win32-x86-3071602.zip]であった。
ダウンロードしたら、展開して出てくるsqlite3.exeを適当なディレクトリにコピーしてインストールは完了する。ここでは、C:\local\sqlite に置くことにしたので、sqlite3のパスは C:\local\sqlite\sqlite3.exe ということになる。
SQLiteをJavaから利用するためのJDBCドライバは、SQLite公式ページでは配っていない。以下のページからダウンロードする。xerial氏という日本の方が作られたもののようです。
https://bitbucket.org/xerial/sqlite-jdbc
メニューから[Downloads]を選び、JDBCのjarファイルをダウンロードする。私がダウンロードしたのはVer 3.7.2だったので、[sqlite-jdbc-3.7.2.jar]というファイル名であった。
ダウンロードしたファイルを、C:\local\sqlite にコピーして置いておく。
今回のテストアプリに用いるデータベースを事前に作成しておく。
SQLiteは非常にシンプルかつお手軽なデータベースシステムで、DBの実態は単なる一つのファイルである。DBの作成はファイルが一つ作られるだけだし、DBのバックアップもそのファイルをコピーするだけ、と非常に分かりやすい。
今回の例では、ユーザIDとステータスを格納するuserinfoテーブルという簡単なテーブルを一つ持つだけのデータベースを作っておく。以下のように、Windowsのコマンドプロンプトからsqlite3.exeを実行すればtestdb.sqliteというDBが作成される。
C:\Documents and Settings\Administrator>cd \local\sqlite C:\local\sqlite>sqlite3.exe testdb.sqlite SQLite version 3.7.16.2 2013-04-12 11:52:43 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> CREATE TABLE userinfo( ...> userid VARCHAR(10) PRIMARY KEY, ...> status INTEGER NOT NULL ...> ); sqlite> INSERT INTO userinfo(userid, status) VALUES("aaaa1234", 0); sqlite> INSERT INTO userinfo(userid, status) VALUES("zzzz9876", 2); sqlite> select * FROM userinfo; aaaa1234|0 zzzz9876|2 sqlite>
最初にsqlite3.exeを実行する時点で、存在しないファイル testdb.sqlite を指定しているので、ここでDBが作成される。続いてCREATE TABLEを実行し、テストデータを2件、INSERTしている。次回以降、このデータベースに手でアクセスしたければ同様に sqlite3.exe testdb.sqlite を実行すれば良い。引数のファイルが存在すれば、それをデータベースファイルとしてopenされる。
お膳立てが整ったので、SQLiteでDBにアクセスするサンプルを作成しよう。クラス名は SqliteTest ということにする。先ほどのTomcatTestプロジェクト内に、SqliteTest.java を HelloWorld.java と同様に作成しておく。
以下の手順で、JDBCドライバをプロジェクトに追加する。
Project Explorerの[TomcatTest/WebContent/WEB-INF/lib]ディレクトリに、JDBCドライバをコピーする。具体的には、ダウンロードしておいた sqlite-jdbc-3.7.2.jar をエクスプローラからlibディレクトリにドラッグ&ドロップする。ダイアログが表示されるので、[Copy files]を選択する。
コピー後、Project Explorerからlib内のsqlite-jdbc-3.7.2.jarを右クリックし、[Build Path]→[Add to Build Path]を選択しておく。
SqliteTest.javaに、まずSQL操作に必要なimport文を先頭に記述する。今回必要なものは以下なので、デフォルトで入っている import java.io.IOException; などのすぐ下に以下を追記する。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
続いて、doGetメソッド内に以下の通りに記述する。なおDriverManager.getConnectionメソッドで指定しているSQLiteデータベースファイルの置き場所は、当然ながら各自自分が置いた場所を指してください :-)
Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("org.sqlite.JDBC"); conn = DriverManager.getConnection("jdbc:sqlite:C:/local/sqlite/testdb.sqlite"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT userid,status FROM userinfo"); response.setContentType("text/plain"); while (rs.next()) { response.getWriter().write("userid=" + rs.getString("userid") + ", "); response.getWriter().write("status=" + rs.getString("status") + "\n"); } } catch(Exception e) { e.printStackTrace(); } finally { if (rs != null ) { try {rs.close(); } catch (SQLException e) {e.printStackTrace();} } if (stmt != null ) { try {stmt.close(); } catch (SQLException e) {e.printStackTrace();} } if (conn != null ) { try {conn.close(); } catch (SQLException e) {e.printStackTrace();} } }
さきほどのHelloWorldサーブレットと同様に、[Servers]タブでTomcat v7.0が[Start]になっていることを確認して今回のSqliteTestサーブレットをブラウザから叩いてみる。
http://localhost:8080/TomcatTest/SqliteTest
正常にDBの内容が表示されればOK。
SQLiteでデータベース接続するサーブレットが書けるようになったので、最後にMySQLでも同様のものを書いてみる。JDBCを使っているから、コードの修正もほんの数行で済む。
なお、MySQLは既に設定が終わっていて稼働しているものとする。ここでMySQLの設定を1から書いていると、それだけで膨大な量になってしまうので……。以下のようなテーブルが、データベース"sampledb"にあるとしておきます。
CREATE TABLE userinfo( userid VARCHAR(10) PRIMARY KEY, status INTEGER NOT NULL ) ENGINE=InnoDB ;
MySQLをJavaから利用するには、JDBCドライバとしてConnector/Jを利用する。MySQLの公式ページからダウンロードできる。
http://dev.mysql.com/downloads/connector/j/
ダウンロードページ内、"Platform Independent (Architecture Independent), ZIP Archive"の[mysql-connector-java-5.1.25.zip]をダウンロードすればよい。[Download]ボタンをクリックする。
ダウンロード画面では、Orace Web Accountでログインするよう促されるのだが、実はアカウント作成は必要無い。下にひっそりとある「No thanks, just start my download.」をクリックすればダウンロードできる。
ダウンロードしたら、適当なディレクトリに展開する。ここではSQLiteと同じくC:\localに置くこととし、C:\local\mysql-connector-java-5.1.25 に展開した。
先ほどのSqliteTestサーブレットと同様にして、MysqlTestサーブレットをTomcatTestプロジェクト下に作成する。
Project Explorerの[TomcatTest/WebContent/WEB-INF/lib]ディレクトリにJDBCドライバをコピーする。具体的には、展開しておいた mysql-connector-java-5.1.25-bin.jar をエクスプローラからlibディレクトリにドラッグ&ドロップする。ダイアログが表示されるので、[Copy files]を選択する。
コピー後、Project Explorerからlib内のmysql-connector-java-5.1.25-bin.jarを右クリックし、[Build Path]→[Add to Build Path]を選択しておく。
なおConnector/Jの利用方法については、サンプルコードなども含めて配布物のdocs/connector-j.pdfにまとめられている。ページ数は膨大だが、サンプルコードも多く比較的読みやすい文書だと思うのでコーディングの際にはこれを参照すること。
先ほどのSQLiteの例とほとんど同じなので、変更点だけ述べておく。まずJDBCドライバのロードの際には、newInstance()メソッドを使う必要がある。そしてDriverManager.getConnection()するときには、SQLiteには無かった認証が必要なので、以下のような形式で記述する。
Class.forName("com.mysql.jdbc.Driver").newInstance(); DriverManager.getConnection("jdbc:mysql://192.168.11.187/sampledb?user=username&password=xxxxx");
この例では、MySQLサーバのIPアドレスが192.168.11.187、接続するデータベース名がsampledb、ユーザ名がusername、パスワードがxxxxxである。
というわけで、MysqlTestサーブレットのdoGetメソッド内にこんな感じに書けばよい。
Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection("jdbc:mysql://192.168.11.187/sampledb?user=username&password=xxxxx"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT userid,status FROM userinfo"); response.setContentType("text/plain"); while (rs.next()) { response.getWriter().write("userid=" + rs.getString("userid") + ", "); response.getWriter().write("status=" + rs.getString("status") + "\n"); } } catch(Exception e) { e.printStackTrace(); } finally { if (rs != null ) { try {rs.close(); } catch (SQLException e) {e.printStackTrace();} } if (stmt != null ) { try {stmt.close(); } catch (SQLException e) {e.printStackTrace();} } if (conn != null ) { try {conn.close(); } catch (SQLException e) {e.printStackTrace();} } }
これで、以下のURLから先ほどのSQLiteの例と同様のレスポンスが返るようになるはず。
http://localhost:8080/TomcatTest/MysqlTest
シェルスクリプトの本を書きました。このページがお役に立った方でシェルスクリプトに興味のある方、ぜひ買ってちょ。サーバ監視など、インフラ周りの豆知識的なことも結構載せているので役に立つと思います!(たぶん)
※Kindle版もあります。