关键词:
1、日志框架
小张;开发一个大型系统;
1、System.out.println("");前期将关键数据打印在控制台;去掉?写在一个文件?
3、再后来加高大上的几个功能?异步模式?自动归档?xxxx? zhanglogging-good.jar?
4、再后来将以前框架卸下来?换上新的框架,重新修改之前相关的API;zhanglogging-prefect.jar;
5、JDBC---数据库驱动;
写了一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;
给项目中导入具体的日志实现就行了;我们之前的日志框架都是实现的抽象层;
市面上的日志框架;
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
日志门面 (日志的抽象层) | 日志实现 |
---|---|
Log4j JUL(java.util.logging) Log4j2 Logback |
左边选一个门面(抽象层)、右边来选一个实现;
日志实现:Logback;
SpringBoot:底层是Spring框架,Spring框架默认是用JCL;
给系统里面导入slf4j的jar和 logback的实现jar
详细参考:
logger(七)、springBoot的日志源码查看(LogBack + slf4j)——配置的实际工作类Action
logger(六)、springBoot的日志源码查看(LogBack + slf4j)—— ContextInitializer
logger(五)、springBoot的日志源码查看(LogBack + slf4j)——Appender
logger(四)、springBoot的日志源码查看(LogBack + slf4j)——记录日志
logger(三)、springBoot的日志源码查看(LogBack + slf4j)——创建Logger
logger(二)、springBoot的日志源码查看(LogBack + slf4j)——创建ILoggerFactory
logger(一)、springBoot的日志源码查看(LogBack + slf4j)——对接slf4j
springBoot的日志配置(LogBack+slf4j)简介 (2021-06-22 10:51)
springboot集成logback日志快速使用 (2021-06-10 16:22)
1、简介
使用SpringBoot;
1)、创建SpringBoot应用,选中我们需要的模块;
2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
3)、自己编写业务代码;
自动配置原理?
这个场景SpringBoot帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?xxx
xxxxAutoConfiguration:帮我们给容器中自动配置组件;
xxxxProperties:配置类来封装配置文件的内容;
@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false) public class ResourceProperties implements ResourceLoaderAware //可以设置和静态资源有关的参数,缓存时间等 //默认的路径 private static final String[] CLASSPATH_RESOURCE_LOCATIONS = "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/",
"classpath:/public/"
;
WebMvcAuotConfiguration配置类重要方法:
//通过webjars的方式添加静态文件
@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;
1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
webjars:以jar包的方式引入静态资源;
请求路径:
localhost:8080/webjars/jquery/3.3.1/jquery.js
<!--引入jquery-webjar-->在访问的时候只需要写webjars下面资源的名称即可 <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/"
"/":当前项目的根路径
不包含:templates
localhost:8080/abc === 去静态资源文件夹里面找abc
3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;
localhost:8080/ 找index页面
踩坑:查找默认index页面的时候,是从上面四个默认的地址查找到
只有请求返回的地址才会默认在 classpath:/resources/templates 下查找
4)、所有的 **/favicon.ico 都是在静态资源文件下找;
JSP、Velocity、Freemarker、Thymeleaf
语法更简单,功能更强大;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> 2.1.6 </dependency> 切换thymeleaf版本 <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>
@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>
@Controller public class IndexController @RequestMapping("/index") public String toIndex(Model model) model.addAttribute("hello","hello world!"); return "index";
1)、th:text;改变当前元素里面的文本内容;
th:任意html属性;来替换原生属性的值
2)、表达式?
Simple expressions:(表达式语法) Variable Expressions: $...:获取变量值;OGNL; 1)、获取对象的属性、调用方法 2)、使用内置的基本对象: #ctx : the context object. #vars: the context variables. #locale : the context locale. #request : (only in Web Contexts) the HttpServletRequest object. #response : (only in Web Contexts) the HttpServletResponse object. #session : (only in Web Contexts) the HttpSession object. #servletContext : (only in Web Contexts) the ServletContext object. $session.foo 3)、内置的一些工具对象: #execInfo : information about the template being processed. #messages : methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #… syntax. #uris : methods for escaping parts of URLs/URIs #conversions : methods for executing the configured conversion service (if any). #dates : methods for java.util.Date objects: formatting, component extraction, etc. #calendars : analogous to #dates , but for java.util.Calendar objects. #numbers : methods for formatting numeric objects. #strings : methods for String objects: contains, startsWith, prepending/appending, etc. #objects : methods for objects in general. #bools : methods for boolean evaluation. #arrays : methods for arrays. #lists : methods for lists. #sets : methods for sets. #maps : methods for maps. #aggregates : methods for creating aggregates on arrays or collections. #ids : methods for dealing with id attributes that might be repeated (for example, as a result of an iteration). 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> Literals(字面量) Text literals: \'one text\' , \'Another one!\' ,… Number literals: 0 , 34 , 3.0 , 12.3 ,… Boolean literals: true , false Null literal: null Literal tokens: one , sometext , main ,… Text operations:(文本操作) String concatenation: + Literal substitutions: |The name is $name| Arithmetic operations:(数学运算) Binary operators: + , - , * , / , % Minus sign (unary operator): - Boolean operations:(布尔运算) Binary operators: and , or Boolean negation (unary operator): ! , not Comparisons and equality:(比较运算) Comparators: > , < , >= , <= ( gt , lt , ge , le ) Equality operators: == , != ( eq , ne ) Conditional operators:条件运算(三元运算符) If-then: (if) ? (then) If-then-else: (if) ? (then) : (else) Default: (value) ?: (defaultvalue) Special tokens: No-Operation: _
1. Spring MVC auto-configuration
以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration)
ContentNegotiatingViewResolver:组合所有的视图解析器的;
- Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars
Formatter
@Bean @ConditionalOnProperty(prefix = "spring.mvc", name = "date-format")//在文件中配置日期格式化的规则 public Formatter<Date> dateFormatter() return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
自己添加的格式化器转换器,我们只需要放在容器中即可
HttpMessageConverters
是从容器中确定;获取所有的HttpMessageConverter;
我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)
初始化WebDataBinder;
请求数据=====JavaBean;
org.springframework.boot.autoconfigure.web:web的所有自动场景;
If you want to keep Spring Boot MVC features, and you just want to add additional
<mvc:view-controller path="/hello" view-name="success"/> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean></bean> </mvc:interceptor> </mvc:interceptors>
编写一个配置类(@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");
原理:
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)、我们的配置类也会被调用;
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");
原理:
为什么@EnableWebMvc自动配置就失效了;
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最基本的功能;
模式:
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
//使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能 //@EnableWebMvc 不要接管SpringMVC @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter @Override public void addViewControllers(ViewControllerRegistry registry) // super.addViewControllers(registry); //浏览器发送 /atguigu 请求来到 success registry.addViewController("/success").setViewName("success"); //所有的WebMvcConfigurerAdapter组件都会一起起作用 @Bean //将组件注册在容器 public WebMvcConfigurerAdapter webMvcConfigurerAdapter() WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() @Override public void addViewControllers(ViewControllerRegistry registry) registry.addViewController("/").setViewName("login"); registry.addViewController("/index.html").setViewName("login"); ; return adapter;
2)、国际化
1)、编写国际化配置文件;
2)、使用ResourceBundleMessageSource管理国际化资源文件
3)、在页面使用fmt:message取出国际化内容
步骤:
1)、编写国际化配置文件,抽取页面需要显示的国际化消息
2)、SpringBoot自动配置好了管理国际化资源文件的组件;
@ConfigurationProperties(prefix = "spring.messages") public class MessageSourceAutoConfiguration /** * Comma-separated list of basenames (essentially a fully-qualified classpath * location), each following the ResourceBundle convention with relaxed support for * slash based locations. If it doesn\'t contain a package qualifier (such as * "org.mypackage"), it will be resolved from the classpath root. */ private String basename = "messages"; //我们的配置文件可以直接放在类路径下叫messages.properties; @Bean public MessageSource messageSource() ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); if (StringUtils.hasText(this.basename)) //设置国际化资源文件的基础名(去掉语言国家代码的) messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray( StringUtils.trimAllWhitespace(this.basename))); if (this.encoding != null) messageSource.setDefaultEncoding(this.encoding.name()); messageSource.setFallbackToSystemLocale(this.fallbackToSystemLocale); messageSource.setCacheSeconds(this.cacheSeconds); messageSource.setAlwaysUseMessageFormat(this.alwaysUseMessageFormat); return messageSource;
3)、去页面获取国际化的值;
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name查看详情开始学习python的第二天(代码片段)
一、练习题1.使用while循环输入1234568910#第一种方法count=0whilecount<10:count+=1#count=count+1ifcount==7:print(‘‘)else:print(count)#第二种count=0whilecount<10:count+=1#count=count+1ifcount==7:continueprint(count)2. 查看详情
python学习第二天(下)(代码片段)
继续上次的笔记 ####判断一个元素是否在列表中9innameprint(9inname)会返回一个True或False的结果 if9inname:#判断一个元素是否在列表中print("9isinname")####判断一个元素出现的次数count()方法 name=["Alex","Jack","Rain",9,4,3,5,634,34,89,"Eri... 查看详情
莫烦theano学习自修第二天激励函数(代码片段)
1.代码如下:#!/usr/bin/envpython#!_*_coding:UTF-8_*_importnumpyasnpimporttheano.tensorasTimporttheanox=T.dmatrix(‘x‘)#定义一个激励函数s=1/(1+T.exp(-x))logistic=theano.function([x],s)printlogistic([[0,1],[-2,-3]])# 查看详情
python学习第二天(上)(代码片段)
##课前思想###GENTLEMENCODE1* 着装得体* 每天洗澡* 适当用香水* 女士优先* 不随地吐痰、不乱扔垃圾、不在人群众抽烟* 不大声喧哗* 不插队、碰到别人要说抱歉* 不在地铁上吃东西* 尊重别人的职业... 查看详情
docker的学习第二天(代码片段)
Docker架构图 镜像:image,类似于模板的意思,通过这个模板创建容器服务,如tomcat镜像,---》run--->tomcat1容器,提供给服务器 通过这个镜像可以创建多个容器,最终服务运行或者项目就是在容器中容器:container:Docker... 查看详情
c语言学习第二天(代码片段)
常量字符串常量字符例如:\'f\',\'i\',\'z\',\'a\'编译器为每个字符分配空间。\'f\'\'i\'\'z\'\'a\'字符串例如:"hello"编译器为字符串里的每个字符分配空间以\'\\0\'结束。\'h\'\'e\'\'l\'\'l\'\'o\'\'\\0\'基本类型整数型:shortint,int,longint,longlongin... 查看详情
struts学习之路-第二天(action与servletapi)(代码片段)
Struts作为一款Web框架自然少不了与页面的交互,开发过程中我们最常用的request、application、session等struts都为我们进行了一定的封装与处理一、通过ActionContext获取方法说明voidput(Stringkey,Objectvalue)模拟HttpServletRequest中的setAttribute(... 查看详情
第二天学习进度--文本情感分类(代码片段)
昨天学习了简单的文本处理,之后在课后的练习中实现了包括了对tf-idf的处理和基于朴素贝叶斯简单的文本分类基于tf-idf的数据集在出现多个关键词的时候一般能够相对准确对文本进行分类,但是对于相对具有深层含义的内容,... 查看详情
从零开始学习c语言(第二天)(代码片段)
今天我学习了C语言的常量分为:字面常量、const修饰的常量、#define定义的标识符常量、枚举常量。字符串、strlen、while字面常量:指的是输入程序中的值。表示数字如:3、5、100、3.14.....#include<stdio.h>intmain() inta&... 查看详情
学习打卡第二天(代码片段)
1importjava.io.IOException;23publicclassIOTest45publicstaticvoidmain(String[]args)6byte[]buffer=newbyte[1024];7try89intlen=System.in.read(buffer);10Strings=newString(buffer,0,len);11System.out.println("接收到了:"+len+"个字节");12System.out.println(s);13System.out.println("字符串长度为... 查看详情
leetcode剑指offer学习计划第二天题目(代码片段)
剑指Offer06.从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例1:输入:head=[1,3,2]输出:[2,3,1]限制:0<=链表长度<=10000所给代码如下/**1.Defini... 查看详情
python3-基础语法篇(第二天)(代码片段)
本篇博文为Python3零基础学习第二天,本篇博文可以学习到如下知识:1.print输出功能2.input输入功能(包含类型转换)3.字符串的格式化4.range功能5.随机模块random6.流程控制语句(顺序语句,分支语句,循环语句–(while循环,break和continue关键... 查看详情
mycat学习第二天之性能监控,读写分离,集群搭建(代码片段)
MyCat1.MyCat性能监控1.1MyCat-web简介1.2MyCat-web下载安装配置1.3MyCat性能监控1.4Mycat-web之MySQL性能监控指标1.5Mycat-web之SQL监控2.MyCat读写分离搭建2.1MySQL主从复制原理2.2MySQL一主一从搭建2.3MyCat一主一从读写分离2.4MySQL双主双从搭建2.5MyCat双... 查看详情
程序老鸟c#学习:3天学会全部基础--第二天(代码片段)
👉关于作者众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找... 查看详情
三天爆肝快速入门机器学习:knn算法朴素贝叶斯算法决策树第二天(代码片段)
三天爆肝快速入门机器学习【第二天】转换器与预估器KNN算法决策树随机森林个人总结转换器与预估器必须理解的转换器与估计器一转化器回想一下之前做的特征工程的步骤?实例化(实例化的是一个转换器类transformer)... 查看详情
django学习第二天(代码片段)
URL的概念及格式: URL的引入:客户端:知道了url就可以去进行访问; 服务端:设置好了url,别人才能访问到我 URL:网址(全球统一资源定位符);由协议,域名(ipport),路径,参数,锚点等组成 django路由系... 查看详情
3.springboot学习——第一个web应用(代码片段)
1.简介1.1概述SpringBootmakesiteasytocreatestand-alone,production-gradeSpringbasedApplicationsthatyoucan"justrun".WetakeanopinionatedviewoftheSpringplatformandthird-partylibrariessoyoucangetstart 查看详情