web.xml の定義と servlet 要素について

メモ:

Java の Web アプリケーションは、 URL をサーブレットにマップするためにデプロイメント記述子(Servlet Deployment Descriptor)ファイルを使用します。デプロイメント記述子ファイルは web.xml というファイル名で、 WEB-INF ディレクトリの下に配置されます。

Tomcat 9 のインストールファイルに含まれる例(exampleディレクトリ)や conf ディレクトリに含まれる web.xml はバージョン 4.0 が用意されており、XML の構造は XML Schema で定義されています。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">
・・・・・

XML Schema である web-app_4_0.xsd には、 web-common_4_0.xsd がインクルードされており web-common_4_0.xsd の中には javaee_7.xsd と jsp_2_3.xsd がインクルードされるといった構造になっています。(Java EE: XML Schemas for Java EE Deployment Descriptors

servlet 要素の定義

はじめに servlet 要素について見てみます。 web-app_4_0.xsd で定義されている servlet 要素を抜粋すると次のような定義になっています。

<xsd:element name="servlet"
            type="javaee:servletType"/>

<xsd:complexType name="servletType">
<xsd:sequence>
    <xsd:group ref="javaee:descriptionGroup"/>
    <xsd:element name="servlet-name" type="javaee:servlet-nameType"/>
    <xsd:choice minOccurs="0" maxOccurs="1">
        <xsd:element name="servlet-class" type="javaee:fully-qualified-classType"></xsd:element>
        <xsd:element name="jsp-file" type="javaee:jsp-fileType"/>
    </xsd:choice>
    <xsd:element name="init-param" type="javaee:param-valueType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="load-on-startup" type="javaee:load-on-startupType" minOccurs="0"></xsd:element>
    <xsd:element name="enabled" type="javaee:true-falseType" minOccurs="0"/>
    <xsd:element name="async-supported" type="javaee:true-falseType" minOccurs="0"/>
    <xsd:element name="run-as" type="javaee:run-asType" minOccurs="0"/>
    <xsd:element name="security-role-ref" type="javaee:security-role-refType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="multipart-config" type="javaee:multipart-configType" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID"/>
</xsd:complexType>

xsd:element で定義された要素を servlet 要素の子要素として記述することができ、 servlet-name 要素は1つの記述が必須となり servlet-class 又は jsp-file どちらかの要素も1つの記述が必須となります。

参考

属性 意味
minOccurs 最低出現回数
maxOccurs 最高出現回数

出現回数に上限を設定しない場合は、maxOccursの値をunboundedと指定します。

また、 minOccurs 及び maxOccurs を省略した場合は、デフォルトの 1 が適用されます。

servlet-name 要素と servlet-class 要素の使い方

コンパイルした servlet を使うにはクラス名をそのまま使用するのではなく、そのクラスに名前を付けその名前に対して様々な設定を行います。このクラス名と名前の組み合わせを設定するのが servlet-name 要素と servlet-class 要素になります。

<web-app>
    <servlet>
        <servlet-name>
            サーブレット名
        </servlet-name>
        <servlet-class>
            実際のクラス名
        </servlet-class>
    </servlet>
</web-app>

例えば「 HelloServlet.class 」という実際のクラスに対して、「 hello 」というサーブレット名を付ける場合は次のように記述します。

<web-app>
    <servlet>
        <servlet-name>
            hello
        </servlet-name>
        <servlet-class>
            HelloServlet
        </servlet-class>
    </servlet>
</web-app>

※サーブレット名は Web アプリケーション内で一意である必要があります。また、クラス名は「.class」より前の部分を記述します。

以上で実際のクラスファイルに別の名前が紐付いたことになります。