三、SpringBoot Web配置

一、简介

1、使用SpringBoot;

二、SpringBoot对静态资源的映射规则

1、源码分析

三、Thymeleaf模板引擎

1、导入依赖文件

2、Thymeleaf使用

四、SpringMVC自动配置

1. Spring MVC auto-configuration

2、扩展SpringMVC

3、全面接管SpringMVC

5、如何修改SpringBoot的默认配置


一、简介

1、使用SpringBoot;

1)、创建SpringBoot应用,选中我们需要的模块;
2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
3)、自己编写业务代码;

自动配置原理?
这个场景SpringBoot帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?

xxxxAutoConfiguration:帮我们给容器中自动配置组件;web的配置组件为WebMvcAutoConfiguration
xxxxProperties:配置类来封装配置文件的内容;
@EnableConfigurationProperties:导入xxxxProperties配置类

二、SpringBoot对静态资源的映射规则

1、源码分析

1)查看可以在application.properties文件中设置和静态资源有关的参数,缓存时间等属性

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties implements ResourceLoaderAware {

2)静态文件相关

WebMvcAuotConfiguration:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
        return;
    }
    Integer cachePeriod = this.resourceProperties.getCachePeriod();
    if (!registry.hasMappingForPattern("/webjars/**")) {
         customizeResourceHandlerRegistration(
                 registry.addResourceHandler("/webjars/**")
                         .addResourceLocations(
                                 "classpath:/META‐INF/resources/webjars/")
                 .setCachePeriod(cachePeriod));
     }
     String staticPathPattern = this.mvcProperties.getStaticPathPattern();
      //静态资源文件夹映射
     if (!registry.hasMappingForPattern(staticPathPattern)) {
         customizeResourceHandlerRegistration(
                 registry.addResourceHandler(staticPathPattern)
                         .addResourceLocations(
                                 this.resourceProperties.getStaticLocations())
                 .setCachePeriod(cachePeriod));
     }
 }
//配置欢迎页映射
 @Bean
 public WelcomePageHandlerMapping welcomePageHandlerMapping(
            ResourceProperties resourceProperties) {
             return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
                     this.mvcProperties.getStaticPathPattern());
         }

       //配置喜欢的图标
         @Configuration
         @ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
         public static class FaviconConfiguration {
             private final ResourceProperties resourceProperties;
             public FaviconConfiguration(ResourceProperties resourceProperties) {
                 this.resourceProperties = resourceProperties;
             }
             @Bean
             public SimpleUrlHandlerMapping faviconHandlerMapping() {
                 SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
                 mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
                  //所有  **/favicon.ico 
                 mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
                         faviconRequestHandler()));
                 return mapping;
             }
             @Bean
             public ResourceHttpRequestHandler faviconRequestHandler() {
                 ResourceHttpRequestHandler requestHandler = new 
             ResourceHttpRequestHandler();
                 requestHandler
                         .setLocations(this.resourceProperties.getFaviconLocations());
                 return requestHandler;
             }
         }

2、要点

1)所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;

访问jquery.js路径:localhost:8080/webjars/jquery/3.3.1/jquery.js

记得导入依赖包

        <!--引入jquery-webjar-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

2)"/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

"classpath:/META‐INF/resources/", 
"classpath:/resources/",
"classpath:/static/", 
"classpath:/public/" 
"/":当前项目的根路径

如:localhost:8080/abc === 去静态资源文件夹里面找abc

3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;

如:localhost:8080/  -->去静态资源路径下找index页面

4)、设置图标,所有的 **/favicon.ico 都是在静态资源文件下找;

三、Thymeleaf模板引擎

1、导入依赖文件

 

<!-- 修改版本号 -->
<properties>
    <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
    <!-- 布局功能的支持程序  thymeleaf3主程序  layout2以上版本 -->
    <!-- thymeleaf2   layout1-->
    <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
</properties>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、Thymeleaf使用

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
 
     private static final Charset DEFAULT_ENCODING = Charset.forName("UTF‐8");
 
     private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
 
     public static final String DEFAULT_PREFIX = "classpath:/templates/";
 
      public static final String DEFAULT_SUFFIX = ".html";

只要我们把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染;

1)导入thymeleaf的名称空间

<html lang="en" xmlns:th="http://www.thymeleaf.org">

2)使用thymeleaf语法

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF‐8">
    <title>Title</title>
</head>
<body>
    <h1>成功!</h1>
    <!‐‐th:text 将div里面的文本内容设置为 ‐‐>
     <div th:text="${hello}">这是显示欢迎信息</div>
 </body>
 </html>

3)语法规则

  • th:text;改变当前元素里面的文本内容;  th:任意html属性;来替换原生属性的值

  • 表达式
Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样;
       补充:配合 th:object="${session.user}:
<div th:object="${session.user}">
 <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
 <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
 <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
 </div>

 Message Expressions: #{...}:获取国际化内容
 Link URL Expressions: @{...}:定义URL;
           @{/order/process(execId=${execId},execType='FAST')}
 Fragment Expressions: ~{...}:片段引用表达式
           <div th:insert="~{commons :: main}">...</div>

ThymeLeaf官方文档

四、SpringMVC自动配置

SpringBoot官方文档

1. Spring MVC auto-configuration

(1)Spring Boot 自动配置好了SpringMVC,以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration)

1)Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;

@Bean
public ViewResolver ViewResolver(){
		
	return new MyViewResolver();
}

2)Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars

        Static index.html support. 静态首页访问

        Custom Favicon support (see below). favicon.ico

3)自动注册了 of Converter , GenericConverter , Formatter beans.

        Converter:转换器; public String hello(User user):类型转换使用Converter

        Formatter 格式化器; 2017.12.17===Date

@Bean
@ConditionalOnProperty(prefix = "spring.mvc", name = "date‐format")//在文件中配置日期格
式化的规则
public Formatter<Date> dateFormatter() {
    return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
}

         自己添加的格式化器转换器,我们只需要放在容器中即可

我们想对默认配置进行修改只需要定义好放在容器中即可,SpringBoot会让它们生效.

2、扩展SpringMVC

(1)编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc;

既保留了所有的自动配置,也能用我们扩展的配置;

//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
 
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       // super.addViewControllers(registry);
        //浏览器发送 /atguigu 请求来到 success
        registry.addViewController("/atguigu").setViewName("success");
     }
 }

(2)原理

1)WebMvcAutoConfiguration是SpringMVC的自动配置类

2)在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)

@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
   private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

   //从容器中获取所有的WebMvcConfigurer
   @Autowired(required = false)
   public void setConfigurers(List<WebMvcConfigurer> configurers) {
       if (!CollectionUtils.isEmpty(configurers)) {
           this.configurers.addWebMvcConfigurers(configurers);
                //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用;  
                @Override
           // public void addViewControllers(ViewControllerRegistry registry) {
            //    for (WebMvcConfigurer delegate : this.delegates) {
             //       delegate.addViewControllers(registry);
             //   }
            }
        }
   }

3)容器中所有的WebMvcConfigurer都会一起起作用;

4)我们的配置类也会被调用;

效果:SpringMVC的自动配置和我们的扩展配置都会起作用;

3、全面接管SpringMVC

SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置;所有的SpringMVC的自动配置都失效了

我们需要在配置类中添加@EnableWebMvc即可;

//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
@EnableWebMvc
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
 
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       // super.addViewControllers(registry);
        //浏览器发送 /atguigu 请求来到 success
         registry.addViewController("/atguigu").setViewName("success");
     }
 }

原理:

1)@EnableWebMvc的核心

@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {

2)

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

3)

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
         WebMvcConfigurerAdapter.class })
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
         ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

4)@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

5)导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

5、如何修改SpringBoot的默认配置

模式:
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如
果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默
认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值