Tomcat включает еще один XML файл в web.xml

Привет всем,

Так как у меня много отображений сервлетов в моем web.xml, мне было интересно, могу ли я фактически сохранить все сопоставления для отдельного файла, а затем включить его в web.xml.

servervlet-mapping.xml

<servlet>
    <servlet-name>red</servlet-name>
    <servlet-class>Test.Red</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>red</servlet-name>
    <url-pattern>/blue</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>blue</servlet-name>
    <servlet-class>Test.Blue</servlet-class>
</servlet>

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

web.xml

<include file="servlet_mapping.xml"/>

Таким образом, можно загрузить xml файлы в struts.xml. (не уверен, что это возможно в web.xml)

Что-то вроде этого возможно? Или есть другой способ заставить его работать?

(Извинения за мой плохой английский)

Спасибо заранее, Alex

Ответ 1

Servlet 3.0 представил концепцию веб-фрагментов, в которой рассматривается ваш вопрос о разделении web.xml на несколько файлов. Эти фрагменты могут содержать часть (или все) дескриптора веб-развертывания, включая META-INF/web-fragment.xml

<web-fragment metadata-complete="true" version="3.0"
    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-fragment_3_0.xsd">
  <name>fragment1</name>
    <servlet>
        <servlet-name>red</servlet-name>
        <servlet-class>Test.Red</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>red</servlet-name>
        <url-pattern>/blue</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>blue</servlet-name>
        <servlet-class>Test.Blue</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>blue</servlet-name>
        <url-pattern>/blue</url-pattern>
    </servlet-mapping>
</web-fragment>

в web.xml

...
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>MyWelcomePage</servlet-name>
        <servlet-class>MyWelcomePage</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyWelcomePage</servlet-name>
        <url-pattern>/MyWelcomePage/*</url-pattern>
    </servlet-mapping>    
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <absolute-ordering>
         <name>fragment1</name>
    </absolute-ordering>
</web-app>

Ответ 2

Если ваша версия сервлета ниже 3.0, вы не можете.

Если вы используете 3.0, существует возможность

В JSR 315: Спецификация Java Servlet 3.0, web-fragment.xml вводится для вместимости библиотечных банок, которые упакованы в WEB-INF/lib. Содержимое web.xml и web-fragment.xml практически одинаково. Здесь можно определить сервлеты, фильтры и прослушиватели. Можно также указать metadata-complete = true в данном web-фрагменте .xml. В последнем случае обработка аннотаций классов в этой банке будет пропущена. С web-fragment.xml банки библиотеки могут быть автономными и предоставлять информацию о метаданных в Интернете.

Но наличие двух XML может вас смутить. Просто попробуйте это.

Ответ 3

Вы можете попробовать подходить к подходу (основанному на концепции внешних XML-объектов):

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
 PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" [
 <!ENTITY textreplacements SYSTEM "textreplacements.xml">
]>
<web-app>
<filter>
    <filter-name>TextReplaceFilter</filter-name>
    <filter-class>TextReplaceFilter</filter-class>
    &textreplacements;
</filter>

textreplacements.xml

<init-param>
  <param-name>whatever</param-name>
  <param-value>whenever</param-value>
</init-param>