2013-07-27 167 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