【狂神说Java】SpringBoot最新教程IDEA版通俗易懂_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1PE411i7CV?p=14 学习之后的知识点总结:
我们可以通过自动配置类和yml文件绑定来进行修改默认值。
"Default resource handling disabled"默认资源处理器已禁用。
例如:
默认资源处理器设置失效。
http://localhost:8080/webjars/jquery/3.2.1/jquery.js
点击“获取静态路径模式”getStaticPathPattern(),看到如下代码:
再次点击“静态路径模式staticPathPattern”,看到这个代码:
"/**"表示当前目录下的所有东西都能被识别。
然后,再看这段代码{ }里面的静态定位getStaticLocations():
点击“获取静态定位getStaticLocations()”,看到如下代码:
再次点击staticLocations,看到这个代码:
那么,分析这段代码,可以看到有四种路径可以得到静态资源:
"classpath:/META-INF/resources/", 是WebJars对应的目录"classpath:/META-INF/resources/webjars/”。 其余的都在resources中。 "classpath:/resources/", "classpath:/static/", "classpath:/public/" . “classpath:” 就是resources这个目录。
也就是说 ,"/**"下的所有资源都会去以上这四个目录中找。
我们来尝试一下,证明可以访问到内容:
说明优先级也是按照这个源码顺序来的。
FormattingConversionService(格式化转换服务) mvcConversionService,Provider(供应者) TemplateAvailabilityProviders(applicationContext)(模板可用性提供程序(应用内容))
setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
设置拦截器(获取拦截器(MVC转换服务,mvc资源url路径供应者))
setCorsConfigurations(getCorsConfigurations());
设置核心配置(获取核心配置)
getWelcomePage()方法点进去查看:
然后我发现,我用的2.5.4版本,这个方式时灵时不灵,我暂时也不知道怎么改,如果你知道给我留个言,感谢感谢!
org.springframework.boot
spring-boot-starter-parent
2.5.4
因为SpringBoot认为JSP过时了,所以不推荐使用jsp。而是使用HTML,然后配合模板引擎Thymeleaf。
Thymeleaf 官网:https://www.thymeleaf.org/
org.springframework.boot
spring-boot-starter-thymeleaf
2.5.4
spring-boot-starter这个版本不再包含 spring-boot-starter-thymeleaf 了,都是单独的个体。
官网上关于模板引擎的解释:
Spring Boot Features
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features
Spring Boot 特性
这时,我们尝试一下访问网页,根据以上代码,我们知道:模板引擎会自己加上前缀后缀来寻找页面。(我暂时是这样理解的,似乎不用再加上具体地址了。)
文档 - Thymeleaf https://www.thymeleaf.org/documentation.html
标题4是“标准表达式语法”。10是“属性优先级”。总之,多练习使用,才能熟练掌握。
model.addAttribute("users", Arrays.asList("幸","福","天","下"));
[[${user}]]
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications.spring-mvc.auto-configuration
也没看明白。继续看看其他。大概就是:
如果您想保留那些 Spring Boot MVC 自定义并进行更多MVC 自定义(拦截器、格式化程序、视图控制器和其他功能),您可以添加自己的@Configuration并且是
WebMvcConfigurer类型的类,但不添加 @EnableWebMvc
.
我们尝试一下,添加自己的@Configuration
的类。
可以在我们自定义的类中重写这些方法。以前写MVC框架开发需要自定义的类,可以直接在@Configuration
的类中继承重写方法,更加方便快捷了!!!不需要一个一个的写类了。
Implement Methods Ctrl+I 实现(继承)方法,
Override Methods Ctrl+O 重写(覆盖)方法。
先分析ContentNegotiatingViewResolver(内容协商视图解析器)这个类(是根据客户提交的MimeType(如 text/html,application/xml)来跟服务端的一组viewResover的MimeType相比较,如果符合,即返回viewResover的数据。),
我们看到ContentNegotiatingViewResolver 类 继承了 WebApplicationObjectSupport(Web程序对象支持) ,WebApplicationObjectSupport实现了 ViewResolver视图解析器、Ordered命令、 InitializingBean 初始化Bean。
再分析ViewResolver视图解析器,
意思是:注意: 为了支持 viewResolver 链接,如果没有定义给定名称的视图,viewResolver 应该返回{@code null }。但是,这是不必要的:
一些视图解析器总是尝试用给定的名称构建视图对象,无法返回{@code null }(而是在视图创建失败时抛出异常)。
@param viewName 要解析的视图名称。
@param locale 要解析的视图场所。
支持国际化的视图解析器应该尊重这一点。
@return 视图对象,或者{@code null }如果没有找到(可选的,允许 viewResolver 链接)。
@throws Exception 如果视图不能被解析(通常在创建实际视图对象的情况下)。
我们可以发现ViewResolver 实现了视图解析器接口的类,我们就可以把它看作视图解析器。
在ContentNegotiatingViewResolver(内容协商视图解析器)这个类里面
搜索resolveViewName解析视图名这个方法,发现代码描述的就是上面的注意事项。
那么,这个代码的内容有
获取候选的视图getCandidateViews,遍历寻找:
那么怎么从哪里get获取候选试图呢?从容器也就是Bean中获取候选视图,因为只有Bean里才能s使用get方法。所以我们想要自定义一个视图解析器,首先要
我看到这样一句话如下图,证明我们的自定义生效了。
在DispatcherServlet类中的doDispatch方法打个断点(因为所有的请求都会经过这个方法)验证。
/* 处理实际上分派给处理者。
处理程序将按servlet的HandlerMappings顺序来获得。
获取 HandlerAdapter 的方法是查询 servlet 安装的HandlerAdapters,以找到第一个支持该处理程序类的 HandlerAdapters。
所有的 http 方法都是通过这个方法处理的。决定哪些方法是可接受的,取决于HandlerAdapters或者handlers自己。
@param request ,当前 http 请求。
@param response, 当前 http 响应。
@throws Exception ,以防任何类型的处理失败。
*/
doDispatch方法打个断点之后,DeBug调试一下,然后访问http://localhost:8080/。
我们可以看到自定义的视图解析器:(还看到了前两个是官方的解析器,导入Thymeleaf之后的视图解析器,然后是我们自定义的解析器。)
✌
图2代码分析:
图2的这句话表示,到 mvc配置文件中得到图3的Format格式,那么我们就可以在application.properties或者application.yml中配置。
Format format = this.mvcProperties.getFormat();
经过网络转换服务转换格式之后,添加到图1的addFormatters(conversionService)方法,经过格式器注册进Bean工厂。
在图3我们看到了这些格式,格式化程序获取的是DataTime 的格式`yyyy-MM-dd HH:mm:ss`
现在,我们已知“ 图2的这句话表示,到 mvc配置文件中得到图3的Format格式,那么我们就可以在application.properties或者application.yml中配置。”,那么怎么配置呢?点开mvcProperties。
发现找到最后根源还是图3。
那么我们在application.yml中尝试,看到如下图,可以设置三种时间格式。
那么使用这样的思路看看图1中的getMessageCodesResolverFormat(),点进这个方法之后看到
然后在application.yml中尝试:发现名称是一样的,时间也是这几个名称,只是中间加了小短线“-”,全部小写。这些也都是mvcProperties.调用方法找到的的WebMvcProperties.java中的类。
messageCodesResolverFormat。 date、time、dateTime 。
要学会看源码,自己能出这个结论。
因为我们只控制了跳转,没有传数据,所以得到了一个空白页。
@Configuration并且是
WebMvcConfigurer类型的类”,但不添加 @EnableWebMvc?
我们发现@EnableWebMvc这个注解里面什么也没有,只是导入了一个
DelegatingWebMvcConfiguration.class类(Delegate 代表/委员/特派员)。
我们再次进入WebMvcAutoConfiguration.java类,找到WebMvcAutoConfigurationAdapter,里面也是导入了@Import(EnableWebMvcConfiguration.class)类,
进入这个类,我们看到它继承了DelegatingWebMvcConfiguration.class类。
在这个DelegatingWebMvcConfiguration.class类里我们可以看到:
DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport,
它里面的方法调用了WebMvcConfigurer里面的所有方法。就像下图所述,是一个WebMvcConfigurer的子集,授权自定义WebMvcConfigurationSupport。
那么我们知道,WebMvcAutoConfiguration.java这个类想要生效有以下条件:
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
“在找不到WebMvcConfigurationSupport.class类的时候,才能使WebMvcAutoConfiguration.java生效。”
而,DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport,
并且@EnableWebMvc这个注解里面什么也没有,只是导入了一个
DelegatingWebMvcConfiguration.class类(Delegate 代表/委员/特派员)。
所以两者条件冲突了。