2011-11-18 81 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自己並沒有這樣做,但至少這是有效的,它仍然非常整齊還是很奇怪。