404 Ошибка доступа к статическому содержимому, если в web.xml определен сервлет defualt - PullRequest
1 голос
/ 03 мая 2011

Я запускаю веб-приложение в контейнере Tomcat 7 и получаю 404 ошибки при попытке получить доступ к статическому контенту (.css и т. Д.). Ниже моя структура каталогов:

  • ROOT
    • META-INF
    • ресурсы
      • 1010 * CSS *
    • WEB-INF
      • классы
      • Lib

Я определил сервлет по умолчанию в своем дескрипторе развертывания следующим образом:

<servlet>
    <servlet-name>HomeController</servlet-name>
    <servlet-class>controller.HomeController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HomeController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Сервлет HomeController перенаправляет запрос в .jsp, и представление отображается правильно.

request.getRequestDispatcher("view.jsp").forward(request,
        response);

"view.jsp" имеет ссылку на таблицу стилей (style.css), расположенную в папке css, указанной выше. Однако, поскольку сервлет настроен как сервлет по умолчанию, я не могу получить доступ к статическому содержимому в папке css, и любой запрос этой таблицы стилей возвращает ошибку 404.

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/style.css" />

Есть ли способ обойти это? Каков наилучший метод для обслуживания статических ресурсов, но при этом можно определить сервлет по умолчанию?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Не доморощайте свой собственный сервлет по умолчанию.Используйте встроенный сервлет по умолчанию для сервлет-контейнера.Ваш фронт-контроллер должен отображаться на более конкретный шаблон URL, например *.html или /pages/*.

Если вы намереваетесь не изменять URL-адреса, то вы должны создать дополнительный класс Filter, который сопоставляется с /* и просто продолжает цепочку, когда запрашивается /resources/*, и в противном случае пересылается насервлет фронт-контроллера, который отображается на /pages/*.

Например,

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

И связать ваш CSS просто с помощью пути /resources в URL, точно так же, как в общедоступном веб-контенте.структура папок.

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/style.css" />

См. также:

1 голос
/ 03 мая 2011

Если вы не связываете css из пути к ресурсам следующим образом:

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resources/css/style.css" />
...