6

I am fairly new to spring and I am having issues with accessing my resources in my Spring mvc app. I have tried Google and using stack overflow to find an answer (none of these helped me possible solution 1 , or possible solution, possible solution 3, spring framework ) but I have found none that have either solved my problem or improved my understanding of the problem (it may be simply because I didn't quite understand the mentioned solutions).

I have managed to embedded my css file into a webpage but using the code:

<%@include file="css/style.css" %>

but I cannot access it using a URL this way for obvious reasons. I have also tried using the following in my web.xml file but it has no effect, I admit I don't really understand the mapping in this case so that may be an issue

<mvc:annotation-driven />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/css/**" location="/css/" />

I have also tried using each of the following separately:

<img src="<%=request.getContextPath()%>/images/logo.jpg"/>

<img src="<%=request.getContextPath()%>/src/main/resources/images/logo.jpg"/>

This is my project layout:

My Project structure

This is my 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>MyProject Application</display-name>
  <servlet>
    <servlet-name>myServlet</servlet-name>
        <servlet-class>
                  org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
        <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

This is my myServlet-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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">
    <!-- -->
     <mvc:annotation-driven />
    <mvc:resources mapping="/images/**" location="/images/" />
    <mvc:resources mapping="/css/**" location="/css/" />
    <bean name="/index.html" 
    class="com.myproject.controller.AdminController" />
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>

and just in case here is my pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myproject</groupId>
    <artifactId>myProject</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>myProject Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <springVersion>3.0.4.RELEASE</springVersion>
    </properties>
    <dependencies>

        <!-- JUnit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- ORACLE JDBC driver, need install yourself -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.3.Final</version>
        </dependency>

        <!-- Spring framework -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springVersion}</version>
        </dependency>

        <!-- for compile only, your container should have this -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- Commons-logging & log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>admin_UI</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <webappDirectory>/sample/servlet/container/deploy/directory</webappDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

I would be happy if I can get access the images and css folders and the contents those folders from within the webapp/WEB-INF/pages the same way I can access my jsp pages (ie via URL), but Ideally I would like to understand how I should do this correctly i.e. what folder I should be mapping (src\main\resources or src\main\webapp\WEB-INF\some_resource_folder) and how I should map it.

If any more information is require I would be happy to supply.

5 Answers 5

12

You should place all of your static web content such as images, css and javascript in a resources directory under the webcontent (root directory) directory.

enter image description here

Then in myServlet-servlet.xml specify the directory as a resources directory. This will tell the dispatcher not to process requests for static resources.

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<mvc:resources mapping="/resources/**" location="/resources/" />

In your jsp files you should then access these resources using a root relative url that relies upon the context path resolved by JSP EL.

<link href="${pageContext.servletContext.contextPath}/resources/My_CSS.css" rel="stylesheet"/>
Sign up to request clarification or add additional context in comments.

6 Comments

You sir are a gent, that worked perfectly, I clearly just didn't understand where the resource folder should of been located. much appreciated. I do have a follow up question, I am now getting an error in eclipse on my jsp page javax.servlet.jsp.JspException cannot be resolved to a type index.jsp any advice?
Glad I could help, can you point me to your follow up question? I would like to answer more of your questions. That was some nice praise for this early in the morning. To answer your question I would need to see your controller.
I am now getting an error in eclipse on my jsp page javax.servlet.jsp.JspException cannot be resolved to a type index.jsp any advice?
Post your controller and I would recommend posting another question, they like to keep things separate on stack overflow, one question per post.
I have posted anther question as you suggested here
|
0

When using this:

<mvc:resources mapping="/resources/**" location="/META-INF/RESOURCES/" />

use this code in jsp :

<link href="<c:url value="/"/>resources/My_CSS.css" rel="stylesheet"/>

Look the difference. CAPS RESOURCES locates file path. and resources locates in web path

Comments

0

Set the resource order as below

    <mvc:resources mapping="/resources/**" location="/resources/" order="-1"/>

Comments

0

Instead of mixing JSTL and JSP EL, you can configure spring like this :

<mvc:resources mapping="/resources/**" location="/WEB-INF/pages/" />

in your case,in the JSP use the following :

<link href="<c:url value="/resources/My_CSS.css"/>" rel="stylesheet"/>

1 Comment

where should I import mvc tag?
0

In your jsp file you should set,

<c:set var="context" value="${pageContext.request.contextPath}" />

and your resource files js, css, img etc. include them with,

<script src="${context}/resources/your.file.js" type="text/javascript"></script>
<link href="${context}/resources/your.min.css" rel="stylesheet" type="text/css"/>

Also you should use this before href to controller links, like

<a href="${context}/yourPage">

In this way you can use context path that is defined in servlet container or app server Tomcat, jetty etc.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.