Сервлет по умолчанию (Default Servlet)#

Сервлет по умолчанию — это сервлет, который обслуживает статические ресурсы, а также предоставляет список содержимого каталогов (если включено отображение списка каталогов). Он глобально объявлен в файле $CATALINA_BASE/conf/web.xml.

Вид по умолчанию:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>
        org.apache.catalina.servlets.DefaultServlet
    </servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

...

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

В данном примере загрузка происходит при запуске веб-приложения. Отображение списка каталогов отключено, а отладка выключена.

Изменение настроек#

Если требуется изменить настройки DefaultServlet для конкретного приложения, переопределите конфигурацию по умолчанию, повторно объявив DefaultServlet в файле /WEB-INF/web.xml. Однако это может вызвать проблемы при попытке развернуть приложение на другом контейнере, так как класс DefaultServlet не будет распознан. Чтобы обойти эту проблему, можно использовать специфичный для Tomcat файл дескриптора развертывания /WEB-INF/tomcat-web.xml. Его формат идентичен /WEB-INF/web.xml. Он переопределяет настройки по умолчанию, но не те, что указаны в /WEB-INF/web.xml, и будет обработан только при развертывании приложения на Tomcat.

DefaultServlet позволяет настраивать следующие параметры инициализации:

Параметры инициализации#

Параметр

Описание

debug

Уровень отладки

listings

Отображение списка каталогов, если файл приветствия отсутствует. Возможные значения - true, false

precompressed

Tomcat загружает сжатый файл, если пользовательский агент поддерживает соответствующее кодирование содержимого (br или gzip)

readmeFile

Отображение файла readme

globalXsltFile

Настройка отображения списка каталогов

contextXsltFile

Настройка XSL-преобразования для Context

localXsltFile

Настройка XSL-преобразования для каталога

input

Размер буфера ввода (в байтах) при чтении ресурсов

output

Размер буфера вывода (в байтах) при записи ресурсов

readonly

Установка значения для Context «только для чтения»

fileEncoding

Кодировка файла, используемая при чтении статических ресурсов

useBomIfPresent

Использование метки порядка байтов (BOM) для определения кодировки файла вместо fileEncoding. Возможные значения - true, false,pass-through

sendfileSize

Минимальный размер файла в КиБ, для которого будет использоваться sendfile. Отрицательное значение отключает sendfile

useAcceptRanges

Установка заголовка Accept-Ranges

showServerInfo

Вывод информации о сервере в ответе, если включено отображение списка каталогов

sortListings

Сортировка списка каталогов

sortDirectoriesFirst

Отображение всех каталогов перед файлами

allowPartialPut

Обработка HTTP PUT-запроса с заголовком Content-Range как частичный PUT

Настройка отображения списка каталогов#

Для настройки отображения списка каталогов выполните следующие действия:

  1. Замените DefaultServlet собственной реализацией и используйте ее в web.xml.

  2. Используйте localXsltFile, contextXsltFile или globalXsltFile. DefaultServlet создаст XML-документ, который будет преобразован с помощью XSLT на основе значений, указанных в XSLT-файле.

Формат XML:

<listing>
    <entries>
        <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
            fileName1
        </entry>
        <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'>
            fileName2
        </entry>
        ...
    </entries>
    <readme></readme>
</listing>

Пример XSLT-файла, имитирующего поведение Tomcat по умолчанию:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output method="html" html-version="5.0" encoding="UTF-8" indent="no" doctype-system="about:legacy-compat"/>
    <xsl:template match="listing">
        <html>
            <head>
                <title>Sample Directory Listing For <xsl:value-of select="@directory"/></title>
                <style>
                    h1 {color : white; background-color : #0086b2;}
                    h3 {color : white; background-color : #0086b2;}
                    body {font-family : sans-serif, Arial, Tahoma; color : black; background-color : white;}
                    b {color : white; background-color : #0086b2;}
                    a {color : black;} HR {color : #0086b2;}
                    table td { padding: 5px; }
                </style>
            </head>
            <body>
                <h1>Sample Directory Listing For <xsl:value-of select="@directory"/></h1>
                <hr style="height: 1px;" />
                <table style="width: 100%;">
                    <tr>
                        <th style="text-align: left;">Filename</th>
                        <th style="text-align: center;">Size</th>
                        <th style="text-align: right;">Last Modified</th>
                    </tr>
                    <xsl:apply-templates select="entries"/>
                </table>
                <xsl:apply-templates select="readme"/>
                <hr style="height: 1px;" />
                <h3>Apache Tomcat/9.0</h3>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="entries">
        <xsl:apply-templates select="entry"/>
    </xsl:template>
    <xsl:template match="readme">
        <hr style="height: 1px;" />
        <pre><xsl:apply-templates/></pre>
    </xsl:template>
    <xsl:template match="entry">
        <tr>
            <td style="text-align: left;">
                <xsl:variable name="urlPath" select="@urlPath"/>
                <a href="{$urlPath}"><pre><xsl:apply-templates/></pre></a>
            </td>
            <td style="text-align: right;">
             <pre><xsl:value-of select="@size"/></pre></td>
            <td style="text-align: right;"><pre><xsl:value-of select="@date"/></pre></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>