トップ 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 /gcc /gdb /g++ /JDK /JUnit /ZAP

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

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

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

ITインフラ PC 製品
ZOTAC

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

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

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

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

その他
IT用語 /ITスキル体系 /トレンド履歴

スポンサーリンク

関連サイト内検索ツール

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

IPアドレス確認ツール

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

54.84.236.168

HTMLの表示色確認ツール

パスワード生成ツール

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

ここに生成されます。

スポンサーリンク