Используя Spring, отображаясь для укоренения в web.xml не найдены статические ресурсы

Что я пытаюсь сделать, запросы карты к корню сервлета (корректная терминология?). Я в точке, где URL отображаются для исправления представления, но все статическое содержание - CSS, JavaScript, изображения - который является частью страницы, не могут быть найдены.

Таким образом в моем web.xml мой тег сервлета похож на это


    springapp
    /

Мой контроллер выглядит примерно так:

@RequestMapping("/shop")
public class TheShopController extends MyBaseController {

    public static String VIEW = "Tile.Shop";

    @Override
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
        ModelAndView mav = new ModelAndView(VIEW);
        return mav;
    }

}

MyBaseController очень прост. Это похоже на это:

public abstract class MyBaseController extends AbstractController {

    protected Logger log = Logger.getLogger(getClass());

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) 
        throws Exception {

        ModelAndView mav = processRequest(req, resp);
        return mav;
    }

    protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}

Я использую Мозаики, по моему мнению, слой. Моя конфигурация следующие:

/WEB-INF/tiles-defs.xml

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

24.01.2010 17:25:01  777 ОТЛАДОК [http-8080-7] сервлет. DispatcherServlet (DispatcherServlet.java:690) - DispatcherServlet с именем 'springapp' обработка ПОЛУЧАЮТ запрос на [/springapp/static/css/account.css] 24.01.2010, 17:25:01  778 ПРЕДУПРЕЖДАЕТ [http-8080-4] сервлет. DispatcherServlet (DispatcherServlet.java:962) - Никакое отображение, найденное для Запроса HTTP с URI [/springapp/static/css/shop.css] в DispatcherServlet с именем 'springapp' 24.01.2010 17:25:01  778 ОТЛАДОК [http-8080-6] сервлет. FrameworkServlet (FrameworkServlet.java:677) - Успешно завершенный запрос 24.01.2010 17:25:01  778 ПРЕДУПРЕЖДАЕТ [http-8080-5] сервлет. DispatcherServlet (DispatcherServlet.java:962) - Никакое отображение, найденное для Запроса HTTP с URI [/springapp/static/css/offers.css] в DispatcherServlet с именем 'springapp' 24.01.2010 17:25:01  778, НЕ ПРЕДУПРЕЖДАЕТ [http-8080-3] сервлет. DispatcherServlet (DispatcherServlet.java:962) - Никакое отображение, найденное для Запроса HTTP с URI [/springapp/static/css/scrollable-buttons.css] в DispatcherServlet с именем 'springapp'

Движение к http://localhost:8080/springapp/shop хорошо работает, но CSS и изображения отсутствуют.

Я думаю, что использование Мозаик так или иначе усложняет вещи, но меня "m отказывающийся избавиться от него. Я задаюсь вопросом, должен ли я скорректировать свои потребности конфигурации разрешения представления, которые настроят так или иначе? Объединение в цепочку сопоставителей представления, возможно? Я просто не, это испытало в выполнении этого.

29
задан GEOCHET 4 August 2011 в 21:16
поделиться

2 ответа

- 4565794-

Проблема в том, что запросы на статический контент переходят в диспетчерерсер, потому что он отображается в / . Это очень распространенная проблема в приложениях с «спокойными» URL-адресами (то есть без какого-либо префикса в диспетчке сопоставление).

Есть несколько возможных способов решить эту проблему:


с пружины 3.x предпочтительный способ доступа к статическим ресурсам является использование : Web.xml :

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

Spring Config:

<!-- Handles GET requests for /resources/** by efficiently serving static content 
    in the ${webappRoot}/resources dir --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

см. Также Упрощения MVC весной 3


1. Используйте фильтр Rewrite URL
См. Пример MVC-Basic здесь

2. Установите префикс для сервлета по умолчанию :

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

, то есть запрос на /static/images/image.png вернет файл с именем /Images/image.png Тем не менее, этот способ несовместим на разных контейнерах сервлета (не работает в пристани), см. В разделе «Обходные пути» здесь

3. Установите статические расширения контента для сервлета по умолчанию :

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

4. Не используйте Restful Urls, используйте URL с префиксом:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>

5. Не используйте редкие URL-адреса, используйте URL-адреса с расширением:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>
61
ответ дан 28 November 2019 в 01:06
поделиться

В качестве альтернативы предложенному номеру решения (2, сервлет по умолчанию, который ведет себя по-разному от контейнера сервлета к контейнеру сервлета), я бы рекомендовал взглянуть на Сервлет ресурсов ( org.springframework.js.resource.ResourceServlet ) из проекта Spring Webflow.

Подробнее см. Как обрабатывать статический контент в Spring MVC?

4
ответ дан 28 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: