2012-06-20 9 views
8

Ho cercato in alto e in basso per risolvere questo problema, ma non riesco a trovare una soluzione. Il problema è il seguente: Ho un build di webapp Spring-mvc su un server Tomcat 7 - 7.0.12 per essere precisi - e ho problemi a far funzionare correttamente il tag <mvc:resources>. Come vedrai sotto, il <mvc:resources> funziona per la vecchia cartella delle risorse, ma preferisco avere la cartella delle risorse nella directory /WEB-INF/web/.

MediorkoorVOICES-Web-servlet.xml:<mvc: resources> come utilizzare la posizione del percorso di classe

<?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> 

struttura di cartelle:

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. 

Ora se volevo accedere alla cartella delle risorse vecchio, il codice qui sotto avrebbe funzionato.

<mvc:resources mapping="/resources/**" location="/resources/" /> 
& 
<img src="${pageContext.request.contextPath}/resources/oldBanner.png" /> 

Ma quello che preferirei è quello di fare qualcosa di simile:

<mvc:resources mapping="/resources/**" location="classpath:/WEB-INF/web/resources/" /> 
& 
<img src="${pageContext.request.contextPath}/resources/images/banner.png" /> 

qualcuno può spiegarmi come faccio questo? Sono abbastanza nuovo per la primavera-mvc.

EDIT1: dati aggiuntivi: sto usando netbeans 7.1.2 e la versione spring-mvc è 3.1.0 in combinazione con maven.

riportano di seguito le 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: ho aggiunto la completa MediorkoorVOICES-Web-servlet.xml e 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 : Dopo alcuni test, mi sono reso conto che il tag <mvc:resources> non funziona affatto. (Guarda struttura delle cartelle aggiornato) Se io, per esempio, fare:

<mvc:annotation-driven /> 
<mvc:resources location="/resources/web/" mapping="/resources/**" /> 
& 
<a href="${pageContext.request.contextPath}/resources/css/main.css" />click</a> 

Mi dà una 404 così, mentre in realtà, dovrebbe collegare al file /resources/web/css/main.css . Quindi tutto ciò a cui riesco a pensare adesso è che c'è qualche configurazione mancante.

risposta

8

Così, dopo un sacco di debug e "provare" le cose, mi ho provato ad aggiungere la mappatura * .css e * .png al web.servlet xml. Apparentemente, i file delle risorse non sono stati mappati al servlet e quindi non è stato possibile trovare. Pertanto, per tutti coloro che hanno la stessa mappatura della mia, aggiungi questo al tuo tag web.xml servlet-mapping.

<url-pattern>*.css</url-pattern> 
<url-pattern>*.png</url-pattern> 
0

Quello che stai facendo è totalmente sbagliato. Poiché le risorse sono nella cartella /WEB-INF/web/resources/, non è necessario specificare il percorso classe : prima di esso.

quindi sarebbe proprio come sotto

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

Penso che sarebbe risolvere il problema. Spero che questo ti aiuti. Saluti.

+0

Se lo faccio, risulta un errore 404. –

+0

Vedere la risposta aggiornata e provarla. –

+0

scusa ancora non funziona. Penso che quasi non riesca a caricare file in altre sottocartelle **/resources/** (vecchio). –

1

Questo dovrebbe funzionare:

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

Lei si riferisce alle risorse utilizzando un URI di /resources/somestatic.gif ma sarà servito da WEB-INF/resources/somestatic.gif

+1

Bene questo è, per qualche ragione sia il tag risorse .war, tomcat o spring-mvc, non mi permetterà di mettere le mie risorse in una sottocartella data da **/WEB-INF/** o **/META- INF/**. È quasi come se quelle directory fossero protette dalla lettura o qualcosa del genere. –

+0

C'è una differenza nel tuo percorso e nel mio percorso, non c'è '/ WEB-INF/resources /' nel mio caso, è 'WEB-INF/resources /' senza il principale '/', hai provato con questo –

+0

sì, ho provato senza la barra iniziale, ancora non funziona :( –

Problemi correlati