<url-pattern> в <servlet-mapping> - PullRequest
       31

<url-pattern> в <servlet-mapping>

3 голосов
/ 03 июля 2011

Дело 1

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

Дело 2

  <servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

Если я использую дело 1, то я не получу ни одной из своих страницстиль с <link rel="stylesheet" type="text/css" href="${contextPath}/assets/styles.css" />, но если я использую вариант 2, то все стилизуется.

Может ли кто-нибудь помочь мне понять, почему?

Кроме того, кто-то может сказать мне, какой шаблон следует использовать, чтобы я нене нужно беспокоиться о расширениях?Как я должен использовать /*?Дело в том, что если я использую /* сейчас, когда я использую *.do при разработке своего приложения, кажется, что все ломается, не только стили, но я не получаю изображения, JCaptcha и все такоеимеет отношение к ссылкам.

И если я пытаюсь отправить GET-запрос от клиента REST, например http://localhost:8080/myapp/user/1, он не работает, и мне нужно добавить .do в конце и отправить тот же запроскак http://localhost:8080/myapp/user/1.do.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 03 июля 2011

Браузеры отправляют отдельные HTTP-запросы на связанные ресурсы, такие как файлы CSS, файлы JS и изображения.URL-адреса этих запросов также соответствуют шаблону URL-адреса /.Таким образом, ваш myapp сервлет также вызывается по этим запросам.Однако ваш myapp сервлет, похоже, не обрабатывает их должным образом, поэтому эти запросы возвращают что-то совершенно другое.Попробуйте запросить эти ресурсы самостоятельно, чтобы узнать, что ваш сервлет фактически возвращает веб-браузеру:

http://localhost:8080/myapp/assets/styles.css

В вашем случае вы хотите, чтобы ваш myapp сервлет игнорирует запросы к этим ресурсам.Лучший способ - создать фильтр, который это делает.Предполагая, что все эти ресурсы находятся в папке с именем /assets, вы можете достичь этого, сопоставив свой сервлет с более конкретным шаблоном URL, например, например, /myapp/* и создав Filter прослушивание /*, котороепрозрачно продолжает цепочку запросов / ответов для любых запросов на /assets и отправляет все остальные запросы на /myapp.

Итак, эта конфигурация

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

в сочетании со следующим в фильтреdoFilter():

String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.startsWith("/assets")) {
    chain.doFilter(request, response); // Goes to container's default servlet.
} else {
    request.getRequestDispatcher("/myapp" + uri).forward(request, response);
}

должно работать на вас.

3 голосов
/ 03 июля 2011

Вот соответствующая страница из учебника по Oracle J2EE: http://download.oracle.com/docs/cd/E13222_01/wls/docs81/webapp/components.html#148787

На этой странице приведены некоторые примеры и приведены ссылки на спецификацию сервлета:

Для получения дополнительной информацииОб отображениях сервлетов, таких как общие правила и соглашения по отображению сервлетов, см. раздел 11 спецификации Servlet 2.3 по адресу: http://www.jcp.org/aboutJava/communityprocess/final/jsr053/

Спецификация заслуживает прочтения, но вам нужно нажать на "Я согласен "загрузить PDF, поэтому я не могу ссылаться на него напрямую.


Вкратце о том, что в спецификации сказано, что используются следующие правила (по порядку):

  1. Предпринята попытка выполнить точное совпадение.
  2. Сделана попытка выполнить сопоставление с префиксом, причем приоритет отдается совпадению с самым длинным префиксом.
  3. Попыткасделано для сопоставления суффиксов.
  4. "[T] контейнер будет пытаться обслуживать содержимое, соответствующее запрошенному ресурсу. Если для приложения определен сервлет" по умолчанию ", он будетб. "
...