使用java配置DispatcherServlet

使用java配置spring mvc 前端控制器DispatcherServlet:只能部署到支持Servlet3.0的服务器才能工作。

package config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    
//将DispatchServlet映射到"/"
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }


//指定配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    

}

首先需要知道扩展**AbstractAnnotationConfigDispatcherServletInitializer**的任意类都会自动地配置DispatcherServlet和Spring应用上下文。

使用AbstractAnnotationConfigDispatcherServletInitializer非常简单,AbstractAnnotationConfigDispatcherServletInitializer子类重写了三个方法:

1.第一个方法getServletMappings(),他会将一个或多个路径映射到DispatcherServlet上。

2.当DispatcherServlet启动时,会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。
第二个方法getServletConfigClasses(),指定当DispatcherServlet加载应用上下文时,使用在WebConfig配置类(使用java配置)中的定义的关于web组件的bean,如控制器、视图解析器以及处理器映射bean。

3.在spring web应用中,通常还会有另外一个应用上下文。由ContextLoadListener创建。
第三个方法: getRootConfigClasses()指定了创建ContextLoaderListener应用上下文bean的配置类。这些bean通常是驱动应用后端的中间层和数据层组件。

总的来说AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServletContextLoaderListenergetServletConfigClasses()方法返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean。getRootConfigClasses()方法返回的带有@Configuration注解的类会用来配置ContextLieaderListener创建的应用上下文中bean。

启用注解驱动的Spring MVC

创建一个带有@EnableWebMvc注解的类。因此在WebConfig类中。。。

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
public class WebConfig {
    
}

这可以运行起来,它的确能够启用Spring MVC,但还有不少问题要解决:

  • 没有配置视图解析器。如果这样的话,Spring默认会使用BeanNameViewResolver,这个视图解析器会查找ID与视图名称匹配的bean,并且查找的bean要实现View接口,它以这样的方式来解析视图。
  • 没有启用组件扫描。这样的结果就是,Spring只能找到显式声明在配置类中的控制器。
  • 这样配置的话,DispatcherServlet会映射为应用的默认Servlet,所以它会处理所有的请求,包括对静态资源的请求,如图片和样式表(在大多数情况下,这可能并不是你想要的效果)。

一个完整的WebConfig类:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("web")
public class WebConfig extends WebMvcConfigurerAdapter {


    @Bean
    //配置jsp视图解析器
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    //配置静态资源的处理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

我们添加了一个ViewResolver bean。更具体来讲是InternalResourceViewResolver。它会更具逻辑视图名查找Jsp文件,在查找的时候会在逻辑视图名上加一个特定的前缀和后缀。

新的WebConfig类还扩展了WebMvcConfigurerAdapter并重写了其configureDefaultServletHandling()方法。过调用DefaultServletHandlerConfigurerenable()方法,我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。

WebConfig已经就绪,那RootConfig呢?

package spitter.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan(basePackages = {"spitter"},
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)
    })
public class RootConfig {
}

excludeFilters:指定不适合组件扫描的类型。这段代码的含义就是除开使用了@EnableWebMvc注解的WebConfig配置类扫描的bean。

 excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)
 }

你可能感兴趣的:(spring,mvc)