2013-01-12 11 views
13

Ho creato "per ora" un'applicazione web semplice e di base. Sono abituato ad avere un descrittore di deployment come un semplice file web.xml e quindi un contesto applicativo come un file xml.Come utilizzare il tag <mvc: resources> di spring MVC in un contesto di applicazione java?

Tuttavia, ora volevo provare a creare la mia intera applicazione web di primavera utilizzando solo i file java. Pertanto, ho creato il mio WebApplicationInitializer al posto del normale descrittore di distribuzione e il contesto dell'applicazione che utilizza l'annotazione @Configuration.

descrittore di deployment

package dk.chakula.config; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration.Dynamic; 
import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 
/** 
* 
* @author martin 
* @since 12-1-2012 
* @version 1.0 
*/ 
public class Initializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     registerDispatcherServlet(servletContext); 
    } 

    private void registerDispatcherServlet(final ServletContext servletContext) { 
     WebApplicationContext dispatcherContext = createContext(ChakulaWebConfigurationContext.class); 
     DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext); 
     Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 
    } 

    private WebApplicationContext createContext(final Class<?>... annotatedClasses) { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.register(annotatedClasses); 
     return context; 
    } 

} //End of class Initializer 

contesto applicativo

package dk.chakula.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 
import org.springframework.web.servlet.view.tiles2.TilesConfigurer; 
import org.springframework.web.servlet.view.tiles2.TilesView; 

/** 
* 
* @author martin 
* @since 12-01-2013 
* @version 1.0 
*/ 
@Configuration 
@EnableWebMvc 
@ComponentScan("dk.chakula.web") 
public class ChakulaWebConfigurationContext { 

    @Bean 
    public TilesConfigurer setupTilesConfigurer() { 
     TilesConfigurer configurer = new TilesConfigurer(); 
     String[] definitions = {"/layout/layout.xml"}; 
     configurer.setDefinitions(definitions); 
     return configurer; 
    } 

    @Bean 
    public UrlBasedViewResolver setupTilesViewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(TilesView.class); 
     return viewResolver; 
    } 

} //End of class ChakulaWebConfigurationContext 

Il mio problema è che io non riesco a trovare un modo 'isolare' il mio mappatura cartella di risorse che contiene immagini, css javascript ecc. Quando il contesto dell'applicazione è in java.

con il contesto applicazione XML normale che ho usato questo tag per isolare la mappatura a/risorse/

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

Come posso fare questo, quindi la mia applicazione web può utilizzare le mie immagini, css ecc

+0

Quale versione stai usando? –

+0

Sto usando 3.2.0 – Rohwedder

risposta

30

Per poter servire le risorse statiche nell'applicazione Spring MVC sono necessari due tag XML: <mvc:resources/> e <mvc:default-servlet-handler/>. Lo stesso nella configurazione di Spring Java-based saranno:

@Configuration 
@EnableWebMvc 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    // equivalents for <mvc:resources/> tags 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926); 
     registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926); 
     registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926); 
    } 

    // equivalent for <mvc:default-servlet-handler/> tag 
    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    // ... other stuff ... 
} 

Nota che, dal momento @EnableWebMvc annotazione è utilizzata non c'è bisogno di estendere direttamente WebMvcConfigurationSupport, e si dovrebbe solo estendere WebMvcConfigurerAdapter. Vedi JavaDoc for @EnableWebMvc per i dettagli.

+0

ho salvato il giorno in cui stavo estendendo sia WebMvcConfigurationSupport che WebMvcConfigurerAdapter.my. –

9

Dopo aver utilizzato le ore di ricerca su Internet leggendo su Spring MVC 3 utilizzando solo i file java, mi sono imbattuto in alcuni articoli che utilizzavano un approccio estendendosi dalla classe WebMvcConfigurationSupport e quindi sovrascrivendo 2 metodi: addResourceHandler (ResourceHandlerRegistry) e ResourceHandlerMapping().

Il mio nuovo contesto applicazione ora appare così.

package dk.chakula.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.HandlerMapping; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 
import org.springframework.web.servlet.handler.AbstractHandlerMapping; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 
import org.springframework.web.servlet.view.tiles2.TilesConfigurer; 
import org.springframework.web.servlet.view.tiles2.TilesView; 

/** 
* 
* @author martin 
* @since 12-01-2013 
* @version 1.0 
*/ 
@Configuration 
@EnableWebMvc 
@ComponentScan("dk.chakula.web") 
public class ChakulaWebConfigurationContext extends WebMvcConfigurationSupport { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 

    @Override 
    @Bean 
    public HandlerMapping resourceHandlerMapping() { 
     AbstractHandlerMapping handlerMapping = (AbstractHandlerMapping) super.resourceHandlerMapping(); 
     handlerMapping.setOrder(-1); 
     return handlerMapping; 
    } 

    @Bean 
    public TilesConfigurer setupTilesConfigurer() { 
     TilesConfigurer configurer = new TilesConfigurer(); 
     String[] definitions = {"/layout/layout.xml"}; 
     configurer.setDefinitions(definitions); 
     return configurer; 
    } 

    @Bean 
    public UrlBasedViewResolver setupTilesViewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(TilesView.class); 
     return viewResolver; 
    } 

} //End of class ChakulaWebConfigurationContext 

Come ho capito Abbiamo dovuto ignorare addResourceHandler, per aggiungere la posizione e la mappatura delle risorse al Registro di sistema. Successivamente abbiamo avuto bisogno di un bean che restituisse un oggetto di HandlerMapping. L'ordine di questa HandlerMapping dovrebbe essere impostato a -1, perché, come ho potuto leggere dalla documentazione primavera, poi -1 significa

HandlerMapping ordinato a Integer.MAX_VALUE-1 per servire richieste di risorse statiche.

La mia applicazione ora può caricare i file css e le immagini nelle loro viste e volevo illuminare gli altri con la risposta così, le persone in futuro potrebbero trarne beneficio.

+3

Un modo un po 'ingombrante! .. Si noti che '@ EnableWebMvc' ha già importato' WebMvcConfigurationSupport' nella configurazione, quindi non c'è bisogno di usare l'annotazione '@ EnableWebMvc' e di estendere la classe di configurazione da' WebMvcConfigurationSupport' allo stesso tempo. Vedi [JavaDoc per @EnableWebMvc] (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html) per i dettagli. –

4

Prova questo:

@Override 
    public void addResourceHandlers(final ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 
Problemi correlati