Reputation: 718
I've searched high and low in order to solve this problem, but I can't find a solution.
The problem is as follows:
I have an Spring-mvc webapp build on a Tomcat 7 server - 7.0.12 to be precise - and I'm having trouble getting the <mvc:resources>
tag to work correct. As you will see below the <mvc:resources>
works for the old resource folder, but I prefer having the resource folder in the /WEB-INF/web/
directory.
MediorkoorVOICES-Web-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.oudejans.mediorkoorvoices.web" />
<mvc:resources mapping="/resources/**" location="/WEB-INF/web/resources/" />
<mvc:annotation-driven />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/web/jsp/" />
<property name="suffix" value=".jsp" />
<property name="order" value="1" />
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<import resource="web/tiles/web-tiles.xml" />
</beans>
folder structure:
META-INF
resources (Old resources folder)
- web
- images
- css
- main.css
WEB-INF
- classes
- lib
- admin
- shared
- web
- jsp
- tiles
- resources (New resources folder i want to access)
- images
- banner.png
- js
- etc.
Now if I wanted to access the old resource folder, the code below would work.
<mvc:resources mapping="/resources/**" location="/resources/" />
&
<img src="${pageContext.request.contextPath}/resources/oldBanner.png" />
But what I would prefer is to do something like this:
<mvc:resources mapping="/resources/**" location="classpath:/WEB-INF/web/resources/" />
&
<img src="${pageContext.request.contextPath}/resources/images/banner.png" />
Can someone explain to me how I do this? I'm fairly new to spring-mvc.
EDIT1: Additional data: I'm using netbeans 7.1.2 and spring-mvc version is 3.1.0 combined with maven.
Below is the Pom.xml
<!-- groupId config, etc. removed -->
<!-- packaging type is war -->
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.springframework.version>3.1.0.RELEASE</org.springframework.version>
<org.hibernate.version>3.5.6-Final</org.hibernate.version>
<org.apache.tiles.version>2.2.2</org.apache.tiles.version>
<netbeans.hint.deploy.server>Tomcat</netbeans.hint.deploy.server>
<netbeans.hint.j2eeVersion>1.6</netbeans.hint.j2eeVersion>
</properties>
<repositories>
<repository>
<id>com.springsource.repository.bundles.release</id>
<name>EBR Spring Release Repository</name>
<url>http://repository.springsource.com/maven/bundles/release</url>
</repository>
<repository>
<id>com.springsource.repository.bundles.external</id>
<name>EBR External Release Repository</name>
<url>http://repository.springsource.com/maven/bundles/external</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${org.hibernate.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${org.hibernate.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${org.hibernate.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-api</artifactId>
<version>${org.apache.tiles.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${org.apache.tiles.version}</version>
<exclusions>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>${org.apache.tiles.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.orm</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web.servlet</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>6.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
EDIT2: I added the complete MediorkoorVOICES-Web-servlet.xml and the web.xml
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/hibernateContext.xml
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<error-page>
<error-code>404</error-code>
<location>/errors/404.err</location>
</error-page>
<servlet>
<servlet-name>MediorkoorVOICES-Web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MediorkoorVOICES-Web</servlet-name>
<url-pattern>*.mkvp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MediorkoorVOICES-Admin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MediorkoorVOICES-Admin</servlet-name>
<url-pattern>*.mkvap</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>*.err</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
EDIT3: After some more testing I realised that the <mvc:resources>
tag isn't working at all. (Look at updated folder structure) If I, for instance, do:
<mvc:annotation-driven />
<mvc:resources location="/resources/web/" mapping="/resources/**" />
&
<a href="${pageContext.request.contextPath}/resources/css/main.css" />click</a>
It gives me an 404 as well, while in fact, it should link to the /resources/web/css/main.css file. So all I can think of right now, is that there is some miss configuration.
Upvotes: 9
Views: 24993
Reputation: 718
So after a lot of debugging and "trying" things, I tried to add the *.css and *.png mapping to the web.xml servlet. Apparently, the resource files weren't mapped to the servlet and therefor couldn't be found. So for everyone with the same mapping as mine, add this to your web.xml servlet-mapping tag.
<url-pattern>*.css</url-pattern>
<url-pattern>*.png</url-pattern>
Upvotes: 8
Reputation: 49935
This should work:
<mvc:resources location="WEB-INF/resources/" mapping="/resources/**" />
You are referring to the resources using a uri of /resources/somestatic.gif
but it will be served from WEB-INF/resources/somestatic.gif
Upvotes: 1
Reputation: 4483
What you are doing is totally wrong. Since your resources are in the folder /WEB-INF/web/resources/ you don't need to specify classpath: before it.
So it would be just like below
<mvc:resources mapping="/WEB-INF/web/resources/**" location="/WEB-INF/web/resources/" />
I think that would resolve your problem. Hope this helps you. Cheers.
Upvotes: 0