トップ ITインフラ OSとミドルウェア Tomcat

Apache Tomcat

このページでは、Apache Tomcatについての情報を掲載しています。

▲記事トップへ

目次

この記事の目次です。

1. Tomcatとは
2. インストール方法
3. 設定方法
4. プログラミング方法
5. 問題解決の参考

更新履歴

1. Tomcatとは

Tomcatとは、Apache Software Foundationが開発するApache Tomcatというソフトウェアのことを言います。 Webコンテナという機能を実装したオープンソースのソフトウェアです。

Tomcatは、Webコンテナを内包しているので、単独でWebサーバとして動作することも可能です。 一般的なWebアプリケーションでは、Apache HTTP ServerやNginx、IISなどのWebサーバソフトウェアと連携して、JSP、サーブレットなどの動的な処理の部分を担うことが多いです。

2. インストール方法

Tomcatのインストール方法についてまとめています。

Linux

Linux環境でのTomcatのインストール方法です。

Tomcatのインストール手順

Tomcatのインストール手順を掲載しています。 環境はLinux(CentOS)になります。 インストールして起動できない場合の解決方法などもまとめています。

詳細

3. 設定方法

Tomcatの設定方法についてまとめています。

コンテキストパスの設定

このページでは、コンテキストパスの設定-Tomcatの設定について記述しています。

詳細

Contextタグの属性

このページでは、Contextタグの属性-Tomcatの設定について記述しています。

詳細

Eclipseとの連携

このページでは、EclipseでTomcatの起動停止が行えるようにする設定方法について説明しております。

詳細

Apache/Tomcatのajp連携

Apache(Apache HTTP Server)とTomcat(Apache Tomcat)を連携する場合、Apache Jserv Protocol、略してajpというプロトコルが利用できます。 Ajpというプロトコル、httpdのmod_proxy_ajp、ajpを使用したApacheとTomcatを連携させる設定方法についてまとめました。

詳細

エラーページの設定方法

Tomcatの独自エラーページの設定方法についてまとめています。

詳細

4. プログラミング方法

Tomcatで公開するWebアプリケーションのプログラミング方法についてまとめています。

簡単なServlet

Tomcat上で動作する簡単なServletの作成方法について紹介しています。

詳細

簡単なJSPをTomcat上で実行させる方法

簡単なJSPをTomcat上で実行させる方法です。サンプルコード、Tomcatの設定、デプロイなど動作させるまでの手順をまとめています。

詳細

ServletでHTTPリクエスト情報取得する方法

サーブレットでHTTPリクエスト情報(ホスト情報や参照ページ)を参照する例になります。 サンプルコード、Tomcatの設定、デプロイなど動作させるまでの手順をまとめています。

詳細

ServletでGETパラメータを取得する方法(日本語対応)

ServletでGETパラメータを取得する方法(日本語対応)です。 サンプルコード、Tomcatの設定、デプロイなど動作させるまでの手順をまとめています。

詳細

Servletでsessionを利用する方法

Servletでsessionを利用する方法です。サンプルコード、Tomcatの設定、デプロイなど動作させるまでの手順をまとめています。

詳細

Servlet/JSP連携パターン-fowardとパラメータ渡し

リクエスト受付処理をサーブレットで行い、ブラウザの表示処理をJSPで行う例です。 サーブレットからJSPへ転送する際にfowardを使用しています。

動作確認した環境

アプリの構成

□tomcatホームディレクトリ
├□conf
|└□Catalina
|  └□localhost
|    └◆test.xml
└□webapps
  └□test
    └□WEB-INF
      ├□jsp
      |└◆HelloWorld.jsp
      ├□classes
      |└◆HelloWorld.class
      └◆web.xml

コンテキスト指定(test.xml)

<Context path="/test"
         docBase="<tomcatホームディレクトリ>/webapps/test"
         reloadable="true">
</Context>

Servlet(HelloWorld.java)

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

public class HelloWorld extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest reqest, HttpServletResponse response)
                         throws IOException, ServletException {
        // requestにデータnameを登録
        request.setAttribute("name", "World");
        // ServletContextオブジェクトを取得
        ServletContext context = getServletContext();
        // RequestDispatcherオブジェクトを取得
        RequestDispatcher dispatcher
            = context.getRequestDispatcher("/WEB-INF/jsp/HelloWorld.jsp");
        // forwardメソッドで転送
        rd.forward(request, response);
    }
}

JSP(HelloWorld.jsp)

<html>
<head>
<title>sample</title>
</head>
<body>
Hello <%= request.getAttribute("name") %> !!
</body>
</html>

コンパイル

java -classpath <tomcatホーム>/lib/servlet-api.jar:. HelloWorld.java

配備記述子(web.xml)

<?xml version="1.0" encoding="UTF-8" ?>

<web-app 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"
         version="2.4">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

動作確認

ブラウザより、「http://<tomcatサーバのホスト>:8080/test/hello」へアクセス。 「Hello World!! 」と表示されます。

Tomcat上のWebアプリと連携する簡単なAjaxアプリケーション

以下はTomcat上のWebアプリと連携する簡単なAjaxアプリケーションのサンプルコードです。

動作確認した環境

アプリの構成

□tomcatホームディレクトリ
├□conf
|└◆server.xml
└□webapps
  └□test
    ├◆index.html
    └□WEB-INF
      ├□classes
      |└◆SampleServlet.class
      └◆web.xml

方針として、文字コードはUTF-8を使用します。 html、JSP、Servlet全部UTF-8に統一します。 apacheと連携する場合、「AddDefaultCharset UTF-8」を指定します。

サーバ設定&コンテキスト指定(server.xml)

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">

  <!--: 省略-->

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8" />

    <Connector port="8009"
               protocol="AJP/1.3"
               redirectPort="8443"
               URIEncoding="UTF-8" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="false"
            xmlValidation="false" xmlNamespaceAware="false">
        <Context path="/test"
                 docBase="<tomcatホームディレクトリ>/webapps/test"
                 reloadable="true">
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>

html(index.html)

<html>
<head>
<meta http-equiv="content-type"
                        content="text/html; charset=UTF-8">
<script type="text/javascript">
var xmlhttp;
/* ボタンのonclick属性に登録する関数 */
function onButtonClick() {
    // IE版のXMLHttpRequestオブジェクトを生成する。
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    // イベント発生(データ受信)時の処理を登録する。
    xmlhttp.onreadystatechange = httpHandler;
    // リクエスト先のURLや送信するデータを設定する。
    xmlhttp.open("POST", "/test/sample");
    // サーバ側に要求を送る。
    xmlhttp.send(null);
}
/* XMLHttpRequestのonreadystatechangeに登録する関数 */
function httpHandler() {
    // サーバ側の応答内容をidがaのタグに設定する。
    document.getElementById("a").innerHTML=xmlhttp.responseText;
}
</script>
</head>
<body>
<p id="a">ここに文字列が出力します。</p>
<input type="button" value="ボタン" onclick="onButtonClick()"/>
</body>
</html>

Servlet(SampleServlet.java)

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SampleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        res.setContentType("text/plain; charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println("Hello World!!");
    }
}

コンパイル

java -classpath <tomcatホーム>/lib/servlet-api.jar:. SampleServlet.java User.java

配備記述子(web.xml)

<?xml version="1.0" encoding="UTF-8" ?>

<web-app 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"
         version="2.4">
    <servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>SampleServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <url-pattern>/sample</url-pattern>
    </servlet-mapping>
</web-app>

動作確認

ブラウザより、「http://<tomcatサーバのホスト>:8080/test/index.html」へアクセス。 「ボタン」を押すと「Hello World!! 」と表示されます。

Tomcatで公開するRESTFulなWebアプリケーションの作成方法

以下はRESTEasyというフレームワークを使用したTomcatで公開するRESTFulなWebアプリケーションの作成方法とサンプルコードをまとめています。

RESTEasyとは

RESTEasy(れすといーじー)は、 JAX-RSを実装したオープンソースのJavaのフレームワークです。 RESTfulなWebサービス、RESTfulなJavaアプリケーション構築用のフレームワークです。

RESTfulについて(RESTfulの意味は?RESTfulとは?)

RESTfulは、RESTっぽいという意味です。つまりRESTという設計様式に近いor思想を継承した設計様式のことを言います。

RESTは、2000年にRoy Fielding氏が提唱した複数のシステムを連携させる分散アーキテクチャの一つのことですが、 RESTははかなり広い意味で定義されているので、ステートレスやリソース、URI、ハイパーメディアの使用など、 いくつかのRESTの原則を取り入れたものをRESTfulと言います。

RESTEasyの使い方

RESTEasyのHello World(簡単なアプリケーションのサンプルコード)を見ながら解説して言います。

動作環境

以下の媒体・環境で動作確認をおこないました。

アプリの構成

<tomcatホームディレクトリ>/webappsの下に以下の構成を作成します。

□Tomcatホーム/webapps/
├─conf
│      server.xml
└─webapps
    └─SampleRESTEasy
        └─WEB-INF
            │  web.xml
            ├─classes
            │  └─sample
            │         Sample.class
            └─lib
                    javassist-3.8.0.GA.jar
                    jaxrs-api-3.0.6.Final.jar
                    resteasy-jaxrs-3.0.6.Final.jar
                    scannotation-1.0.3.jar
関連ライブラリ(lib下に置くjarファイル)

今回はログ関連など省略して、ブラウザに「Hello World!!」と表示するのに必要な最小限のjarファイルを配置してみました。

本サンプルでは、http://sourceforge.net/projects/resteasy/files/Resteasy%20JAX-RS/より、 resteasy-jaxrs-3.0.6.Final-all.zipをダウンロード・解凍してlibフォルダにある以下のjarファイルを<Tomcatホーム>\webapps\SampleStruts\WEB-INF\libに配置ています。

Javaのソースコード

以下はJavaのソースコードです。

Javaクラス(Sample.java)
package sample;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("/")
public class Sample {

    @GET
    @Path("message")
    @Produces("text/plain")
    public String getMessage(
            @QueryParam("hello") String hello,
            @QueryParam("world") String world) {
        return hello + " " + world + "!!";
    }
}
アプリケーションの配備記述子(web.xml)
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>RESTEasy Sample</display-name>

<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>

<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>

<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

</web-app>
Tomcatの設定ファイル(server.xml)
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
                     :
                  <省略>
                     :
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
                     :
                  <省略>
                     :
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
                     :
                  <省略>
                     :
        <Context path="/SampleRESTEasy" reloadable="true" />
                     :
                  <省略>
                     :
      </Host>
    </Engine>
  </Service>
</Server>
動作確認

Tomcatを起動し、ブラウザアドレスバーに「http://localhost:8080/SampleRESTEasy/message?hello=Hello&world=World」 と入力してリクエストすると「Hello World!!」が表示されます。

Tomcatの比較的高度な機能の設定とサンプルコード

以下はTomcatの比較的高度な機能の設定とサンプルコードをまとめています。

Tomcatでデータソース(コネクションプール)の利用してMySQLに接続する方法

Tomcatでは、データソース(コネクションプールなどの機能を提供する技術)が利用できます。 ここでは、server.xmlに指定して、Tomcatでデータソースの利用してMySQLに接続する方法を紹介します。

JDBCの入手
  1. http://dev.mysql.com/downloads/connector/j/より、アーカイブ(mysql-connector-java-X.X.XX.tar.gz)をダウンロードします。
  2. アーカイブ(mysql-connector-java-X.X.XX.tar.gz)を解凍します。
JDBCとは

JDBCは、Java Database Connectivityの略で、Javaからリレーショナル・データベースに接続するためのインタフェースを提供するJava標準APIです。

詳細

サンプルの構成

Tomcatを停止し、以下の配置構成をつくります。

□<Tomcatホーム>
├□conf
|└◆server.xml
├□conf
|└◆mysql-connector-java-X.X.XX-bin.jar
└□webapps
  └□dataSorceSample
    └□WEB-INF
      ├□classes
      |└□dataSourceSample
      |  └◆Test.class
      └◆web.xml
コンテキスト指定(server.xml)
<?xml version='1.0' encoding='utf-8'?>
<Server …>
  <Service …>
    <Engine …>
      <Host …>

        <Context path="<コンテキストパス:dataSorceSample>"
          docBase="<アプリ場所:Tomcatホーム/webapps/dataSorceSample"
          reloadable="true" />
          <Resource name="mysql" auth="Container"
            type="javax.sql.DataSource"
            username="<DBユーザ>" password="<DBのパスワード>"
            driverClassName="com.mysql.jdbc.Driver"
            url="<URL:例)jdbc:mysql://localhost:3306/test?<※>" />
            <!-- ※useUnicode=true&amp;characterEncoding=utf8など -->
        </Context>

      </Host>
    </Engine>
  </Service>
</Server>
Servlet(Test.java)
package dataSourceSample;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req,HttpServletResponse res)
                    throws ServletException {
        res.setContentType("text/html");
        try {
            ArrayList<String> dataList = getDataList();
            outHtml(res, dataList);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
    private ArrayList<String> getDataList()
                throws NamingException, SQLException {

        // 太字がDataSourceを使用して、MySQLとのコネクションを取得部分
        InitialContext ctx = new InitialContext();
        // java:comp/env/ + Resourceタグに設定したmysqlでデータソースを探す
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/mysql");
        Connection con = ds.getConnection();

        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("select * from sample");
        ArrayList<String> dataList = new ArrayList<String>();
        while (rs.next()) {
            dataList.add(rs.getString("name"));
        }
        return dataList;
    }
    private void outHtml(HttpServletResponse res,ArrayList<String> dataList)
                    throws IOException {
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Test</title>");
        out.println("</head>");
        out.println("<body>");
        for (String data: dataList) {
            out.println(data + "<br />");
        }
        out.println("</body>");
        out.println("</html>");
    }
}
コンパイル

java -classpath Tomcatホーム/lib/servlet-api.jar ./dataSourceSample/Test.java

配備記述子(web.xml)
<?xml version="1.0" encoding="UTF-8" ?>

<web-app 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"
         version="2.4">
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>dataSourceSample.Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>
DB作成とデータ挿入(creat_and_insert.txt)
#testデータベース作成。
create database test;
# sampleテーブル作成。
use test;
create table sample(mid CHAR(5) PRIMARY KEY, name VARCHAR(20));
# データ挿入。
insert into sample values ('00001', 'test1');
insert into sample values ('00002', 'test2');
動作確認

MySQLにDB作成とデータ挿入(creat_and_insert.txt)を流します。

mysql -u <DBユーザ> -p<パスワード> < <置き場所>/creat_and_insert.txt

tomcat起動。

<Tomcatホーム>/bin/startup.sh

ブラウザより、「http://<Tomcatのホスト>/dataSourceSample/test」へアクセス。
test1
test2
と表示されればOKです。

5. 問題解決の参考

Tomcat関連の問題解決の参考です。

不可解な警告ログの解決:Tomcat起動時に「Setting property 'debug'…」

たまに現場で見かけるTomcat起動時の不可解な警告ログ「Setting property 'debug'…」、その原因を見つけました!

詳細

更新履歴

この記事の更新履歴です。

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Eclipse /Fiddler /gcc /gdb /Git /g++ /JDK /JMeter /JUnit /Teraterm /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
bootstrap /jQuery /FuelPHP /Lucene /MyBatis /Seasar2 /Spring /Struts /WordPress

Web API
Google Maps

ITインフラOSとミドルウェア
Linux /Windows /シェル
ActiveMQ /Tomcat /MySQL /Nagios /Redis /Solr

ITインフラサーバー
公開Webサーバー

ITインフラネットワーク
プログラミング /構築

ITインフラセキュリティ
公開サーバーのセキュリティ

PC製品
ZOTAC

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系

スポンサーリンク

関連サイト内検索ツール

zealseedsおよび関連サイト内のページが検索できます。

IPアドレス確認ツール

あなたのグローバルIPアドレスは以下です。

54.227.97.219

HTMLの表示色確認ツール

パスワード生成ツール

文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。

ここに生成されます。

スポンサーリンク