2013-07-27 171 views
1

我正在使用tomcat 7上的spring mvc 3。我一直有問題讓我的靜態資源加載。Spring MVC靜態資源配置問題

我的目錄結構如下:

-static 
-common 
    - paths to static 
- WEB-INF 

我已經作出了肯定的靜並沒有獲得在我設置了一個請求映射趕上了。但是,每當我去找回他們,我只是得到一個404如下:

GET http://localhost:8080/YouthMinistryHibernate/static/common/css/compiled.css 404 (Not Found) 
GET http://localhost:8080/YouthMinistryHibernate/static/common/js/compiled.js 404 (Not Found) 

這裏是我的web.xml:

<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>YouthMinistryHibernate</display-name> 

    <!-- Spring MVC --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/spring/root-context.xml</param-value> 
    </context-param> 
    <context-param> 
     <param-name>spring.profiles.default</param-name> 
     <param-value>simple</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>deepDishCMSServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value></param-value> 
     </init-param> 
     <init-param> 
      <param-name>spring.profiles.default</param-name> 
      <param-value>simple</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>deepDishCMSServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter> 
     <filter-name>hiddenHttpMethodFilter</filter-name> 
     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>hiddenHttpMethodFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

和我的春天MVC配置文件:

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

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

    <mvc:annotation-driven/> 

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 

    <bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basename" value="message" /> 
    </bean> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
     <property name="order"> 
      <value>1</value> 
     </property> 
    </bean> 

    <mvc:annotation-driven> 
     <mvc:message-converters> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>image/jpeg</value> 
         <value>image/png</value> 
        </list> 
       </property> 
      </bean> 
     </mvc:message-converters> 
    </mvc:annotation-driven> 
</beans> 

我試過使用兩種方法檢索資源:

<link rel="stylesheet" type="text/css" href="${ pageContext.request.contextPath }/static/common/css/compiled.css" /> 

<script type="text/javascript" src="<c:url value="/static/common/js/compiled.js" />"></script> 

這裏是鏈接到GitHub上的項目,以及以防萬一: http://github.com/dmcquillan314/YouthMinistryHibernate

任何幫助是極大的讚賞。

下面是我的pom.xml相關配置:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.1</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>exec</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <executable>${project.basedir}/src/main/resources/build.sh</executable> 
      <arguments> 
       <argument>${env}</argument> 
      </arguments> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
      </execution> 
     </executions> 
     <configuration> 
      <warSourceExcludes>static/common/js/**</warSourceExcludes> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>${java-version}</source> 
      <target>${java-version}</target> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1.1</version> 
     <configuration> 
      <warName>YouthMinistryHibernate</warName> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>tomcat-maven-plugin</artifactId> 
     <configuration> 
      <url></url> 
      <server>TomcatServer</server> 
      <path>/YouthMinistryHibernate</path> 
     </configuration> 
     <version>1.1</version> 
    </plugin> 

調試日誌,當我嘗試訪問該資源:

DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Did not find handler method for [/static/common/js/compiled.js] 
DEBUG: org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Matching patterns for request [/static/common/js/compiled.js] are [/static/**] 
DEBUG: org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - URI Template variables for request [/static/common/js/compiled.js] are {} 
DEBUG: org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapping [/static/common/js/compiled.js] to HandlerExecutionChain with handler [org.[email protected]569939c1] and 1 interceptor 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/YouthMinistryHibernate/static/common/js/compiled.js] is: -1 
DEBUG: org.springframework.web.servlet.resource.ResourceHttpRequestHandler - Trying relative path [common/js/compiled.js] against base location: ServletContext resource [/static/] 
DEBUG: org.springframework.web.servlet.resource.ResourceHttpRequestHandler - No matching resource found - returning 404 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'deepDishCMSServlet': assuming HandlerAdapter completed request handling 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request 

UPDATE

還沒有固定的然而,這個問題,我有機會查看我的所有代碼庫,到目前爲止沒有發現任何幫助。目前我正在環顧四周,看看我的代碼可能會卡在哪裏。

我在考慮這個問題可能存在於spring mvc config的某處,因爲它在加載靜態文件請求映射時似乎沒有使用mvc:resources。我的mvc配置如下:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 

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

    <!-- Configure the multipart resolver --> 
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
     <!-- one of the properties available; the maximum file size in bytes --> 
     <property name="maxUploadSize" value="100000"/> 
    </bean> 

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

    <!-- Add controller package to be scanned for this path --> 
    <context:component-scan base-package="com.youthministry.controller"/> 

    <mvc:annotation-driven/> 

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
     <property name="order"> 
      <value>1</value> 
     </property> 
    </bean> 

    <mvc:annotation-driven> 
     <mvc:message-converters> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>image/jpeg</value> 
         <value>image/png</value> 
        </list> 
       </property> 
      </bean> 
     </mvc:message-converters> 
    </mvc:annotation-driven> 

</beans> 
+0

您是否爲應用程序設置了'context.xml',或者在pom中設置了最終名稱?如果不是,則上下文名稱爲'YouthMinistryHibernate - $ {pom.version}' –

+0

我已經使用pom.xml中的相關信息更新了帖子。 – dmcqu314

+0

當您嘗試訪問靜態URL時,日誌中有什麼?將'logger.org.springframework.web.servlet'記錄器設置爲'DEBUG'並粘貼輸出。 – soulcheck

回答

0

此問題已修復。我通過做一些修改來簡化mvc,security和web.xml配置來解決它。不知怎的,它似乎在春天的安全問題上陷入了困境。

+1

我希望你在這裏說過更多... – Stephane

+1

@StephaneEybert它最終成爲一個衝突的過濾器,它過濾了靜態資源。我只是簡單地添加了一個過濾器來保證安全,以防止訪問該路由。這裏是我找到我的答案:http://stackoverflow.com/questions/3394657/spring-security-how-to-exclude-certain-resources – dmcqu314