Я занимаюсь разработкой веб-приложения с использованием Spring MVC 3 и DispatcherServlet
перехватываю все запросы в '/' примерно так (web.xml):
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Теперь это работает как рекламируется, однако как я могу обрабатывать статический контент? Раньше, прежде чем использовать RESTful URL, я бы, например, перехватил все * .html и отправил их в DispatcherServlet
, но теперь это другая игра с мячом.
У меня есть папка / static /, в которую входят / styles /, / js /, / images / etc, и я бы хотел исключить / static / * из DispatcherServlet
.
Теперь я мог заставить статические ресурсы работать, когда я сделал это:
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/</url-pattern>
</servlet-mapping>
Но я хочу, чтобы у него были хорошие URL-адреса (главное, что я использовал Spring MVC 3), а не целевая страница www.domain.com/app/
Я также не хочу, чтобы решение связывалось с tomcat или любым другим контейнером сервлетов, и поскольку это (относительно) низкий трафик, мне не нужен веб-сервер (например, apache httpd).
Есть ли чистое решение для этого?
источник
Ответы:
Так как я потратил много времени на эту проблему, я решил поделиться своим решением. Начиная с весны 3.0.4, существует параметр конфигурации, который называется
<mvc:resources/>
(подробнее об этом на веб-сайте справочной документации ), который можно использовать для обслуживания статических ресурсов, все еще используя DispatchServlet в корне вашего сайта.Чтобы использовать это, используйте структуру каталогов, которая выглядит следующим образом:
Содержимое файлов должно выглядеть так:
SRC / SpringMVC / веб / HelloWorldController.java:
WebContent / WEB-INF / web.xml:
WebContent / WEB-INF / SpringMVC-servlet.xml:
WebContent / JSP / index.jsp:
Надеюсь это поможет :-)
источник
Эта проблема решена весной 3.0.4.RELEASE, где вы можете использовать
<mvc:resources mapping="..." location="..."/>
элемент конфигурации в файле конфигурации вашего весеннего диспетчера.Проверьте документацию Spring
источник
В Spring 3.0.x добавьте следующее в ваш servlet-config.xml (файл, который настроен в web.xml как contextConfigLocation. Вам также нужно добавить пространство имен mvc, но просто Google для этого, если вы не знаете, как !;)
Это подходит для меня
С уважением
Аюб Малик
источник
Если я правильно понимаю вашу проблему, я думаю, что нашел решение вашей проблемы:
У меня возникла та же проблема, когда показывался необработанный вывод без каких-либо стилей CSS, javascripts или jquery-файлов.
Я просто добавил сопоставления в сервлет по умолчанию. В файл web.xml было добавлено следующее:
Это должно отфильтровать запросы файлов javascript и css от объекта DispatcherRequest.
Опять же, не уверен, что это то, что вы ищете, но это сработало для меня. Я думаю, "default" - это имя сервлета по умолчанию в JBoss. Не слишком уверен, что это для других серверов.
источник
<url-pattern>
теги внутри одного и того же<servlet-mapping>
Есть еще одно сообщение о переполнении стека, в котором есть отличное решение .
Кажется, он не специфичен для Tomcat, прост и отлично работает. Я попробовал несколько решений в этом посте с помощью Spring mvc 3.1, но затем возникли проблемы с доставкой моего динамического контента.
Вкратце, он говорит, что добавьте отображение сервлета следующим образом:
источник
Я нашел способ обойти это, используя urlrewritefilter Тьюки. Пожалуйста, не стесняйтесь дать лучший ответ, если у вас есть!
В web.xml:
В urlrewrite.xml:
Это означает, что любой URI с "." в нем (например, style.css) переписываться не будет.
источник
<mvc:resources/>
, о чем свидетельствует @Joris.Я только что столкнулся с этой проблемой в Spring MVC 3.0, и я изначально выбрал опцию UrlRewriteFilter. Однако я не был доволен этим решением, так как оно «не чувствуется правильным» (я не единственный - см. Ссылку выше на весенние форумы, где слово «взломать» появляется несколько раз).
Поэтому я предложил решение, аналогичное «Неизвестному (Google)», описанному выше, но позаимствовал идею о том, чтобы весь статический контент подавался из / static / (взято из версии приложения Pet Store для Spring Roo). Сервлет «по умолчанию» не работал для меня, но Spring Webflow ResourceServlet работал (также взят из приложения, сгенерированного Spring Roo).
web.xml:
Единственное изменение, которое я сделал в JSP, было добавление / static / path к URL для CSS, JS и изображений. Например, "$ {pageContext.request.contextPath} /static/css/screen.css".
для пользователей Maven зависимость для «org.springframework.js.resource.ResourceServlet»:
источник
Мой собственный опыт с этой проблемой заключается в следующем. Большинство веб-страниц и книг, связанных с Spring, предполагают, что наиболее подходящим синтаксисом является следующий.
Приведенный выше синтаксис предполагает, что вы можете поместить свои статические ресурсы (CSS, JavaScript, изображения) в папку с именем «resources» в корне вашего приложения, т.е. / webapp / resources /.
Однако, по моему опыту (я использую Eclipse и плагин Tomcat), единственный подход, который работает, - это если вы поместите папку ресурсов в WEB_INF (или META-INF). Итак, синтаксис, который я рекомендую, следующий.
В вашем JSP (или аналогичном) ссылайтесь на ресурс следующим образом.
Излишне упоминать, что весь вопрос возник только потому, что я хотел, чтобы мой сервлет-диспетчер Spring (фронт-контроллер) перехватывал все, все динамическое, то есть. Таким образом, у меня есть следующее в моем web.xml.
Наконец, так как я использую текущие лучшие практики, у меня есть следующее в моем сервлете фронт-контроллера xml (см. Выше).
И у меня есть следующее в моей фактической реализации контроллера, чтобы убедиться, что у меня есть метод по умолчанию для обработки всех входящих запросов.
Надеюсь, это поможет.
источник
Я получил ту же проблему и нашел ответ Джорис очень полезным. Но дополнительно мне нужно добавить
в файл конфигурации сервлета. Без этого сопоставление ресурсов не будет работать, и все обработчики перестанут работать. Надеюсь, это кому-нибудь поможет.
источник
URLRewrite - это своего рода «взлом», если вы хотите так его назвать. Это сводится к тому, что вы заново изобретаете колесо; так как уже существуют решения. Еще одна вещь, которую нужно помнить, это Http-сервер = статический контент и сервер приложений = динамический контент (именно так они были разработаны). Передавая соответствующие обязанности каждому серверу, вы максимизируете эффективность ... но в наши дни это, вероятно, является проблемой только в средах, критичных к производительности, и что-то вроде Tomcat, скорее всего, будет работать в обеих ролях большую часть времени; но, тем не менее, об этом нужно помнить.
источник
Я решил это так:
Это работает на Tomcat и, конечно, Jboss. Однако, в конце концов, я решил использовать решение, которое предоставляет Spring (как упомянул Розки), которое гораздо более переносимо.
источник
Я использовал оба способа - urlrewrite и аннотацию на основе Spring mvc 3.0.x и обнаружил, что подход на основе аннотаций является наиболее подходящим,
Таким образом, подход, основанный на аннотациях, будет хорошей сделкой.
источник
С весны 3 все ресурсы должны быть сопоставлены по-другому. Вам необходимо использовать тег, чтобы указать расположение ресурсов.
Пример :
Поступая таким образом, вы направляете сервлет диспетчера просматривать ресурсы каталога для поиска статического содержимого.
источник
Мой способ решения этой проблемы - разместить все ваши действия с определенным префиксом, таким как «web» или «service», и настроить, чтобы все URL с этим префиксом были перехвачены DispatcherServlet.
источник
Я просто добавляю три правила перед весенним правилом по умолчанию (/ **) в urlrewritefilter (tuckey) (urlrewrite.xml), чтобы решить проблему
источник
Я знаю, что есть несколько конфигураций для использования статического содержимого, но мое решение заключается в том, что я просто создаю большую папку веб-приложений внутри вашего кота. Это «массовое веб-приложение» обслуживает только статический контент без приложений. Это безболезненное и простое решение для подачи статического содержимого в ваше реальное весеннее веб-приложение.
Например, я использую две папки веб-приложений на своем коте.
Если я хочу использовать javascript, я просто добавляю URI для моего файла javascript.
EX> /resources/path/to/js/myjavascript.js
Для статических изображений я использую тот же метод.
EX> /resources/path/to/img/myimg.jpg
Наконец, я поставил « ограничение безопасности » на своего кота, чтобы заблокировать доступ к реальному каталогу. Я добавил в ограничение «nobody» ограничение, чтобы страница генерировала «403 запрещенную ошибку», когда люди пытались получить доступ к пути статического содержимого.
Пока это работает очень хорошо для меня. Я также заметил, что многие популярные сайты, такие как Amazon, Twitter и Facebook, используют разные URI для предоставления статического содержимого. Чтобы узнать это, просто щелкните правой кнопкой мыши на любом статическом контенте и проверьте его URI.
источник
Это сделало реальную работу в моем случае
в web.xml:
...
источник
Для конфигурации весны на основе Java вы можете использовать следующее
Использование ResourceHandlerRegistry, в котором хранятся регистрации обработчиков ресурсов для обслуживания статических ресурсов.
Дополнительная информация @ WebMvcConfigurerAdapter, которая определяет методы обратного вызова для настройки конфигурации на основе Java для Spring MVC, включенного через @EnableWebMvc.
источник
После ознакомления с тем же процессом принятия решений, описанным здесь, я решил воспользоваться предложением ResourceServlet, которое прекрасно работает.
Обратите внимание, что вы получите больше информации о том, как использовать webflow в процессе сборки maven, здесь: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html
Если вы используете стандартный центральный репозиторий Maven, то артефакт (в противоположность упомянутому выше пакету источников):
источник
Это может быть достигнуто как минимум тремя способами.
Решения :
Для полных примеров кода, как этого добиться, обратитесь к моему ответу в другом посте: Как отобразить запросы в HTML-файл в Spring MVC?
источник
Проблема с URLPattern
Измените шаблон URL в вашем отображении сервлета с "/" на "/ *"
источник
и если вы хотите использовать конфигурацию на основе аннотаций, используйте приведенный ниже код
источник
Поместите статическое содержимое, такое как css, js, в следующий путь
источник