2013-02-07 15 views
9

Jestem nowy w Jawie i wiosną. Próbuję zrobić aplikację Hello World i nie rozumiem, co robię źle.SpringMVC i zasoby statyczne

oto moja struktura katalogów:

test_app 
-pom.xml 
-src 
--main 
---java 
----com.example.web 
-----IndexController.java 
---webapp 
----static 
-----img 
------example.jpg 
----WEB-INF 
-----web.xml 
-----dispatcher-servlet.xml 
-----jsp 
------index.jsp 

i źródła: web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app PUBLIC 
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
     "http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     id="WebApp_ID" version="2.5"> 

    <display-name>Movie Reminder WebApp</display-name> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>WEB-INF/dispatcher-servlet.xml</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 
</web-app> 

dyspozytor-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:p="http://www.springframework.org/schema/p" 
     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.xsd"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.example.web"/> 
    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 

     <property name="viewClass" 
        value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

IndexController.java

package com.example.web; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class IndexController { 
    @RequestMapping(value = "/") 
    public ModelAndView index() { 
     return new ModelAndView("index"); 
    } 
} 

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <title>Hello Spring!</title> 
</head> 
<body> 
<img src="<c:url value="/static/img/example.jpg" />" /> 
</body> 
</html> 

gdy wdrożyć aplikację i mój wniosek, otrzymuję 404 na żądanie obrazu

http://localhost:8081/ --- http 200 ok 
http://localhost:8081/static/img/example.jpg - http 404 not found 

kiedy dodać MVC: zasoby do dyspozytora-servlet.xml

<context:annotation-config/> 
<context:component-scan base-package="com.example.web"/> 
<mvc:resources mapping="/static/**" location="/static/" /> 

i ponowna kompilacja otrzymuję 404 do/request

http://localhost:8081/ --- http 404 not foundok 
http://localhost:8081/static/img/example.jpg - http 200 ok 

Proszę mi pomóc dowiedzieć się, co robię źle

+0

Im przy użyciu Apache Tomcat7 na windows 7, wiosna-MVC 3.2.1.RELEASE – user2050786

+0

wersji Java 1.7.0_11-B21 – user2050786

+0

add w pliku konfiguracyjnym wiosennej – unionx

Odpowiedz

0

To ze względu na mapowanie serwletu. Wszystkie przychodzące żądania są kierowane do serwletu. Ale aplet nie wie, jak honorować żądania dotyczące zasobów statycznych. Musisz dodać mapowanie dla zasobów statycznych. Istnieje kilka różnych metod:

  1. Użyj sposób dostarczony przez serwer WWW. Niestety różni się to w zależności od tego, jaki masz serwer.

  2. Użyj serwletu, który może obsługiwać zasoby statyczne.

Jaki serwer WWW używasz?

+0

Im przy Tomcat7 na Windows7, Wiosna MVC 3.2 – user2050786

+0

Zobacz odpowiedź poniżej. –

6

Wystarczy dodać obie te linie do swojego dispatcher-servlet.xml

<mvc:resources mapping="/static/**" location="/static/" /> 
<mvc:default-servlet-handler /> 

Oto co dokumentacja default-servlet-handler mówi:

Konfiguruje obsługi do obsługi zasobów statycznych, poprzez przesłanie do domyślnego serwletu kontenera apletu . Korzystanie z tego programu obsługi pozwala na używanie mapowania "/" z DispatcherServlet, przy jednoczesnym wykorzystaniu kontenera Serwlet do obsługi zasobów statycznych. Ten program obsługi będzie przekazywał wszystkie żądania do domyślnego serwletu. Dlatego ważne jest, aby pozostała ona ostatnia w kolejności wszystkich innych adresów URL URL-i: HandlerMappings.Stanie się tak, jeśli użyjesz elementu "opartego na adnotacji" lub jeśli konfigurujesz niestandardową instancję HandlerMapping, pamiętaj, aby ustawić jego właściwość "order" na wartość niższą niż wartość DefaultServletHttpRequestHandler, która jest Integer.MAX_VALUE.

+0

Dodałem do dispatchera-servlet.xml po . Nadal dostałem http: // localhost: 8081/--- http 404 nie został znaleziony, http: // localhost: 8081/static/img/example.jpg - http 200 ok – user2050786

+0

Zobacz http://stackoverflow.com/editing -help # formatowanie komentarzy. Nie używaj znaczników HTML w StackOverflow. – adarshr

0

od wiosny 3.0 i wyżej trzeba dodać do swojej konfiguracji po wiosennym:

<mvc:resources mapping="/static/**" location="/static/" /> 

Mówi swoją dyspozytora serwletu jak rozwiązać zasobów statycznych. Mam nadzieję, że to pomoże.

0

Użyj tego, to będzie działać always.Good szczęścia :)

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/").setCachePeriod(31556926);`enter code here` 
    } 
} 
0

skonfigurować domyślny serwletu w web.xml służyć wszystkich statycznych zasobów, więc tylko żądania trasy wyniesie kontrolerów:

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/resources/*</url-pattern> 
</servlet-mapping> 
Powiązane problemy