Eclipse を使用して,Tomcat 上で動く,Java サーブレット・プログラム開発を行います.
Eclipse 内部の tomcat サーバ(あとで説明します)を使えるようにするためには,Eclipse で 「新規サーバの定義」という操作を行う必要があります. (新規サーバの定義は,Eclipse で1回行うだけでいいです).
Java サーブレットは,Java のクラスとして定義されることになります.作成は Eclipse 上で行います. 詳しくは,次の手順になります.
「サーブレット」というときは,URL と Java のクラスとのマッピング定義が必要になるため,単なる「Java のクラス」と「サーブレット」という言葉は区別することにします.
Eclipse を使わずにJava サーブレットのプログラムを作成する場合と比べると,Eclipse が,マッピング定義が自動で行ってくれるし,ディレクトリ作成も自動で行ってくれるという違いがあります.
Java サーブレットのプログラムのテストを行うために,「Eclipse 内部の tomcat サーバ」(あとで説明します)を使います. つまり,Java サーブレットの作成とテストとデバッグの一連の作業を,Eclipse 上で行います.
動作テストが終わったら, Eclipse でエクスポート操作を行って, 公開 tomcat サーバ で動くようにします. ここでの「エクスポート」は簡単にいうと,Eclipse の配下にある各種ファイルを,公開 tomcat サーバが管理するディレクトリの下に コピーする操作です.
【この Web ページの目次】
【補足説明】
下記の 2つのサーバは別物です. 2つを同時に動かすことはできません(ポートを奪い合うことができないので).一方を動かすときは,もう一方を止めることになります.
Eclipse では,Eclipse 内部の tomcat サーバが動き, Java サーブレットの動作テストなどに使う.
Eclipse とは無関係の tomcat サーバ(C:\tomcat55\bin\tomcat5w.exe 等で起動する Tomcat サーバのこと).当然, 公開 tomcat サーバが管理するディレクトリも Eclipse とは独立している.
C:\Program Files\Java\jdk1.6.0_11 のようなディレクトリがあれば,インストール済み.
前もって,Tomcat インストールディレクトリを調べておいてください. この Web ページでは次のように書きます.
ここでは,Eclipse で,新規サーバの定義を行います. その後,定義がうまくいったかを確認するために, Eclipse 内部の tomcat サーバの起動と停止を行ってみます.
※ サーバービューが表示されないときは,Eclipse で 「ウィンドウ (Window)」→「パースペクティブを開く」→「その他 (Other)」→「Java)」 と操作した後,上記の操作をもう1度やり直すとうまくいくことがある.
サーバー (Servers) ビュー内の任意の場所で,右クリックし,「新規 (New)」→「サーバー (Server)」と操作する
新規サーバ定義ウインドウが表示されるので, Apacheを展開し「Tomcat v5.5 Server (Tomcat v5.5 サーバー)」)を選択して,「次へ (Next)」をクリック.
次のウインドウでは,「Tomcat インストール・ディレクトリー」を C:\tomcat55に設定し,「終了」をクリック.
これで,Eclipse 内部の tomcat サーバについて,起動,停止,再起動,デバックモードでの起動を行うためのボタンなどが, サーバー (Servers) ビューの上端に表示されるようになります.
後で説明するように,Eclipse 内部の Tomcat サーバの起動と停止は自動で行われるのですが, 新規サーバの定義が正しくできたかの確認のために, 起動と停止を手動で行ってみます.
これで起動される tomcat サーバは,Eclipse 内部の Tomcat サーバです. 公開 tomcat サーバ (C:\tomcat55\bin\tomcat5w.exe) とは別ものです.
【うまく起動できないときのヒント】
はまるとやっかいなので,分かる限りでヒントを書いておきます.
【公開 Tomcat サーバと 8080 ポートで通信できる】
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
【公開 Tomcat サーバと 8080 ポートで通信できない (コメントにしているため)】
<--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
公開 Tomcat サーバと 8080 ポートで通信することはできないようになっている場合には,次のことが考えられます.検討してください.
セキュリティ上の理由で,このように設定されていることはよくある.
自動で引き継がれるので仕方が無い
対処法ですが,再インストールが一番簡単のようです.
という手順になりそうです.
新しい Tomcat サーバの登録(例えば,新バージョンの Tomcat サーバなど)は,次の手順で行います. (参考情報として載せています).
以下,Eclipse を使います. プロジェクトの作成,クラスの定義と実行という一連の操作を,図解で説明します.
Java サーブレット・プログラムを動かすために,Eclipse のプロジェクト等を作ります. この Web ページでは,Eclipse のプロジェクト名,Java パッケージ名,Java サーブレットのクラス名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).
この Web ページでは,Java サーブレットのクラスを1つ作ります.
下記の手順で,動的 Web プロジェクトを新規に作成します.
「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作します.
「ファイル」→「新規 (New)」→「プロジェクト (Project)」
または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」
新規プロジェクトのウインドウが開くので, 「Web」を展開する.
展開した「Web」の下にある 「動的 Webプロジェクト (Dynamic Web Project)」を選び, 「次へ」をクリック.
設定用のウインドウが開くので,下記の設定を行う. 設定が終わったら,「次へ」をクリック.
プロジェクト名は,好きな名前でよいが,スペースや全角文字は避けること. ここでは,プロジェクト名を,「hoge」と付けることにする.
「デフォルトの使用 (Use default)」にチェックを入れたままで良い.
他のもの(例えば「なし」)になっていたら,「Apache Tomcat v5.5」に変更しておく
※ 変更のとき,「なし」だけしか無くて,「Apache Tomcat v5.5」が候補として表示されない場合は, このページの上の方に書いている「新規サーバの定義」の手順を行う
「次へ」をクリック.
※ このウインドウが開かないことがあります.気にしなくてよい.
「終了」をクリック.
※ このウインドウが開かないことがあります.気にしなくてよい.
Eclipse のプロジェクト・エクスプローラを使って, Java パッケージを作成します. Java パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. この Web ページでは,作成するJava パッケージ名は,hoge.hoge.com と書きます. (Java パッケージ名を変えるときは,読み替えてください).
「ウインドウ」→「ビューの表示」→「プロジェクト・エクスプローラ」 と操作します.
Java パッケージの作成,クラスの作成などの作業は,プロジェクト・エクスプローラで行うことにします.
プロジェクト・エクスプローラに,プロジェクト一覧が表示されているはずです. Java パッケージを新規作成したいプロジェクト名 hoge を右クリックして, 「新規」→「パッケージ」と操作します.
「Java パッケージ (Java package)」の名前として,Java パッケージ名 hoge.hoge.comを記入する.
その後,「終了」をクリック.
プロジェクト・エクスプローラにおいて, Java パッケージ hoge.hoge.com が増えていることを確認する.
※ プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト hoge の左横の「+」をクリックして展開した後, 下の 「Java リソース; src」または「src」の左横の「+」をクリックして展開して下さい.
サーブレットの作成の手順は次の通りです. 前準備として,Java パッケージ hoge.hoge.com を作成済みであること.
プロジェクト・エクスプローラにおいて, サーブレットを作成したいJava パッケージ名 hoge.hoge.com を右クリック.
※ プロジェクト・エクスプローラで, Java パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト名の下の 「Java リソース; src」または「src」の下を展開して下さい.
サーブレットを作成したいので, 「Web」→「サーブレット (Servlet)」と操作し, 「次へ」をクリックします.
新規に作成するサーブレットについて,Java パッケージ名,クラス名等を入力できるウインドウが開くので,設定を行います.
※ 「hoge.hoge.com」になっていなければ修正すること.
「次へ」をクリックします.
「終了」をクリックします.
参考Webページ: http://www.stackasterisk.jp/tech/java/wtp02_03.jsp
参考: Eclipse インストールと基本操作のWebページ
プロジェクト・エクスプローラで, プロジェクト名 hoge の左横の「+」をクリックして展開すると,「Java リソース; src」などが現れる(その他,いろいろ,プロジェクトの構成物が現れる).
※ すでに展開済みのときは,この手順は不要.
プロジェクト・エクスプローラで, プロジェクト名 hoge の左横の「+」をクリックして展開すると,「Java リソース; src」などが現れる(その他,いろいろ,プロジェクトの構成物が現れる).
プロジェクト・エクスプローラで, 「Java リソース; src」の左横の「+」をクリックして展開すると,Java パッケージ一覧などが現れる.
※ すでに展開済みのときは,この手順は不要.
プロジェクトエクスプローラで, 先ほど作成したJava パッケージ名 hoge.hoge.com の左横の「+」をクリックすると, クラスファイル一覧が現れます.
※ すでに展開済みのときは,この手順は不要.
HelloWorld クラスを定義したいので, プロジェクト・エクスプローラの クラスファイル一覧の中から, 「HelloWorld.java」をダブルクリックします. すると,エディタが開きます.
このように,Eclipse のプロジェクト・エクスプローラで,定義したいクラスの「クラス名.java」 をダブルクリックすると,エディタが開くことになっています.
※ なお,別のクラスを追加したいときは, Java パッケージ名を右クリックして「新規」→「クラス」です.
下記のクラス定義をカットアンドペーストして下さい(見本として作ったクラス定義です). (Java パッケージ名を「hoge.hoge.com」と書いているので,Java パッケージ名を別の名前にしている場合には,適切に読み替えてください).
【プログラムの要点】
response.setContentType("text/html; charset=iso-2022-jp");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>HelloWorld</h1>");
out.println("</body>");
out.println("</html>");
out.close();
同じ方針で,例えば,リレーショナルデータベースの中身を取り出して Web ページを作ることも簡単にできます.
----------------------ここから---------------------
package hoge.hoge.com;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class for Servlet: HelloWorld
*
*/
public class HelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
/* (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 {
response.setContentType("text/html; charset=iso-2022-jp");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>HelloWorld</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
/* (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 内の問題・ビューに表示されるので確認する.
Eclipse のプロジェクト・エクスプローラを使用して,上記で作ったJava サーブレットのプログラム をテスト実行してみます.
Eclipse のプロジェクト・エクスプローラで,実行したいクラス名.java (つまり HelloWorld.java) を右クリック
ウインドウが開くので, 「ローカルホストの Tomcat v5.5 サーバ」が選択されていることを確認の後,「次へ (Next)」をクリック.
「終了」をクリック.
すでに,C:\tomcat55\bin\tomcat5w.exe などを使って,「公開 Tomcat サーバを稼働させている」ときは, Eclipse 内部の Tomcat サーバが起動しない(ポートを奪い合うので)ので, C:\tomcat55\bin\tomcat5w.exe を使って, 公開 Tomcat サーバを停止させて下さい.
コンソール・ビューに表示される.
Eclipse の 組み込み Web ブラウザ (Internal Web ブラウザ)が開き,そこに実行結果が出る. 「Hello Java World!」と出れば成功.
実行で,エラーが出る場合,
C:\tomcat55\bin\tomcat5w.exe を実行してみる. サーバが stop できる状態(STOP ボタンが有効になっている状態)になって いたら,「公開 Tomcat サーバを稼働させている」ということなので, エラーが出て当然. STOP ボタンを押して,公開 Tomcat サーバを停止し,もう1度,上記の操作を行う.
それでもうまく動かない場合は,Eclipse を再起動してみる.
組み込みWeb ブラウザ内のアドレスバーの部分には,Eclipse 内部の Tomcat サーバに対するリクエスト URL が表示されます.
http://localhost:8080/hoge/HelloWorld
のようになっていることを確認しておきます.(「hoge」の部分は,プロジェクト名に読み替えること)
今度は,プロジェクト・エクスプローラを使用して,Servlet プログラムのデバッグを行う.
デバッグモードでのサーバが起動できたことを確認したいときは, サーバー (Servers) ビューの「状況 (Status)」の欄が「デバッグ (Debugging)」になっているかを見る.
このウインドウに「Hello World!」と出れば成功.
ブレークポイントが無いので,普通の「実行」と,デバッグ用の「実行」の違いがありません.
Eclipse のプロジェクト・エクスプローラで,デバッグを行いたいクラスの「クラス名.java 」をダブルクリック (ここでは,HelloWorld.javaをダブルクリック)すると,エディタが開きます.
HelloWorld.java の doGet メソッド内に ブレークポイントを設定します.
エディタで, doGet メソッド内の任意のプログラムコードについて,エディタの左端フレームをダブルクリックするか, エディタの左端フレームで,右クリックして,「Toggle Break Point (ブレークポイントの切り替え)」を選ぶ.
ブレークポイントが設定されると,青色の丸で表示される.
後の練習のため,ブレークポイントは2個以上作っておく
今度は,ブレークポイントを作ったので,プログラムの実行が止まる. 今度は,組み込みWeb ブラウザが開かず,デバッグ用の画面に切り替わります(この画面を「デバッグ・パースペクティブ」と呼びます).
※ なお,普段開いている画面は,「Javaパースペクティブ」です. 「デバッグ・パースペクティブ」と「Javaパースペクティブ」の切り替えは, 「ウインドウ (Window)」→「(Open Perspective) パースペクティブを開く」で(デバッグ中ならいつでも)出来ます.
スレッド [http-8080-processor??] (実行中)のような表示がたくさん並んでいるのがデバッグ・ビューです.
※ もし,デバッグ・ビューが開いていなければ,「ウインドウ (Window)」→「Show View」→「Debug」で,デバッグ・ビューを開く.
デバッグ・ビューがどこにあるのか分からないときも, 「Window」→「Show View」→「Debug」で,デバッグ・ビューが簡単に分かる.
ウインドウの中に「エディタ」があります.「HelloWorld.java」をクリック
エディタに,HelloWorld.java のソースコードが出たはずです. エディタの左端に黄色のマークがあり,現在,この行で,プログラムの実行が中断していることを示します.
デバッグ・ビューの中の任意の場所を 左クリックすると,デバッグ機能が動くようになります. F8(ファンクション8) で,次のブレークポイントまで実行が進むなど,機能を試してみよう.
なお,デバッグ・ビューの中の任意の場所を 右クリックすると,デバッグ機能を選ぶウインドウ開きます.
「ウインドウ (Window)」→「(Open Perspective) パースペクティブを開く」→「Java」
参考Webページ http://www.okisoft.co.jp/esc/eclipse3/eclipse-debug.html
以上で,Eclipse でのデバッグ実行ができるようになりました.
上記では,Eclipse 内部の Tomcat サーバを使っていました.
今度は, Java サーブレット・プログラムを,Eclipse から切り離して,公開 tomcat サーバ上で動く(つまり, 単体で動く)ようにします. そのために,Eclipse のエクスポート (Export) 機能を利用します.
公開 tomcat サーバ上で Java サーブレットを動かすために 「リクエスト URL ← マッピング → サーブレット名 ← マッピング → クラス名」という形式でのマッピングを行うとともに, 所定のディレクトリに Java クラスのファイルなどを置く必要があります.(詳しくは 「Tomcat 上で動く Java サーブレット・プログラム」の Web ページを見てください).
Eclipse でのエクスポート操作を行うと,このマッピング定義と,所定のディレクトリへのファイルの配置が自動で行われます.詳しくは以下の通りです.
Java クラスのファイル,ライブラリファイル,web.xml が置かれるディレクトリは, サーブレット配置サブディレクトリと,Tomcat インストールディレクトリから決まります.
前もって,Tomcat インストールディレクトリを調べておいてください.この Web ページでは次のように書きます.
サーブレット配置サブディレクトリは,自由に決めることができます(プロジェクト名と一致させるなどのルールはありません). Eclipse でのエクスポート時点に,手動で自由に設定することになります. この Web ページでは次のように書きます.
Java クラスのファイル,ライブラリファイル,web.xml が置かれるディレクトリは,次のようになります.
「\hoge\hoge\com」が付いているのは,Java パッケージ名が hoge.hoge.com だからです.
選択ダイアログで,次の操作を行う.
「Web」→「WARファイル」→「次へ」
WARエクスポートダイアログで,次のように指定する.
※ サーブレット配置サブディレクトリが hogename なので,宛先は上記のようになる.
「終了」をクリックするとで,エクスポートが実行される
C:\tomcat55\webapps 下に,拡張子 .war が付いたファイルができます.
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name> hoge2</display-name> <servlet> <description> </description> <display-name> HelloWorld</display-name> <servlet-name>HelloWorld</servlet-name> <servlet-class> hoge.hoge.com.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
次のように設定されていることが読み取れます.
Java のパッケージ名が hoge.hoge.com,クラス名が HelloWorld の場合, 完全修飾形式でのクラス名は,hoge.hoge.com.HelloWorldになります
サーブレット名は,Eclipse が自動的に,クラス名と同じものを付ける.
URL パターンは,Eclipse が自動的に,クラス名と同じものを付ける.
サーブレット配置サブディレクトリ hogename と, サーブレットのURL パターン HelloWorld から,リクエスト URL が http://localhost:8080/hogename/HelloWorld のように決まります.
つまり,リクエスト URL である http://localhost:8080/hogename/HelloWorld と,Java クラスである HelloWorld との間のマッピング定義は,Eclipse が自動的に行っているということが見て取れます. 「マッピング」の意味は, Web ブラウザを使って,この リクエスト URL にアクセスしたとき,HelloWorld クラスの doGet() メソッドが自動的に呼び出されるようになるということです. 「8080」は Tomcat のポート番号です.
※ マッピング定義の中身を理解したい人のための演習は別の Web ページに用意しています.
普通の Web ブラウザで,
http://localhost:8080/hogename/HelloWorld
を開くと,Hello World と表示されます. 「hogename」と書いているのは,先ほどエクスポートするときに付けた 指定した「サーブレット配置サブディレクトリ」のことです(.war ファイルのファイル名にもなっています).
上記の例では,8080 ポートを使い,公開 tomcat サーバと通信しています.
上記では,8080 ポートを使い,公開 tomcat サーバと通信しました. URL の中に,「8080」と書かずに,普通の URL で Java サーブレットを起動できるように するには,Apache のような Web サーバと連携させるのが普通です.
前もって必要なソフトウエア
httpd-proxy.conf は、以下のように設定します。 Order と Allow の行は、「127.0.0.1」からのアクセスだけを許すという設定です。
<Location /<エクスポートするプロジェクト名>/>
ProxyPass ajp://localhost:8009/<エクスポートするプロジェクト名>/
Order allow,deny
Allow from 127.0.0.1
</Location>
conf/extra/httpd-proxy.conf を書き換えたから。
URL は次の通り
(http://localhost/<エクスポートするプロジェクト名>/クラス名) または, (http://localhost/<エクスポートするプロジェクト名>/JSPファイル名.jsp)
Strutsを使っている場合,ページ遷移すると, http://localhost/<プロジェクト名>/アクション名.do のような URL が現れることを確認しておく.(つまり,http://localhost/<プロジェクト名>/アクション名.do と打ち込むことで,一種の単体テストが出来る)
参考Web ページ: http://www.javaroad.jp/opensource/js_eclipse1.htm
参考Web ページ: http://www.stackasterisk.jp/tech/java/wtp02_03.jsp
参考Web ページ: http://www.stackasterisk.jp/tech/java/wtp02_01.jsp