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

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

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

1.Spring Boot提供的自动配置

(1).自动配置的ViewResolver

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

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

在配置文件中配置BeanNameViewResolver

 //自动配置
    @Bean
    public BeanNameViewResolver beanNameViewResolver(){
        BeanNameViewResolver beanNameViewResolver=new BeanNameViewResolver();
        return beanNameViewResolver;
    }

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

在控制层返回BeanName字符串

/**
     * 返回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,配置前缀,后缀以及控制器中的方法来返回视图名的字符串,有两个构造方法:

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,我们可以看到,在这个方法中自动配置了静态资源的默认路径配置,

 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

自动配置类中的定义:

 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

/**
     * 直接注入了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.net/100301.html原文链接:https://javaforall.net

(0)
上一篇 2021年5月16日 下午12:00
下一篇 2021年5月16日 下午1:00


相关推荐

  • css filter属性不生效问题处理

    css filter属性不生效问题处理明天是清明节假期 感谢疫情以来第一个假期就让我学到了一个棘手问题解决方案由于清明节公祭日 公司的网站都要改为灰度样式 明明就是一个很简单的问题 再是在样式表里增加这个一个样式即可 答案很简单 html filter grayscale 100 webkit filter grayscale 100 moz filter grayscale 100 ms fi

    2025年11月10日
    7
  • 5种常见的运行时异常_五种常见异常

    5种常见的运行时异常_五种常见异常五种常见的运行时异常空指针异常 NullPointerException数组越界异常 IndexOutOfBoundsException类转换异常 ClassCaseException向数组中存放与声明类型不兼容对象异常ArrayStoreException…

    2026年4月18日
    5
  • 功能测试用例编写_白盒测试用例

    功能测试用例编写_白盒测试用例测试用例分层每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。从上图分析,我们可以看到testsuite中包含了3个测试用例,testca

    2022年7月30日
    14
  • java基础io流——OutputStream和InputStream的故事(温故知新)

    java基础io流——OutputStream和InputStream的故事(温故知新)io 流概述 IO 流用来处理设备之间的数据传输 上传文件和下载文件 Java 对数据的操作是通过流的方式 Java 用于操作流的对象都在 IO 包中 IO 流分类按照数据流向输入流读入数据输出流写出数据按照数据类型字节流字符流什么情况下使用哪种流呢 如果数据所在的文件通过 windows 自带的记事本打开并能读懂里面的内容 就用字符流 其他用字节流 如果你什么都

    2026年3月20日
    1
  • java 怎么更新session值_java – 如何更新session.setAttribute(name,value)值,其中名称相同?…「建议收藏」

    java 怎么更新session值_java – 如何更新session.setAttribute(name,value)值,其中名称相同?…「建议收藏」我有一种情况,我需要更新名称保持不变的setAttribute的值.考虑以下情况作为示例–假设我有三个JSP:abc.jsp,xyz.jsp,pqr.jsp.现在首先运行abc.jsp然后控制前进到xyz.jsp&然后转发到pqr.jsp.现在执行pqr.jspt后,再次使用setAttribute中的更新值控制回xyz.jsp.abc.jsp:ArrayListgetSupplyS…

    2022年10月16日
    5
  • SQL中几个常用的排序函数

    SQL中几个常用的排序函数

    2021年11月26日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号