Вопрос-ответ

How to access static resources when mapping a global front controller servlet on /*

Как получить доступ к статическим ресурсам при отображении сервлета глобального фронт-контроллера на /*

Я отобразил диспетчер Spring MVC как сервлет глобального фронт-контроллера на /*.

<servlet>       
<servlet-name>home</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>home</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

Однако это отображение останавливает доступ к статическим файлам, таким как CSS, JS, изображения и т.д., Которые все находятся в /res/ папке.

Как я могу получить к ним доступ в любом случае?

Переведено автоматически
Ответ 1

Сопоставьте сервлет контроллера с более конкретным url-pattern like /pages/*, поместите статическое содержимое в определенную папку like /static и создайте Filter listening on /*, который прозрачно продолжает цепочку для любого статического содержимого и отправляет запросы сервлету контроллера для другого содержимого.

В двух словах:

<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>/pages/*</url-pattern>
</servlet-mapping>

со следующим в filter'sdoFilter():

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/static")) {
chain.doFilter(request, response); // Goes to default servlet.
} else {
request.getRequestDispatcher("/pages" + path).forward(request, response);
}

Нет, это не заканчивается /pages в адресной строке браузера. Это полностью прозрачно. При необходимости вы можете создать "/static" и / или "/pages" init-param часть фильтра.

Ответ 2

С Spring 3.0.4.RELEASE и выше вы можете использовать

<mvc:resources mapping="/resources/**" location="/public-resources/"/>

Как показано в Spring Reference.

Ответ 3

Что вы делаете, так это добавляете приветственный файл в свой web.xml

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

А затем добавьте это в свои сопоставления сервлетов, чтобы, когда кто-то переходит в корневой каталог вашего приложения, они отправлялись в index.html внутренне, а затем сопоставление будет внутренне отправлять их в сервлет, к которому вы его сопоставляете

<servlet-mapping>
<servlet-name>MainActions</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MainActions</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>

Конечный результат: вы посещаете /Application, но вам представлен сервлет /Application / MainActions без прерывания каких-либо других корневых запросов.

Понятно? Итак, ваше приложение по-прежнему находится по вспомогательному URL, но автоматически отображается, когда пользователь переходит в корневой каталог вашего сайта. Это позволяет вам по-прежнему размещать файл /images/ bob.img в обычном месте, но "/" - это ваше приложение.

Ответ 4

Если вы используете Tomcat, вы можете сопоставить ресурсы сервлету по умолчанию:

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

и получить доступ к своим ресурсам с помощью URL http://{контекстный путь} /static/res/...

Также работает с Jetty, не уверен насчет других контейнеров сервлетов.

java servlets