15

「今のところ」シンプルで基本的なSpring Webアプリケーションを作成しました。私は、配備記述子を単純な web.xml ファイルとして使用し、アプリケーション コンテキストを xml ファイルとして使用することに慣れています。

ただし、Java ファイルのみを使用して春の Web アプリケーション全体を作成しようとしました。したがって、通常のデプロイメント記述子の代わりに WebApplicationInitializer を作成し、 @Configuration アノテーションを使用するアプリケーション コンテキストを作成しました。

デプロイメント記述子

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

アプリケーションのコンテキスト

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

私の問題は、画像、css javascript などを含むリソース フォルダーへのマッピングを「分離」する方法が見つからないことです。アプリケーション コンテキストが Java の場合。

通常の XML アプリケーション コンテキストでは、このタグを使用して /resources/ へのマッピングを分離しました。

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

どうすればこれを行うことができるので、私の Web アプリケーションは私の画像や CSS などを使用できますか?

4

3 に答える 3

33

Spring MVC アプリケーションで静的リソースを提供できるようにするには、2 つの XML タグが必要です:<mvc:resources/><mvc:default-servlet-handler/>. Java ベースの Spring 構成では、次のようになります。

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

@EnableWebMvc注釈が使用されるためWebMvcConfigurationSupport、直接拡張する必要はなく、単に拡張する必要があることに注意してくださいWebMvcConfigurerAdapter。詳細については、@EnableWebMvc の JavaDoc を参照してください。

于 2013-06-09T19:40:23.940 に答える
9

Java ファイルのみを使用して Spring MVC 3 についてインターネットで何時間も検索した後、WebMvcConfigurationSupport クラスから拡張し、addResourceHandler( ResourceHandlerRegistry ) と ResourceHandlerMapping() の 2 つのメソッドをオーバーライドするアプローチを使用するいくつかの記事を見つけました。

新しいアプリケーション コンテキストは次のようになります。

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

私が理解したように、リソースの場所とマッピングをレジストリに追加するには、addResourceHandler をオーバーライドする必要がありました。その後、HandlerMapping のオブジェクトを返す Bean が必要になりました。この HandlerMapping の順序は -1 に設定する必要があります。これは、春のドキュメントから読み取ることができるように、-1 は意味するためです。

静的リソース要求を処理するために Integer.MAX_VALUE-1 で注文された HandlerMapping。

私のアプリケーションは、css ファイルと画像をビューにロードできるようになりました。他の人に答えを教えて、将来の人々がこれを利用できるようにしたかったのです。

于 2013-01-13T08:03:05.293 に答える
4

これを試して:

@Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
于 2015-06-22T06:01:29.847 に答える