2011-11-18 86 views
2

我试图映射弹簧环境静态资源的请求的映射路径。我的应用服务器是Jetty。绝对路径<MVC:资源/>而不是相对于弹簧的servlet

在web.xml中,我绘制各种URL模式我春天的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...] 

注意, “/” 没有被映射到我的春天的servlet。

在弹簧servlet.xml中,我使用的MVC:资源标签的URL目录映射与我的静态内容:

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

如我所料这是行不通的。相反,映射

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

它映射

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

的原因是,在给定的映射“MVC:资源”似乎并不相对于/,但相对于映射到春天的servlet路径。

是否有考虑的完整路径的方式,相对于用于映射,而不是相对于servlet映射/路径?

+0

不知道。但为什么不简单地使用/ **而不是/ static/**作为映射? –

+0

那么这也是一个全面的映射/ otherpath/ – Twilite

+0

并且你不可能有两个不同的spring servlet:一个用于/ otherpath /,一个用于/ static /? –

回答

7

的解决方案是不使用MVC:资源标签,而是用一个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> 

其alwaysUseFullPath财产SimpleUrlHandlerMapping建立并允许更细粒度的控制映射。

+1

您可能希望''为''所以它获得所有子文件夹中的所有资源。 – NightWolf

0

要回答一个短字你的问题。不,至少我不这么认为。

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

是否有可能只添加一个servlet到/然后再添加两个<mvc:resource />?一个与/静态/ * *和一个与/otherpath/* *(或任何你需要有)。如果没有,我会用JB Nizet的解决方案来完全添加两个不同的servlet。

+1

如果您想将spring调度程序servlet映射到根环境,请确保您也按照文档http://static.springsource.org/spring/docs/3.0.x中的说明设置了mvc:default-servlet-handler /spring-framework-reference/html/mvc.html#mvc-default-servlet-handler – digitaljoel

0

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

下面是我使用的(请注意评论位是在做资源映射到应用程序下的“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"/> 

我基本上使用相对路径,以我的根app文件夹,而春天发生在它前面加上/myapp的照顾。

mvc:resources自己并没有这样做,但至少这是有效的,它仍然非常整齐还是很奇怪。