Абсолютный путь ввместо пути относительно отображения пружинного сервлета - PullRequest
2 голосов
/ 18 ноября 2011

Я пытаюсь сопоставить запрос со статическими ресурсами в среде Spring. Мой сервер приложений - Jetty.

В web.xml я сопоставляю различные шаблоны URL для моего весеннего сервлета:

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/otherpath/*</url-pattern>
</servlet-mapping>
[many more mappings...]

Обратите внимание, что "/" не сопоставлен с моим весенним сервлетом.

В spring-servlet.xml я использую тег mvc: resources для отображения URL-адреса в каталог с моим статическим содержимым:

<mvc:resources mapping="/static/**" location="/WEB-INF/static/" />

Это не работает, как я ожидал. Вместо отображения

/static/ to /WEB-INF/static/,

это карты

/static/static/ to /WEB-INF/static

Причина в том, что отображение, данное в "mvc: resources", кажется, не относительно /, а относительно пути, который отображается на сервлет пружины.

Есть ли способ рассмотреть полный путь относительно / для отображения, а не путь относительно отображения сервлета?

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Решение состоит в том, чтобы не использовать тег mvc: resources, а настроить соответствующий обработчик с помощью bean-компонента и URLHandlerMapping:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="true"/>
    <property name="mappings">
        <props>
            <prop key="/static/*">staticResources</prop>
        </props>
    </property>
</bean>

<bean id="staticResources" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
    <property name="locations">
        <list>
            <value>/WEB-INF/static/</value>
        </list>
    </property>
</bean>

SimpleUrlHandlerMapping со свойством alwaysUseFullPath позволяет более детально контролировать отображение.

0 голосов
/ 11 декабря 2012

Или вы можете использовать <mvc:default-servlet-handler/> и <spring:url>. Это сработало для меня. mvc:resources не работает, когда приложение не запускается в контексте ROOT.

Вот конфигурация, которую я использовал (обратите внимание на комментируемый бит, который выполнял сопоставление ресурсов приложению, запущенному в контексте «localhost: 8080 / myapp», хотя имя контекста не должно быть в весенней конфигурации):

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources -->
<!--<mvc:resources location="/styles" mapping="/myapp/styles/**"/>-->
<!--<mvc:resources location="/js" mapping="/myapp/js/**"/>-->

<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource 
requests to the container's default Servlet -->
<mvc:default-servlet-handler/>

Хитрость заключается в использовании spring:url для разрешения контекста вашего приложения. Вот что я использовал для этого:

<spring:url value="/styles/site.css" var="site_style"/>
<link rel="stylesheet" href="${site_style}" type="text/css" media="screen"/>

Я в основном использую относительные пути к моей корневой папке приложения, в то время как Spring позаботится о добавлении /myapp перед ним.

Все еще довольно странно, что mvc:resources не делает это самостоятельно, но, по крайней мере, это работает и все еще довольно изящно.

0 голосов
/ 19 ноября 2011

Чтобы ответить на ваш вопрос одним коротким словом. Нет, по крайней мере, я так не думаю.

Сервлет заглядывает в свое собственное "пространство", то есть после отображения сервлета в web.xml. Это, в свою очередь, после того, как сопоставление сделано в вашем контейнере (например, tomcat)

Можно ли добавить только один сервлет к / , а затем добавить два <mvc:resource />? Один с / static / ** и один с / otherpath / ** (или с тем, что вам нужно). Если нет, то я бы пошел с решением JB Nizet, чтобы полностью добавить два разных сервлета.

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