M
Apache Tomcat とは(以下,Apache Tomcat のことを「Tomcat」と書く), Java サーブレット(Java Servlet)と Java サーバ・ページ (JavaServer Page; JSP) が動くための土台となるソフトウェアです.
このページでは,Tomcat 上で動く Java サーブレット・プログラムの 見本を使って,Tomcat の使い方を説明する. Tomcat では,ディレクトリ構造の流儀がありますので,あえて Eclipse を使わないで,練習しておきます.
ファイル構成を把握しておく
ここに html ファイルがある. WEB-INFの下には,web.xml ファイルや,classes ディレクトリがある.
■ Ubuntu の場合の例
http://localhost:8080/examples
この URL がファイルにマッピングされている(Windows の場合には C:\tomcat60\webapps\examples にマッピングされている)。
Hello World は
これは, WEB-INF\classes\HelloWorldExample.classes にマッピングされている。
ここに html ファイルがある. WEB-INFの下には,web.xml ファイルや,classes ディレクトリがある.
http://localhost:8080/servlets-examples
この URL がファイルにマッピングされている(Windows の場合には C:\tomcat55\servlets-examples にマッピングされている)。
Hello World は
これは, C:\tomcat55\webapps\servlets-examples\WEB-INF\classes\HelloWorldExample.classes にマッピングされている。
Java サーブレットプログラムを作成し,動作させる手順を説明する.
Java サーブレットを動かすために 「リクエスト URL ← マッピング → サーブレット名 ← マッピング → クラス名」という形式でマッピングを行う. このマッピングを定義するファイル (web.xml) と,Java クラスのファイルは,所定の場所におく必要がある. このページでは,次のように書く.
このページでは,Java サーブレットのクラスを1つ作る.
Java パッケージ名がhoge.hoge.com,クラス名がHelloWorld の場合, 完全修飾形式でのクラス名は,hoge.hoge.com.HelloWorldになる.
リクエスト URL の一部分になるので,分かりやすい名前が良いでしょう. サーブレット配置サブディレクトリによって,プログラムファイル,ライブラリファイル,web.xml が置かれるディレクトリが次のように決まります.
「/hoge/hoge/com」が付いているのは,Java パッケージ名が hoge.hoge.com だからです.
※ 上記に書いたように,Tomcat インストールディレクトリ (例えば/var/lib/tomcat6 や C:\tomcat60) の下の サーブレット配置サブディレクトリ hogeapp の下になる.
サーブレット名は,クラス名と別ものです.自由に名前を付けていいです.
URL パターンは.自由に名前を付けていいです.リクエスト URL の一部分になるので,分かりやすい名前が良いでしょう.
サーブレット配置サブディレクトリ hogeapp と, サーブレットのURL パターン Welcome から,リクエスト URL が http://localhost:8080/hogeapp/Welcome のように決まります.
Tomcat インストールディレクトリの確認
以下,「/var/lib/tomcat6」のように書く.適切に読み替えてください。
プログラムファイル,ライブラリファイル,web.xml が置かれるディレクトリの作成
sudo mkdir /var/lib/tomcat6/webapps/hogeapp
sudo mkdir /var/lib/tomcat6/webapps/hogeapp/WEB-INF
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/WEB-INF/classes/hoge/hoge/com ディレクトリの下に, HelloWorld.java を以下のように作る
【要点】
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 の間のマッピングが定義されたことになる.