Spring Boot实战第七章-Spring Boot Web开发-Web相关配置

2021-05-19 16:36:38 浏览数 (1)

本章介绍的是基本的web相关配置,涉及了springboot自动配置,注册servlet、filter、listener等等,配置起来很简单。

1.Spring Boot提供的自动配置

(1).自动配置的ViewResolver

  ContentNegotiatingViewResolver,MVC提供的一个特殊的ViewResolver,它不会自己处理view,而是代理给不同的ViewResolver来处理不同的View,有最高的优先级。

  BeanNameViewResolver,在控制器中的一个方法返回的字符串会根据BeanNameViewResolver去查找Bean的名称为返回字符串的View来渲染视图。例如:

在配置文件中配置BeanNameViewResolver

代码语言:javascript复制
 //自动配置
    @Bean
    public BeanNameViewResolver beanNameViewResolver(){
        BeanNameViewResolver beanNameViewResolver=new BeanNameViewResolver();
        return beanNameViewResolver;
    }

    @Bean
    public MappingJackson2JsonView jsonView() {
        MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
        return jsonView;
    }

在控制层返回BeanName字符串

代码语言:javascript复制
/**
     * 返回jsonView,他会找bean名称为jsonView的视图来渲染
     */
    @RequestMapping(value = "/json",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public String json(Model model){
       Person single=new Person("二狗子",28);
       model.addAttribute("single",single);
       return "jsonView";
    }

InternalResourceViewResolver,极为常见的ViewResolver,配置前缀,后缀以及控制器中的方法来返回视图名的字符串,有两个构造方法:

代码语言:javascript复制
public InternalResourceViewResolver() {
        Class<?> viewClass = this.requiredViewClass();
        if (InternalResourceView.class == viewClass && jstlPresent) {
            viewClass = JstlView.class;
        }

        this.setViewClass(viewClass);
    }

    public InternalResourceViewResolver(String prefix, String suffix) {
        this();
        this.setPrefix(prefix);
        this.setSuffix(suffix);
    }

(2).自动配置的静态资源

在自动配置类WebMvcAutoConfiguration,我们可以看到,在这个方法中自动配置了静态资源的默认路径配置,

代码语言:javascript复制
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }

                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }

            }
        }

将/static、/public、/resources和/META-INF/resources下的静态文件直接映射为/**,使我们可以直接http://localhost:8080/**来访问静态资源

webjar映射到/webjar/

(3).自动配置的Formatter和Converter

自动配置类中的定义:

代码语言:javascript复制
 public void addFormatters(FormatterRegistry registry) {
        Iterator var2 = this.delegates.iterator();

        while(var2.hasNext()) {
            WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
            delegate.addFormatters(registry);
        }

    }

只要我们定义了Converter、GenericConverter和Formatter接口的实现类的Bean,就会自动注册到Spring MVC中。

(4).自定义配置的HttpMessageConverter

代码语言:javascript复制
/**
     * 直接注入了HttpMessageConverters的bean
     * 引入了spring mvc的各种HttpMessageConverter以及其他的HttpMessageConverter
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.addAll(httpMessageConverters.getConverters());
    }

2.接管Spring Boot的web配置

增加额外配置,不想使用自动配置的时候可以定义一个配置类继承WebMvcConfigurerAdapter,使用MVC的配置方法。这里也可以用Spring Boot2版本的时候实现WebMvcConfigurer。

3.注册Servlet、FIlter、Listener

我们可以将Servlet、FIlter、Listener直接声明为Bean,或者注册ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean,简单的就直接声明为bean就好。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100301.html原文链接:

0 人点赞