Отображение обработчика из mvc: resource переопределяет другие отображения, определенные с помощью аннотации. - PullRequest
2 голосов
/ 27 октября 2011

Я новичок весной mvc3, и я пытаюсь создать простой проект, чтобы приблизиться к весне mvc3.

Теперь я сталкиваюсь с некоторой проблемой, когда пытаюсь сервировать статические файлы ресурсов.

Поскольку я использую шаблон URL (/) в файле web.xml:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Итак, когда я введу: http://locaohost:8080/spring/res/css/main.css., я получу ошибку 404.

Из весеннего документа я пытаюсь использовать <mvc:resource location="/res/" mapping="/res/**" />

Но если я добавлю этот тег в spring-servlet.xml, я обнаружу, что теперь могу получить файл ресурсов, но не могу получить доступ к другой странице.

То есть у меня есть контроллер:

@Controller
@RequestMapping("/example")
public class HelloController {

    @RequestMapping("hello")
    public String hello(Model model){
        model.addAttribute("name", "John");
        return "spring.example.hello";
    }
}

Когда я приеду: http://locaohost:8080/spring/example/hello,I получит 404.

Но если я уберу тэг: <mvc:resource xxx/>

Я могу получить доступ к http://locaohost:8080/spring/example/hello,but Я не могу получить файл .css / .js.

Через отладчик в eclipse я обнаружил, что когда пружина инициализирует handerMapping в методе "initHanderMapping" из DispatchServlet, она создала два экземпляра отображения: BeanNameUrlHandlerMapping и SimpleUrlHandlerMapping.

Свойство handelrMap объекта BeanNameUrlHandlerMapping всегда пусто, в то время как SimpleUrlHandlerMapping всегда содержит сопоставления URL-адресов.

Когда я добавляю тег, его свойство handerMapping имеет вид: {/res/**=org.springframework.web.servlet.resource.ResourceHttpRequestHandler@1120eed}

Когда я удаляю тэг, handelrMapping: {/example/hello=com.spring.controller.HelloController@1b5438d, /example/hello.*=com.spring.controller.HelloController@1b5438d, /example/hello/=com.spring.controller.HelloController@1b5438d}.

Кажется, что {/res/**=xxxx} переопределяет другие отображения {/example/helloxxxxx}

Это spring-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!--    <mvc:resources location="/res/" mapping="/res/**"></mvc:resources>-->
    <context:component-scan base-package="com.spring.controller" />
    <bean id="viewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
    </bean>
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/jsp/tile_def.xml</value>
            </list>
        </property>
    </bean>
</beans>

Как это исправить?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Попробуйте добавить <mvc:annotation-driven /> в ваш контекст.

<mvc:resource...> переопределяет поведение по умолчанию пружинного MVC.Если вы добавите <mvc:annotation-driven /> в ваш spring-servlet.xml, он должен принудительно зарегистрировать все необходимые обработчики.

0 голосов
/ 09 декабря 2015

Лучшее решение:

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

Это определит порядок приоритета для ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...