<mvc: resources> how to use class location
I searched high and low to solve this problem, but I can not find a solution. The problem is this: I have a Spring -mvc webapp build on a Tomcat 7 server - 7.0.12, to be precise - and I had problems with the <mvc:resources> tag working correctly. As you will see below, <mvc:resources> works for the old resources folder, but I prefer to have the resources folder in the /WEB-INF/web/ .
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 will work.
<mvc:resources mapping="/resources/**" location="/resources/" /> & <img src="${pageContext.request.contextPath}/resources/oldBanner.png" /> But I would rather 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 am new to Spring -mvc.
EDIT1: Additional data: I am using netbeans 7.1.2 and Spring -mvc version 3.1.0 in conjunction with maven.
Below is 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 full MediorkoorVOICES-Web-servlet.xml and 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 testing, I realized that the <mvc:resources> doesnβt work at all. (Look at the updated folder structure) If I, for example, do:
<mvc:annotation-driven /> <mvc:resources location="/resources/web/" mapping="/resources/**" /> & <a href="${pageContext.request.contextPath}/resources/css/main.css" />click</a> It also gives me 404, while in fact it should reference the /resources/web/css/main.css file. So all I can think of right now is that there is some kind of skipping configuration.
So, after a lot of debugging and "attempts", I tried to add the * .css and * .png display to the servlet web.xml. Apparently, the resource files were not mapped to the servlet and therefore could not be found. Thus, for everyone with the same mapping as mine, add this to your servlet mapping web.xml tag.
<url-pattern>*.css</url-pattern> <url-pattern>*.png</url-pattern> This should work:
<mvc:resources location="WEB-INF/resources/" mapping="/resources/**" /> You link to resources using uri /resources/somestatic.gif , but it will be served from WEB-INF/resources/somestatic.gif
What you do is completely wrong. Since your resources are located in the / WEB-INF / web / resources / folder, you do not need to specify classpath:.
So it will be like below
<mvc:resources mapping="/WEB-INF/web/resources/**" location="/WEB-INF/web/resources/" /> I think that would solve your problem. Hope this helps you. Greetings.