Come utilizzare spring MVC <mvc:risorse> tag in un’applicazione java contesto?

Ho creato ‘per ora’ un semplice e di base a molla applicazione web. Ho usato per avere un descrittore di distribuzione come un semplice web.xml file, e quindi un ambito di applicazione come file xml.

Anche se, ora volevo provare a creare tutta la mia primavera di applicazioni web utilizzando solo i file java. Quindi ho creato il mio WebApplicationInitializer invece del normale descrittore di distribuzione, e il mio contesto di un’applicazione che utilizza la Configurazione @annotazione.

Descrittore Di Distribuzione

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

Ambito di applicazione

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 non riesco a trovare un modo per ‘isolare’ la mia mappatura di risorse la cartella che contiene le immagini, css, javascript, ecc. Quando il mio ambito di applicazione è in java.

Con la normale applicazione XML contesto ho usato questo tag per isolare la mappatura /risorse/

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

Come posso fare questo, in modo che la mia applicazione web in grado di utilizzare le mie immagini, css etc.

  • Che versione stai usando?
  • Sto usando la versione 3.2.0
InformationsquelleAutor Rohwedder | 2013-01-12



3 Replies
  1. 32

    Per essere in grado di servire risorse statiche in Spring MVC applicazione è necessario disporre di due tag XML: <mvc:resources/> e <mvc:default-servlet-handler/>. Lo stesso in Java-based Primavera configurazione sarà:

    @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 ...
    }

    Di notare che, poiché @EnableWebMvc annotazione è utilizzato non c’è bisogno di estendere direttamente WebMvcConfigurationSupport, e si dovrebbe solo estendere WebMvcConfigurerAdapter. Vedere JavaDoc per @EnableWebMvc per i dettagli.

    • salvato il mio giorno mi stava estendendo sia WebMvcConfigurationSupport e WebMvcConfigurerAdapter.il mio male.
    • Beh come si fa a server /robots.txt? Aggiungendo configurer.enable() che provoca Whitelabel Error Page su tutti gli altri @RequestMapping percorsi! registry.addResourceHandler("/robots.txt").addResourceLocations("/static/robots.txt");
  2. 9

    Dopo ore di ricerca su internet a leggere su Spring MVC 3, utilizzando solo i file java mi è caduto su alcuni articoli che ha utilizzato un approccio che si estende dal WebMvcConfigurationSupport classe, e quindi l’override 2 metodi – addResourceHandler( ResourceHandlerRegistry ) e ResourceHandlerMapping().

    Mio nuovo contesto Applicativo ora guarda come questo.

    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 del registro di sistema. Successivamente abbiamo bisogno di un bean che ha restituito un oggetto di HandlerMapping. L’ordine di questo HandlerMapping deve essere impostato a -1, perché, come ho potuto leggere dalla primavera documentazione, quindi -1 significa

    HandlerMapping ordinato al numero Intero.MAX_VALUE-1 a servire statico
    le richieste di risorse.

    La mia domanda ora possibile caricare i file css e le immagini nel loro punto di vista, e ho voluto illuminare gli altri con la risposta così, la gente, in futuro, potrebbe ottenere il vantaggio di questo.

    • Un po ‘ ingombrante modo!.. Nota che @EnableWebMvc già importati WebMvcConfigurationSupport per la configurazione, quindi non c’è bisogno di utilizzare @EnableWebMvc di annotazione e di estendere la classe di configurazione da WebMvcConfigurationSupport allo stesso tempo. Vedere JavaDoc per @EnableWebMvc per i dettagli.
  3. 4

    Provare questo:

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

Lascia un commento