Tomcat 上で動く Java サーブレット・プログラム
Apache Tomcat とは(以下,Apache Tomcat のことを「Tomcat」と書く), Java サーブレット(Java Servlet)と Java サーバ・ページ (JavaServer Page; JSP) が動くための土台となるソフトウェアです.
このページでは,Tomcat 上で動く Java サーブレット・プログラムの 見本を使って,Tomcat の使い方を説明する. Tomcat では,ディレクトリ構造の流儀がありますので,あえて Eclipse を使わないで,練習しておきます.
前準備
Tomcat のインストール を終えていること。Tomcat 付属のサンプルプログラム servlets-examples のディレクトリ構造
ファイル構成を把握しておく
Tomcat バージョン 6.0 の場合
- ファイルが置かれているディレクトリ
- Windows の場合: C:\tomcat60\webapps\examples
- Ubuntu の場合: /usr/share/tomcat6-examples/examples (場合によって変わる)
ここに html ファイルがある. WEB-INFの下には,web.xml ファイルや,classes ディレクトリがある.
- classes: プログラムファイル
- web.xml: このディレクトリの設定を書いたファイル
- lib: 必要なライブラリをここに置く.
* Ubuntu の場合の例
- URL
http://localhost:8080/examples
この URL がファイルにマッピングされている(Windows の場合には C:\tomcat60\webapps\examples にマッピングされている)。
- Hello World などの「Execute」, 「Source」をクリックしてみる.
Hello World は
- ソース(HTMLファイル): http://localhost:8080/examples/servlets/helloworld.html
- Servlet のリクエストURL: http://localhost:8080/examples/servlets/servlet/HelloWorldExample
これは, WEB-INF\classes\HelloWorldExample.classes にマッピングされている。
- ソース(HTMLファイル): http://localhost:8080/examples/servlets/helloworld.html
Tomcat バージョン5.5 の場合
- ファイルが置かれているディレクトリ
- Windows の場合: C:\tomcat55\webapps\servlets-examples
- Linux の場合: /usr/local/tomcat55/webapps/servlets-examples (場合によって)違う
ここに html ファイルがある. WEB-INFの下には,web.xml ファイルや,classes ディレクトリがある.
- classes: プログラムファイル
- web.xml: このディレクトリの設定を書いたファイル
- lib: 必要なライブラリをここに置く.
- URL
http://localhost:8080/servlets-examples
この URL がファイルにマッピングされている(Windows の場合には C:\tomcat55\servlets-examples にマッピングされている)。
- Hello World などの「Execute」, 「Source」をクリックしてみる.
Hello World は
- ソース(HTMLファイル): http://localhost:8080/servlets-examples/helloworld.html
- Servlet のリクエストURL: http://localhost:8080/servlets-examples/servlet/HelloWorldExample
これは, C:\tomcat55\webapps\servlets-examples\WEB-INF\classes\HelloWorldExample.classes にマッピングされている。
- ソース(HTMLファイル): http://localhost:8080/servlets-examples/helloworld.html
簡単な Java サーブレット・プログラムの見本
Java サーブレットプログラムを作成し,動作させる手順を説明する.
Java プログラムの配置,クラス名,リクエスト URL など
Java サーブレットを動かすために 「リクエスト URL ← マッピング → サーブレット名 ← マッピング → クラス名」という形式でマッピングを行う. このマッピングを定義するファイル (web.xml) と,Java クラスのファイルは,所定の場所におく必要がある. このページでは,次のように書く.
- Java パッケージ名: hoge.hoge.com
- Java サーブレットのクラス名(完全修飾形式): hoge.hoge.com.HelloWorld
このページでは,Java サーブレットのクラスを1つ作る.
Java パッケージ名がhoge.hoge.com,クラス名がHelloWorld の場合, 完全修飾形式でのクラス名は,hoge.hoge.com.HelloWorldになる.
- サーブレット配置サブディレクトリ: hogeapp
リクエスト URL の一部分になるので,分かりやすい名前が良いでしょう. サーブレット配置サブディレクトリによって,プログラムファイル,ライブラリファイル,web.xml が置かれるディレクトリが次のように決まります.
- プログラムファイルが置かれるディレクトリ: WEB-INF/classes/hoge/hoge/com
「/hoge/hoge/com」が付いているのは,Java パッケージ名が hoge.hoge.com だからです.
- ライブラリファイルが置かれるディレクトリ: hogeapp/WEB-INF/lib
- web.xml が置かれるディレクトリ: hogeapp/WEB-INF
* 上記に書いたように,Tomcat インストールディレクトリ (例えば/var/lib/tomcat6 や C:\tomcat60) の下の サーブレット配置サブディレクトリ hogeapp の下になる.
- プログラムファイルが置かれるディレクトリ: WEB-INF/classes/hoge/hoge/com
- サーブレット名 : hoge
サーブレット名は,クラス名と別ものです.自由に名前を付けていいです.
- URL パターン : Welcome
URL パターンは.自由に名前を付けていいです.リクエスト URL の一部分になるので,分かりやすい名前が良いでしょう.
サーブレット配置サブディレクトリ hogeapp と, サーブレットのURL パターン Welcome から,リクエスト URL が http://localhost:8080/hogeapp/Welcome のように決まります.
ディレクトリの確認
Tomcat インストールディレクトリの確認
以下,「/var/lib/tomcat6」のように書く.適切に読み替えてください。
サーブレットの作成手順
- ディレクトリの作成
プログラムファイル,ライブラリファイル,web.xml が置かれるディレクトリの作成
- /var/lib/tomcat6/webapps/hogeapp デイレクトリを作成
sudo mkdir /var/lib/tomcat6/webapps/hogeapp
- /var/lib/tomcat6/webapps/hogeapp ディレクトリの下に WEB-INF ディレクトリを作る.
sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF
- WEB-INF ディレクトリの下に lib ディレクトリと classes/hoge/hoge/com ディレクトリを作る
- プログラムファイルが置かれるディレクトリ: /var/lib/tomcat6/hogeapp/WEB-INF/classes/hoge/hoge/com
- ライブラリファイルが置かれるディレクトリ: /var/lib/tomcat6/hogeapp/WEB-INF/lib
sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF/lib sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge/hoge sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge/hoge/com
- /var/lib/tomcat6/webapps/hogeapp デイレクトリを作成
- HelloWorld.java の作成
/var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge/hoge/com ディレクトリの下に, HelloWorld.java を以下のように作る
【要点】
- HttpServlet のサブクラスになる
- doGet() メソッドの中で,HTML を動的に生成する
package hoge.hoge.com; import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet{ public HelloWorld() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 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(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // to be filled ( if necessary ) } }
- コンパイル
次の手順でコンパイルする.
cd /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge/hoge/com javac HelloWorld.java
コンパイル時に,エラーメッセージが出ないことを確認.
* 「HelloWorld.java:6: パッケージ java.servlet は存在しません」というようなエラーメッセージが出る場合,
◆ Ubuntu の場合
環境変数 CLASSPATH が
/usr/share/tomcat6/lib/servlet-api.jar:/usr/share/tomcat6/lib/servlet-api.jar
を含んでいることを確認する。 (Ubuntu の場合の設定例)
◆ Windows の場合
環境変数 CLASSPATH が
C:\tomcat60\lib\servlet-api.jar;C:\tomcat60\lib\servlet-api.jar
を含んでいることを確認する。 (Ubuntu の場合の設定例)
マッピング定義
マッピングの指定は、web.xml に書く。 そのために、 /var/lib/tomcat6/webapps/hogeapp/WEB-INF/web.xml を作る
クラス名を指定する部分は,完全修飾クラス形式で指定することに注意してください. web.xml 内に書く完全修飾クラス名は,hoge.hoge.com.HelloWorld のようになる
<?xml version="1.0" encoding="UTF-8"?>
<!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 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></display-name>
<servlet>
<description></description>
<display-name></display-name>
<servlet-name>hoge</servlet-name>
<servlet-class>hoge.hoge.com.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hoge</servlet-name>
<url-pattern>/Welcome</url-pattern>
</servlet-mapping>
</web-app>

これで,Servlet のリクエスト URL である http://localhost:8080/hogeapp/Welcome と,Java のサーブレット /var/lib/tomcat6/webapps/hogeapp/WEB-INF/classes/hoge/hoge/com/HelloWorld.classes の間のマッピングが定義されたことになる.