Tomcat 6.x web.xml по умолчанию и настраиваемая маршрутизация сервлетов

У меня есть два сервлета, определенные в файле web.xml, а именно default2 и myservlet. Сервлет default2 используется для сопоставления статических файлов, таких как javascript и css. Myservlet используется для получения динамического контента.

<servlet>
    <servlet-name>default2</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:my-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Отображение сервлета определяется следующим образом

<servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default2</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

Когда я пытаюсь получить доступ к любым файлам в /resources, я получаю 404. Любые идеи, почему эта конфигурация не работает, или изменить эту конфигурацию, чтобы она работала.


person Spring Monkey    schedule 15.09.2010    source источник
comment
Что говорит ошибка Tomcat? Кроме того, почему оба сервлета загружаются с одинаковым значением <load-on-startup>1</load-on-startup>?   -  person Buhake Sindi    schedule 16.09.2010
comment
При запуске нет ошибки tomcat. Когда мы обращаемся к любым файлам в каталоге /resources, выдается ошибка, что файл не найден.   -  person Spring Monkey    schedule 16.09.2010


Ответы (5)


Сервлет Tomcat по умолчанию до версии 6.0.30 фактически обслуживает статический ресурс, идентифицируемый HttpServletRequest.getPathInfo(), так что /style.css будет возвращено при запросе /resources/style.css.

Поведение Tomcat изменилось, начиная с версии 6.0.30. Таким образом, исходная конфигурация из вопроса работает в более новых версиях Tomcat. См. "50026: Добавлена ​​поддержка сопоставления сервлета по умолчанию с другими URL-адресами. чем /. (timw)" в журнал изменений.

Сервлет Jetty по умолчанию использует полный путь.

person axtavt    schedule 15.09.2010

Он должен работать нормально. Находятся ли эти файлы на самом деле в папке /resources?

person BalusC    schedule 15.09.2010
comment
Исключение говорит, что это не так. Доступны ли они по одному и тому же URL-адресу при удалении обоих сервлетов? Если все еще нет, то используемый URL-адрес и/или фактическое местоположение явно неверны (или у вас есть Filter прослушивание /*, которое плохо написано и, таким образом, мешает всему). - person BalusC; 16.09.2010

Ваш web.xml выглядит правильно (за исключением того, что я бы изменил ваши константы <load-on-startup>). Убедитесь, что ваш /resources существует и является общедоступной папкой в ​​пути вашего проекта, а не в папке /WEB-INF.

person Buhake Sindi    schedule 15.09.2010

Попробуйте изменить url-pattern для myservlet на / и при желании добавить <mvc:default-servlet-handler /> (см. здесь) к вашей конфигурации Spring.

person earldouglas    schedule 15.09.2010

Удалена неправильная часть ответа согласно комментарию @BalusC.

Установите точку останова в сервлете и выполните сеанс отладки. Найдите путь, по которому ваш сервлет получает эти файлы. Убедитесь, что они соответствуют местоположению

person Sean    schedule 15.09.2010
comment
Неправильно, servletcontainer будет соответствовать наиболее конкретному шаблону URL-адреса сервлета. Вероятно, вы путаете это с поведением фильтров. - person BalusC; 16.09.2010
comment
Да ты пишешь. Я не думал. Тем не менее установка точки останова в сервлете поможет определить, где приложение ищет файл. - person Sean; 16.09.2010
comment
Я предлагаю отредактировать ваш пост, так как вы получаете отрицательный балл. - person Buhake Sindi; 16.09.2010