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 サーブレットの動作テストなどに使う.
公開 tomcat サーバは Eclipse と独立した tomcat サーバです(Windows の場合は、例えばC:\tomcat60\bin\tomcat6w.exe 等で起動する Tomcat サーバのこと).当然, 公開 tomcat サーバが管理するディレクトリも Eclipse とは独立している.
C:\Program Files\Java\jdk1.6.0_26 のようなディレクトリがあれば,インストール済み.
前もって,Tomcat のバージョンと、Tomcat インストールディレクトリを調べておいてください.
ここでは,Eclipse で,新規サーバの定義を行う. その後,定義がうまくいったかを確認するために, Eclipse 内部の tomcat サーバの起動と停止を行ってみる.
■ Ubuntu の場合の実行例
※ サーバービューが表示されないときは,Eclipse で 「ウィンドウ (Window)」→「パースペクティブを開く」→「その他 (Other)」→「Java)」 と操作した後,上記の操作をもう1度やり直すとうまくいくことがある.
サーバー (Servers) ビュー内の任意の場所で,右クリックし,「新規 (New)」→「サーバー (Server)」と操作する
新規サーバ定義ウインドウが表示されるので, Apacheを展開し、Tomcat サーバーを選ぶ
※ 下の実行例では、「Tomcat v7.0 サーバー (Tomcat v7.0 Server)」)を選択して,「次へ (Next)」をクリックしている. (インストールした Tomcat と同じバージョンのものを選ぶべき)
次のウインドウでは,「Tomcat インストール・ディレクトリー」を設定し,「終了」をクリック.
■ Ubuntu の場合の実行例
Ubuntu で「Eclipse での新規サーバの作成」ができないときのヒント
cd /var/lib/tomcat7/conf sudo ln -s policy.d/03catalina.policy catalina.policy chmod 644 tomcat-users.xml
これで,Eclipse 内部の tomcat サーバについて,起動,停止,再起動,デバックモードでの起動を行うためのボタンなどが, サーバー (Servers) ビューの上端に表示されるようになる.
後で説明するように,Eclipse 内部の Tomcat サーバの起動と停止は自動で行われるのですが, 新規サーバの定義が正しくできたかの確認のために, 起動と停止を手動で行ってみる.
これで起動される tomcat サーバは,Eclipse 内部の Tomcat サーバです.公開 tomcat サーバ (例えば Windows の場合は C:\tomcat60\bin\tomcat6w.exe) とは別ものです.
【Eclipse 内部の Tomcat サーバがうまく起動できないときのヒント】
分かる限りでヒントを書いておきます.
◆ Ubuntu の場合の対処例
「sudo /usr/sbin/service tomcat7 stop」などを実行して 公開 Tomcat サーバを停止させて下さい.
◆ Windows の場合の対処例
C:\tomcat60\bin\tomcat6w.exe などを使って, 公開 Tomcat サーバを停止させて下さい.
【公開 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 ポートで通信することはできないようになっている場合には,次のことが考えられます.検討してください.
セキュリティ上の理由で,このように設定されていることはよくある.
自動で引き継がれるので仕方が無い
対処法ですが,再インストールが一番簡単のようです.
という手順になりそうです.
以下,Eclipse を使う. プロジェクトの作成,クラスの定義と実行という一連の操作を,図解で説明する.
Java サーブレット・プログラムを動かすために,Eclipse のプロジェクト等を作る. このページでは,Eclipse のプロジェクト名,Java パッケージ名,Java サーブレットのクラス名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).
このページでは,Java サーブレットのクラスを1つ作る.
下記の手順で,動的 Web プロジェクトを新規に作成する.
「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作する.
「ファイル」→「新規 (New)」→「プロジェクト (Project)」
または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」
新規プロジェクトのウインドウが開くので, 「Web」を展開する.
展開した「Web」の下にある 「動的 Webプロジェクト (Dynamic Web Project)」を選び, 「次へ」をクリック.
設定用のウインドウが開くので,下記の設定を行う. 設定が終わったら,「次へ」をクリック.
プロジェクト名は,好きな名前でよいが,スペースや全角文字は避けること. ここでは,プロジェクト名を,「hoge」と付けることにする.
「デフォルト・ロケーションの使用 (Use default)」にチェックを入れたままで良い.
他のもの(例えば「なし」)になっていたら,「Apache Tomcat v7.0」に変更しておく
※ 変更のとき,「なし」だけしか無くて,「Apache Tomcat v7.0」が候補として表示されない場合は, このページの上の方に書いている「新規サーバの定義」の手順を行う
「次へ」をクリック.
※ このウインドウが開かないことがある.気にしなくてよい.
「次へ」をクリック.
「完了」をクリック.
※ このウインドウが開かないことがある.気にしなくてよい.
Eclipse のプロジェクト・エクスプローラを使って, Java パッケージを作成します. Java パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. このページでは,作成する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」になっていなければ修正すること.
「次へ」をクリックします.
「完了」をクリックします.
参考: Eclipse インストールと基本操作のWebページ
プロジェクト・エクスプローラで, プロジェクト名 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=utf-8"); 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();
クラス定義は次のようになります
package hoge.hoge.com; import java.io.IOException; import java.io.PrintWriter; 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.setContentType("text/html; charset=utf-8"); 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(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
※同じ方針で,例えば,リレーショナルデータベースの中身を取り出して Web ページを作ることも簡単にできる.
「ファイル」→「保管」または CTRL+S で保存される. 保存時にコンパイルされる
コンパイル時のエラーや警告があれば, Eclipse 内の問題・ビューに表示されるので確認する.
Eclipse のプロジェクト・エクスプローラを使用して,上記で作ったJava サーブレットのプログラム をテスト実行してみる.
Eclipse のプロジェクト・エクスプローラで,実行したいクラス名.java (つまり HelloWorld.java) を右クリック
ウインドウが開くので, 「ローカルホストの Tomcat v7.0 サーバ」が選択されていることを確認の後,「次へ (Next)」をクリック.
「完了」をクリック.
再起動する.
「公開 Tomcat サーバを稼働させている」ときは, Eclipse 内部の Tomcat サーバが起動しない(ポートを奪い合うので)ので, 公開 Tomcat サーバを停止させて下さい.
コンソール・ビューに表示される.
Web ブラウザが開き,そこに実行結果が出る. 「Hello Java World!」と出れば成功.
実行で,エラーが出る場合,
Eclipse 内部の Tomcat サーバを停止して、もう1度起動してみる。(これは、プログラムを Tomcat に読み込ませるため)。
それでもうまく動かない場合は,Eclipse を再起動してみる.
Web ブラウザ内のアドレスバーの部分には,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」
以上で,Eclipse でのデバッグ実行ができるようになりました.
上記では,Eclipse 内部の Tomcat サーバを使っていました.
今度は, Java サーブレット・プログラムを,Eclipse から切り離して,公開 tomcat サーバ上で動く(つまり, 単体で動く)ようにします. そのために,Eclipse のエクスポート (Export) 機能を利用します.
公開 tomcat サーバ上で Java サーブレットを動かすために 「リクエスト URL ← マッピング → サーブレット名 ← マッピング → クラス名」という形式でのマッピングを行うとともに, 所定のディレクトリに Java クラスのファイルなどを置く必要がある.(詳しくは 「Tomcat 上で動く Java サーブレット・プログラム」の Web ページを見てください).
Eclipse でのエクスポート操作を行うと,このマッピング定義と,所定のディレクトリへのファイルの配置が自動で行われます.詳しくは以下の通りです.
Java クラスのファイル,ライブラリファイル,web.xml が置かれるディレクトリは, サーブレット配置サブディレクトリと,Tomcat インストールディレクトリから決まります.
前もって,Tomcat インストールディレクトリを調べておいてください.
このページでは次のように書く.
サーブレット配置サブディレクトリは,自由に決めることができる(プロジェクト名と一致させるなどのルールはありません). Eclipse でのエクスポート時点に,手動で自由に設定することになる. このページでは次のように書く.
Java クラスのファイル,ライブラリファイル,web.xml が置かれるディレクトリは,次のようになる.
「/hoge/hoge/com」が付いているのは,Java パッケージ名が hoge.hoge.com だからです.
WARエクスポートダイアログで,次のように指定する.
※ サーブレット配置サブディレクトリが hogename なので,宛先は上記のようになる.
「完了」をクリックすると,エクスポートが実行される
/var/lib/tomcat7/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 ページに用意している.
公開 Tomcat サーバを起動した後に, 普通の 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 (現在は存在しない)