<mvc:resources>中的绝对路径,而不是相对于spring servlet映射的路径</mvc:resources>

时间:2011-11-18 14:35:37

标签: spring spring-mvc

我正在尝试将请求映射到spring环境中的静态资源。我的应用服务器是Jetty。

在web.xml中,我将各种url模式映射到我的spring servlet:

<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。

在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”中给出的映射似乎与映射到spring servlet的路径无关或相对。

有没有办法考虑相对于/为映射的完整路径,而不是相对于servlet映射的路径?

3 个答案:

答案 0 :(得分:7)

解决方案是不使用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属性确实允许对映射进行更精细的控制。

答案 1 :(得分:0)

用一个简短的词来回答你的问题。不,至少我不这么认为。

servlet查看它自己的“空间”,这是在web.xml中完成servlet映射之后。这反过来是在我的容器(如tomcat)

完成映射之后

是否可以只将一个servlet添加到 / ,然后添加两个<mvc:resource />?一个是 / static / * * ,一个是 / otherpath / * * (或者你需要的任何东西) 。如果不是,我会选择JB Nizet的解决方案来完全添加两个不同的servlet。

答案 2 :(得分:0)

或者您可以使用<mvc:default-servlet-handler/><spring:url>。它对我有用。 当ROOT上下文中没有启动应用程序时,mvc:resources似乎不起作用。

这是我使用的配置(注意在“localhost:8080 / myapp”上下文中启动应用程序的资源映射的注释位,尽管上下文名称不应该在spring配置中):

<!-- 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不能自己做到这一点仍然很奇怪,但至少这种方法很有效,但它仍然非常整洁。