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

Apache Tomcat

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

▲記事トップへ

目次

この記事の目次です。

1. Tomcatとは

2. Tomcatのインストール方法

3. Tomcatの設定方法

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

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

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

7. Tomcat関連の問題解決の参考

更新履歴

1. Tomcatとは

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

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

2. Tomcatのインストール方法

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

Linux

Tomcatのインストール手順

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

詳細

3. Tomcatの設定方法

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

Apache/Tomcatのajp連携

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

詳細

Tomcatのエラーページの設定方法

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

webapps/app/error配下に以下のファイルを配置します。 ※appは任意のアプリ

wabapps/app/WEB-INF/web.xmlの<web-app></web-app>タグの中に以下を追加。

  <error-page>
    <error-code>401</error-code>
    <location>/error/401.html</location>
  </error-page>

  <error-page>
    <error-code>403</error-code>
    <location>/error/403.html</location>
  </error-page>

  <error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
  </error-page>

  <error-page>
    <error-code>500</error-code>
    <location>/error/500.html</location>
  </error-page>

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

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

Servlet

JSP

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

簡単なJSPをTomcat上で実行させるサンプルコードです。

動作確認した環境
アプリの構成
□Tomcatホームディレクトリ
├□conf
|└□Catalina
|  └□localhost
|    └◆test.xml
└□webapps
  └□test
    └◆sample.jsp
コンテキスト指定(test.xml)
<Context path="/test"
         docBase="<tomcatホームディレクトリ>/webapps/test"
         reloadable="true">
</Context>
JSP(sample.jsp)
<html>
<head>
<title>sample</title>
</head>
<body>
1 + 1 = <%= 1 + 1 %>
</body>
</html>
動作確認

ブラウザより、「http://<tomcatサーバのホスト>:8080/test/sample.jsp」へアクセス。 「1 + 1 = 2」と表示されます。

JSP/サーブレットのサンプルコード

上記記事以外のJSP/サーブレットのサンプルコードです。

HTTPリクエスト情報取得-tomcat上のWebアプリ作成

サーブレットでHTTPリクエスト情報を参照する例です。 HttpServletRequestのgetRequestURLメソッドやgetHeaderメソッドを使用して、ホスト情報や参照ページを参照する例になります。

動作確認した環境
アプリの構成
□tomcatホームディレクトリ
├□conf
|└◆server.xml
└□webapps
  └□test
    └□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>
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 doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        String bodyText = mkBodyText(req);
        outHtml(res, bodyText);
    }

    private String mkBodyText(HttpServletRequest req) {
        StringBuilder bodyText = new StringBuilder();
        bodyText.append("<ul>")
                .append("<li>閲覧ページ:")
                .append(req.getRequestURL()).append("</li>")
                .append("<li>ホスト名:")
                .append(req.getHeader("Host")).append("</li>")
                .append("<li>リンクページ:")
                .append(req.getHeader("Referer")).append("</li>")
                .append("</ul>");
        return bodyText.toString();
    }

    private void outHtml(HttpServletResponse res, String bodyText)
            throws IOException {
        res.setContentType("text/html; charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println(bodyText);
        out.println("</body>");
        out.println("</html>");
    }
}
コンパイル

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/sample」へアクセス。 以下のように表示されます。

※「リンクページ:null」なのはリンクページを作成していないためです。

フォームからの入力パラメータの取得(日本語対応)するTomcat上のWebアプリの作成方法

動作確認した環境
アプリの構成
□tomcatホームディレクトリ
├□conf
|└◆server.xml
└□webapps
  └□test
    ├◆index.jsp
    └□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>
JSP(index.jsp)
<%@ page language="java" contentType="text/html;
            charset=UTF-8" pageEncoding="UTF-8" %>

<html>
<head>
<title>入力ボックス</title>
</head>
<body>
<form action="sample" method="GET" accept-charset="UTF-8">
<input type="text" name="msg" />
<input type="submit" value="送信" />
</form>
</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 doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        String msg = req.getParameter("msg");
        res.setContentType("text/html; charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println(msg);
        out.println("</body>");
        out.println("</html>");
    }
}
コンパイル

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」へアクセス。 テキストボックスに「XXXX」と入力して、送信ボタンを押すと「XXXX」と表示されます。

sessionを利用したTomcat上のWebアプリケーションの作成方法

動作確認した環境
アプリの構成
□tomcatホームディレクトリ
├□conf
|└□Catalina
|  └□localhost
|    └◆test.xml
└□webapps
  └□test
    └□WEB-INF
      ├□classes
      |└◆Counter.class
      └◆web.xml
コンテキスト指定(test.xml)
<Context path="/test"
         docBase="<tomcatホームディレクトリ>/webapps/test"
         reloadable="true">
</Context>
Servlet(Counter.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;
import javax.servlet.http.HttpSession;

public class Counter extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req, HttpServletResponse res)
                         throws IOException, ServletException {
        HttpSession session = req.getSession();
        Integer count = (Integer) session.getAttribute("count");
        if (count == null) {
            count = new Integer(0);
        }
        count = new Integer(count.intValue() + 1);
        session.setAttribute("count", count);
        res.setContentType("text/html; charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Counter</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>");
        out.println("Session ID = ");
        out.println(session.getId());
        out.println("</p>");
        out.println("<p>");
        out.println("Count = ");
        out.println(count);
        out.println("</p>");
        out.print("<a href=");
        out.print("\"http://<tomcatサーバホスト>:8080/test/Counter\"
        out.println(">RERODE</a>");
        out.println("</p>");
        out.println("</body>");
        out.println("</html>");
    }
}
コンパイル
java -classpath <tomcatホーム>/lib/servlet-api.jar:. Counter.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>Counter</servlet-name>
        <servlet-class>Counter</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Counter</servlet-name>
        <url-pattern>/counter</url-pattern>
    </servlet-mapping>
</web-app>
動作確認

ブラウザより、「http://<tomcatサーバのホスト>:8080/test/counter」へアクセス。 「RERODE」のリンクをクリックして、「count=<数字>」の数字がくりあがればOKです。

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!! 」と表示されます。

5. 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!!」が表示されます。

6. 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)を解凍します。

サンプルの構成

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です。

7. Tomcat関連の問題解決の参考

更新履歴

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

戻る

スポンサーリンク

サイト内のページ

言語
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 /Lucene /MyBatis /Spring /Struts /WordPress

Web API
Google Maps

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

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

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

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

PC製品
ZOTAC

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

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

スポンサーリンク

関連サイト内検索ツール

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

IPアドレス確認ツール

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

35.172.203.87

HTMLの表示色確認ツール

パスワード生成ツール

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

ここに生成されます。

スポンサーリンク