Подтвердить что ты не робот

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

То, что я пытаюсь сделать, - это запросы карты к корню сервлета (правильная терминология?). Я нахожусь в точке, где URL-адреса сопоставляются для правильного просмотра, но все статическое содержимое - css, javascript, images - это часть страницы не может быть найден.

Итак, в моем web.xml мой тег сервлета выглядит следующим образом

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

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

@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);
}

Я использую Tiles в моем слое view. Моя конфигурация такова:

 

    /WEB -INF/tiles-defs.xml    

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

2010-01-24 17: 25: 01 777 DEBUG [http-8080-7] servlet.DispatcherServlet(DispatcherServlet.java:690) - DispatcherServlet с именем 'springapp' обработка запроса GET для [/springapp/static/css/account.css] 2010-01-24 17: 25: 01,778 WARN [http-8080-4] servlet.DispatcherServlet(DispatcherServlet.java:962). Не найдено сопоставления для HTTP-запроса с URI [/springapp/static/css/shop.css] в DispatcherServlet с именем 'springapp' 2010-01-24 17: 25: 01,778 DEBUG [http-8080-6] servlet.FrameworkServlet(FrameworkServlet.java:677) - успешно завершенный запрос 2010-01-24 17: 25: 01,778 WARN [http-8080-5] servlet.DispatcherServlet(DispatcherServlet.java:962) - Нет сопоставления найденный для HTTP-запроса с URI [/springapp/static/css/offers.css] в DispatcherServlet с именем "springapp" 2010-01-24 17: 25: 01,778 WARN [http-8080-3] servlet.DispatcherServlet(DispatcherServlet.java:962) - Не найдено сопоставления для HTTP-запроса с URI [/springapp/static/css/scrollable-buttons.css] в DispatcherServlet с именем "springapp"

Переход к http://localhost:8080/springapp/shop работает отлично, но css и изображения отсутствуют.

Я думаю, что использование Tiles каким-то образом усложняет ситуацию, но я не хочу избавляться от него. Мне интересно, нужно ли мне настраивать конфигурацию разрешения просмотра, нужно как-то поддразнивать? просто не так, чтобы это произошло.

4b9b3361

Ответ 1

Проблема заключается в том, что запросы на статический контент отправляются в диспетчерServlet, потому что он отображается как <url-pattern>/</url-pattern>. Это очень распространенная проблема в приложениях с URL-адресами RESTful (то есть без префикса в сопоставлении DispatcherServlet).

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


Так как Spring 3.x предпочтительным способом доступа к статическим ресурсам является использование <mvc:resources>: 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 в Spring 3


1. Использовать фильтр перезаписи URL
См. mvc-basic пример здесь

2. Установите префикс для сервлета default:

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

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

3. Задайте статические расширения содержимого для сервлета default:

<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. Не используйте URL RESTful, используйте URL-адреса с префиксом:

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

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

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

Ответ 3

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

Для получения дополнительной информации см. Как обрабатывать статический контент в Spring MVC?

Ответ 4

У меня такая же проблема, но вместо использования spring, я делаю mysefl небольшой фильтр, который перенаправляет root на мою стартовую страницу следующим образом:

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String pageName = req.getServletPath();

    if(pageName.equals("/")) {
        res.sendRedirect( req.getContextPath() + "/start" );
    } else {
        chain.doFilter(request, response);
    }

Это может быть трюк, но похоже, что он отлично работает с небольшим кодом. Перейдите сюда для получения дополнительной информации о фильтрах http://www.oracle.com/technetwork/java/filters-137243.html