2012-06-20 15 views
8

Szukałem wysokiego i niskiego poziomu, aby rozwiązać ten problem, ale nie mogę znaleźć rozwiązania. Problem jest następujący: Mam kompilację Spring-mvc na serwerze Tomcat 7 - dokładniej 7.0.12 - i mam problem z poprawnym działaniem znacznika <mvc:resources>. Jak widać poniżej, <mvc:resources> działa dla starego folderu zasobów, ale wolę mieć folder zasobów w katalogu /WEB-INF/web/.

MediorkoorVOICES-Web-servlet.xml:<mvc: resources> sposób korzystania z lokalizacji ścieżki klasy

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

struktura folderów:

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. 

Teraz gdybym chciał uzyskać dostęp do folderu zasobów stary kod poniżej będzie działać.

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

Ale co wolałbym to zrobić coś takiego:

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

Czy ktoś może mi wyjaśnić, w jaki sposób mogę to zrobić? Jestem całkiem nowy w spring-mvc.

EDIT1: Dodatkowe dane: używam netbeans 7.1.2 a wersja spring-mvc to 3.1.0 w połączeniu z maven.

Poniżej 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: Dodałem kompletny MediorkoorVOICES-Web-servlet.xml i 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 : Po kilku kolejnych testach zdałem sobie sprawę, że znacznik <mvc:resources> w ogóle nie działa. (Spójrz na zaktualizowanej strukturze folderów) Jeśli, na przykład, zrobić:

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

To daje mi 404, jak również, podczas gdy w rzeczywistości, powinien on odwołuje się do pliku /resources/web/css/main.css . Więc wszystko, o czym teraz myślę, to taka konfiguracja miss.

Odpowiedz

8

więc po wielu debugowania i „stara” rzeczy, ja próbował dodać mapowanie * .css i * .png do sieci.servlet xml. Wygląda na to, że pliki zasobów nie zostały zmapowane do serwletu i dlatego nie można ich znaleźć. Tak więc dla wszystkich z tym samym odwzorowaniem, co moje, dodaj to do swojego tagu web.xml serwlet-mapowania.

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

To, co robisz, jest całkowicie błędne. Ponieważ twoje zasoby znajdują się w folderze /WEB-INF/web/resources/, nie musisz wcześniej określać ścieżki klas: :.

Więc to byłoby tak jak poniżej

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

myślę, że problem można rozwiązać. Mam nadzieję, że to ci pomoże. Twoje zdrowie.

+0

Jeśli to zrobię, spowoduje to błąd 404. –

+0

Zobacz zaktualizowaną odpowiedź i wypróbuj ją. –

+0

Niestety nadal nie działa. Myślę, że prawie nie można załadować plików w żadnym innym podfolderze niż **/resources/** (stary). –

1

To powinno działać:

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

Jesteś odnoszące się do zasobów za pomocą URI /resources/somestatic.gif ale będzie służył od WEB-INF/resources/somestatic.gif

+1

To z jakiegoś powodu, z jakiegoś powodu, z tagu .war, tomcat lub spring-mvc, nie pozwoli mi umieścić moich zasobów w żadnym podfolderze z **/WEB-INF/** lub **/META- INF/**. To prawie tak, jak te katalogi są chronione przed odczytaniem lub czymś podobnym. –

+0

Jest pewna różnica w twojej ścieżce i mojej ścieżce, w moim przypadku nie ma '/ WEB-INF/resources /', jest to 'WEB-INF/resources /' bez wiodącego '/', czy próbowałeś z tym –

+0

Tak, próbowałem bez wiodącego slasha, nadal nie działa :( –