Java基础知识题(五)
系列文章目录
Java基础知识题(一)
Java基础知识题(二)
Java基础知识题(三)
Java基础知识题(四)
Java基础知识题(五)
文章目录
系列文章目录
前言
一 Java的数据连接——JDBC
1. 简述什么是JDBC?重点
2. JDBC PreparedStatement比Statement有什么优势?重点
3. 简述什么时候使用CallableStatement?重点
二 Hibernate
1. 阐述Hibernate工作原理,Hibernate数据持久化?重点
1)创建Configeration类的实例。
2)创建SessionFactory实例
3)调用SessionFactory创建Session的方法
4)通过Session 接口提供的各种方法来操纵数据库访问。
2. 请你简述对Hibernate OR映射的理解?重点
O/R 映射
集合映射
集合类型 映射和描述
关联映射
映射类型 描述
组件映射
映射类型 描述
3. 简述Hibernate数据库标识与主键之间的关系 ?
4. 阐述对于Hibernate的理解,一级和二级缓存的作用,怎么使用缓存的?
5. 谈谈Hibernate与iBatis的区别,哪个性能会更高一些?重点
6.简述为什么要使用Hibernate ?
7. 简述Hibernate的核心组件有哪些?重点
8. 简述Hibernate相比JDBC有什么优势?重点
三 Java分布式服务框架——Dubbo
1. 简述什么是Dubbo ?
2. 为什么要用Dubbo?
3. 简述Dubbo 和 Spring Cloud 有什么区别?重点
4. 简述Dubbo都支持什么协议,推荐用哪种?重点
5. 解释Dubbo需要 Web 容器吗?重点
6. 简述Dubbo内置了哪几种服务容器?重点
7. 简述Dubbo里面有哪几种节点角色?重点
8. 简述Dubbo默认使用什么注册中心 ?
四 Java正则表达式
1. 简述什么是正则表达式(Regular Expression) ?
2. 简述Java正则表达式字符类 ?
3. 简述Java正则表达式预定义字符类 ?重点
4. 简述Java正则表达式重复类 ?重点
五 Java日志
1. 简述Java常用的日志框架
2. 简述Java日志输出级别 ?重点
3. 编写Java代码实现log4j1集成 ?重点
六 Java其他
1. 简述对大O符号(big-O notation)的理解 ?
2. 简述Applet和Servlet有什么区别?
3. 浏览器和Servlet通信使用的是什么协议?
4.解释什么是JSP页面?
5. 阐述JSP请求是如何被处理的?
前言
本文主要讲解Java当中的JDBC连接,Hibwenate、Dubbo、正则表达式、日志等。
一 Java的数据连接——JDBC
1. 简述什么是JDBC?重点
JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语言编程中与数据库连接的API。
JDBC库包括通常与数据库使用相关,如下面提到的每个任务的API -
连接到数据库
创建SQL或MySQL语句
在数据库中执行SQL或MySQL查询
查看和修改结果记录
从根本上说,JDBC是一个规范,它提供了一整套接口,允许以一种可移植的访问底层数据库API。 Java可以用它来编写不同类型的可执行文件,如 -
Java应用程序Java AppletJava ServletsJava ServerPages(JSP)企业级JavaBeans(EJB)
所有这些不同的可执行文件都能够使用JDBC驱动程序来访问数据库,并用于存储数据到数据库中。
JDBC提供与ODBC相同的功能,允许Java程序包含与数据库无关的代码(同样的代码,只需要指定使用的数据库类型,不需要重修改数据库查询或操作代码)。
//更多请阅读:JDBC是什么? -JDBC教程
解释下驱动(Driver)在JDBC中的角色
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver
2. JDBC PreparedStatement比Statement有什么优势?重点
1、相对比较安全,可以防止sql注入
2、有预编译功能,相同操作批量数据效率较高
PreparedStatement 是预编译 ,使用Statement时 sql 中要进行很多的单引号拼接字符串,首先是容易出错也比较麻烦,还有就是存在sql 注入问题这是从安全方面说的。 PreparedStatement 传参数时候用 了占位符 “?”很好的解决了以上Statement的问题。我所体会到得的就是这些。
PreparedStatement是在执行前先输入sql语句,Statement正好相反,是在执行的时候传入sql语句的。
这样的区别在于,PreparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率。
3. 简述什么时候使用CallableStatement?重点
CallableStatement用来执行存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输入参数,也可以有返回结果。非常鼓励使用存储过程,因为它提供了安全性和模块化。准备一个CallableStatement的方法是:
CallableStament.prepareCall();
CallableStatement的所有超级接口为PreparedStatement、Statement、Wrapper。其中继承自PreparedStatement接口。CallableStatement主要是调用数据库中的存储过程。在使用CallableStatement时可以接收存储过程的返回值。CallableStatement对象为所有的DBMS提供了一种标准的形式去调用数据库中已存在的存储过程。对数据库中存储过程的调用是CallableStatement对象所含的内容。有两种形式:1:形式带结果参数;2:形式不带结果参数。结果参数是一种输出参数(存储过程中的输出OUT参数),是存储过程的返回值。两种形式都有带有数量可变的输入、输出、输入和输出的参数。用问号做占位符。
形式带结果参数语法格式: {
? = call 存储过程名[(?, ?, ?, ...)]
}
;
形式不带结果参数语法格式: {
call 存储过程名[(?, ?, ?, ...)]
}
;
PS方括号里面的内容可有可无。
CallableStatement接口中常用的方法。
1:getInt(int parameterIndex)、getInt(String parameterName)、还有getString、getBigDecimal、getString、getDate、getURL等等都类似和PreparedStatement与Statement中的用法类似。
2:registerOutParameter(int parameterIndex, int sqlType):按顺序位置parameterIndex将OUT参数注册为JDBC类型sqlType。
3:wasNull():查询最后一个读取的OUT参数是否为SQL Null。等等还有很多方法,感兴趣的读者可以自行查阅JDK API文档。
二 Hibernate
1. 阐述Hibernate工作原理,Hibernate数据持久化?重点
1.Hibernate 的初始化.
读取Hibernate 的配置信息-〉创建SessionFactory
1)创建Configeration类的实例。
它的构造方法:将配置信息(Hibernate config.xml)读入到内存。
一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。
2)创建SessionFactory实例
把Configeration 对象中的所有配置信息拷贝到SessionFactory的缓存中。
SessionFactory的实例代表一个数据库存储员源,创建后不再与Configeration 对象关联。
缓存(cache):指Java对象的属性(通常是一些集合类型的属性--占用内存空间。
SessionFactory的缓存中:Hibernate 配置信息。OR映射元数据。
缓存-大:重量级对象 小:轻量级对象
3)调用SessionFactory创建Session的方法
1】用户自行提供JDBC连接。
Connection con=dataSource.getConnection();
Session s=sessionFactory.openSession(con);
2】让SessionFactory提供连接
Session s=sessionFactory.openSession();
4)通过Session 接口提供的各种方法来操纵数据库访问。
2. 请你简述对Hibernate OR映射的理解?重点
O/R 映射
目前为止我们已经通过应用 Hibernate 见识过十分基础的 O/R 映射了,但是还有三个更加重要的有关映射的话题需要我们更详细的探讨。这三个话题是集合的映射,实体类之间的关联映射以及组件映射。
集合映射
如果一个实例或者类中有特定变量的值的集合,那么我们可以应用 Java 中的任何的可用的接口来映射这些值。Hibernate 可以保存 java.util.Map, java.util.Set, java.util.SortedMap, java.util.SortedSet, java.util.List和其它持续的实例或者值的任何数组的实例。
集合类型 映射和描述
java.util.Set 它和 \ 元素匹配并且用 java.util.HashSet 初始化。
java.util.SortedSet 它和 \ 元素匹配并且用 java.util.TreeSet 初始化。sort 属性可以设置成比较器或者自然排序。
java.util.List 它和 \ 元素匹配并且用 java.util.ArrayList 初始化。
java.util.Collection 它和 \ 或者 \ 元素匹配以及用 java.util.ArrayList 初始化。
java.util.Map 它和 \ 元素匹配并且用 java.util.HashMap 初始化。
java.util.SortedMap") 它和 \ 元素匹配并且用 java.util.TreeMap 初始化。sort 属性可以设置成比较器或者 自然排序。
对于 Java 的原始数值 Hibernate 采用支持数组,对于 Java 的其它数值 Hibernate 采用支持数组。然而它们很少被应用,因此我也就不在本指导中讨论它们。
如果你想要映射一个用户定义的集合接口而这个接口不是 Hibernate 直接支持的话,那么你需要告诉 Hibernate 你定义的这个集合的语法,这个很难操作而且不推荐使用。
关联映射
实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处。对象间的关系的子集可以用下列四种方式解释。关联映射可以是单向的也可以是双向的。
映射类型 描述
Many-to-One 使用 Hibernate 映射多对一关系
One-to-One 使用 Hibernate 映射一对一关系
One-to-Many 使用 Hibernate 映射一对多关系
Many-to-Many 使用 Hibernate 映射多对多关系
组件映射
作为变量的一员实体类很可能和其它类具有相关关系。如果引用的类没有自己的生命周期并且完全依靠于拥有它的那个实体类的生命周期的话,那么这个引用类因此就可以叫做组件类。
组件集合的映射很可能和正常集合的映射相似,只会有很少的设置上的不同。我们可以在例子中看看这两种映射。
映射类型 描述
Component Mappings 类的映射对于作为变量的一员的另外的类具有参考作用
3. 简述Hibernate数据库标识与主键之间的关系 ?
Hibernate采用对象标识符,也就是通常我们所说的OID来创建对象和数据库表里记录的对应关系,对象的OID和表里的主键对应,所以说OID是非常重要的,不应该让程序来给它赋值.数据库区分同一表的不同记录是用主键来区分.数据库中的主键最重要的3个基本要素就是不允许为null,不允许有重复值,主键永远不会改变.所以通常我们设计表都会设计主键的值为自动增加,没有业务逻辑含义的一组数字,当然针对每个数据库,设置的方法也不同.但是都非常简单.加一个属性就可以了.
而JAVA区分同一类的不同对象是用内存地址,在JAVA语言中判断两个对象的引用变量是否想相等,有以下两种比较方式.1)用运算符”==”比较内存地址,此外还可以用Object的equals方法也是按内存地址比较.2)比较两个对象的值是否相同,JAVA中的一些覆盖了Object类的equals方法实现比较合适.例如String和Date类,还有JAVA包装类.如果是String.equals(String)这种方式的比较就是比较这两个String的值的.如果是Object原是的equals方法就是比较地址了.这点很容易混淆.
通常,为了包装Hibernate的OID的唯一性和不可变性,由Hibernate或者底层数据库来给OID赋值比较合理.因此我们在编程的时候最好把持久化类的OID设置为private或者protected类型,这样可以防止JAVA程序随便更改OID.而OID的get方法我们还是要设置为public类型,这样方便我们读取. 在对象-关系映射文件里的
increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.
identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.
sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列
hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用hibernate_unique_key表的next_hi字段
native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.
uuid.hex 代理主键,hibernate采用128位的UUID算法生成标识符,UUID算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.
assigned 适用于自然主键,由JAVA应用程序负责生成标识符,为了能让JAVA设置OID.不能吧setId方法设置为非公共类型了,这种方式也尽量避免使用.
4. 阐述对于Hibernate的理解,一级和二级缓存的作用,怎么使用缓存的?
Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。
Hibernate的优点:
1、程序更加面向对象
2、提高了生产率
3、方便移植
4、无入侵性。
缺点:
1、效率比JDBC略差
2、不适合批量操作
3、只能配置一种关联关系
Hibernate有四种查询方式:
1、get、load方法,根据id号查询对象。
2、Hibernate query language
3、标准查询语言
4、通过sql查询
Hibernage工作原理:
1、配置hibernate对象关系映射文件、启动服务器
2、服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。
3、通过实例化的Configuration对象建立SeesionFactory实例,通过SessionFactory实例创建Session对象。
4、通过Seesion对象完成数据库的增删改查操作。
Hibernate中的状态转移
临时状态(transient)
1、不处于session缓存中
2、数据库中没有对象记录
java是如何进入临时状态的:1、通过new语句创建一个对象时。2、刚调用session的delete方法时,从seesion缓存中删除一个对象时。
持久化状态(persisted)
1、处于session缓存中
2、持久化对象数据库中没有对象记录
3、seesion在特定的时刻会保存两者同步
java如何进入持久化状态:1、seesion的save()方法。2、seesion的load().get()方法返回的对象。3、seesion的find()方法返回的list集合中存放的对象。4、Session的update().save()方法。
流离状态(detached)
1、不再位于session缓存中
2、游离对象由持久化状态转变而来,数据库中还没有相应记录。
java如何进入流离状态:1、Session的close()。Session的evict()方法,从缓存中删除一个对象。
Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。
5. 谈谈Hibernate与iBatis的区别,哪个性能会更高一些?重点
1、Hibernate偏向于对象的操作达到数据库相关操作的目的;而ibatis更偏向于sql语句的优化。
2、Hibernate的使用的查询语句是自己的hql,而ibatis则是标准的sql语句。
3、Hibernate相对复杂,不易学习;ibatis类似sql语句,简单易学。
性能方面:
1、如果系统数据处理量巨大,性能要求极为苛刻时,往往需要人工编写高性能的sql语句或存错过程,此时ibatis具有更好的可控性,因此性能优于Hibernate。
2、同样的需求下,由于hibernate可以自动生成hql语句,而ibatis需要手动写sql语句,此时采用Hibernate的效率高于ibatis。
6.简述为什么要使用Hibernate ?
对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
.Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
7. 简述Hibernate的核心组件有哪些?重点
Hibernate的核心组件包括:
-Configuration:用于构建Hibernate框架的配置对象,包括Hibernate的配置信息和映射文件信息。
-SessionFactory:用于创建和管理Hibernate的Session对象。
-Session:Hibernate的核心接口,代表着一次会话,提供了持久化操作和事务管理的API。
-Transaction:Hibernate的事务接口,提供了事务管理的API。
-Query和Criteria:用于进行数据查询的API。
8. 简述Hibernate相比JDBC有什么优势?重点
Hibernate 相对于 JDBC 的优点如下:
1 清晰可读的代码:使用 hibernate 有助于消除大量基于 JDBC API 的样板代码,从而使代码看起来更清晰可读。
2 HQL(Hibernate Query Language): Hibernate 提供的 HQL 更接近 Java,本质上是面向对象的。这有助于减轻开发人员编写独立于数据库的查询的负担。在 JDBC 中,情况并非如此。开发人员必须知道特定于数据库的代码。
3 事务管理: JDBC 不支持隐式事务管理。开发人员可以使用提交和回滚方法编写事务管理代码。而 Hibernate 隐式提供了此功能。
异常处理: Hibernate 包装 JDBC 异常并抛出未经检查的异常,如 JDBCException 或 HibernateException。这与内置的事务管理系统一起帮助开发人员避免编写多个 try-catch 块来处理异常。在 JDBC 的情况下,它抛出一个名为 SQLException 的已检查异常,从而要求开发人员编写 try-catch 块来在编译时处理此异常。
4 特殊功能: Hibernate 支持 OOP 功能,如继承、关联,还支持集合。这些在 JDBC 中不可用
三 Java分布式服务框架——Dubbo
1. 简述什么是Dubbo ?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
2. 为什么要用Dubbo?
Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它主要解决了分布式服务治理的问题。使用Dubbo可以快速创建一个稳定、高效的服务远程调用框架。下面是为什么要用Dubbo的几个原因:
分布式远程调用
随着业务的发展,我们通常需要将应用系统分别部署在不同的机器上,这时需要在不同的应用之间进行远程调用。Dubbo为服务提供者和服务消费者提供了高效的远程通讯能力,提供了不同协议的支持和负载均衡等机制,保证了远程调用的效率和稳定性。
服务治理
对于分布式系统来说,必须解决服务治理的问题,管理动态加入或退出的服务和避免服务的雪崩现象。Dubbo提供了注册中心、负载均衡、容错和路由等功能,为服务提供了更完善的治理功能。
水平扩展
Dubbo对服务提供了良好的扩展性,可以无缝地扩展业务功能和服务提供方的数量。同时,通过服务分组、按权重自动Dubbo等负载均衡机制,可以优化服务提供方的扩容策略,保证了应用在不断扩展的同时能够保持系统的稳定性和性能。
易于集成
Dubbo为应用提供了完善的API和SPI,支持Spring、Spring Boot等各种应用框架的集成。此外,Dubbo还提供了REST及异步API等功能,可以更加方便地进行系统集成。
由于Dubbo提供了全面的远程调用、服务治理、水平扩展以及集成方面的功能支持,使得它成为了解决分布式系统中服务调用的重要框架,是企业级应用开发必备的技术之一。
3. 简述Dubbo 和 Spring Cloud 有什么区别?重点
SpringCloud与Dubbo的区别
两者都是现在主流的微服务框架,但却存在不少差异:
初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
组件差异比较多,例如SpringCloud注册中心一般用Eureka,而Dubbo用的是Zookeeper
SpringCloud生态丰富,功能完善,更像是品牌机,Dubbo则相对灵活,可定制性强,更像是组装机。相关资料:
SpringCloud:Spring公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案。
Dubbo:阿里巴巴开源的RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断
4. 简述Dubbo都支持什么协议,推荐用哪种?重点
dubbo://(推荐)
rmi://
hessian://
http://
webservice://
thrift://
memcached://
redis://
rest://
5. 解释Dubbo需要 Web 容器吗?重点
Dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源。 服务容器只是一个简单的Main方法,并加载一个简单的Spring容器,用于暴露服务。 服务容器的加载内容可以扩展,内置了spring, jetty, log4j等加载,可通过Container扩展点进行扩展,参见:Container Spring Container 自动加载META-INF/spring目录下的所有Spring配置。
6. 简述Dubbo内置了哪几种服务容器?重点
Spring Container
Jetty Container
Log4j Container
7. 简述Dubbo里面有哪几种节点角色?重点
Dubbo是一个分布式开发框架
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
8. 简述Dubbo默认使用什么注册中心 ?
推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。
四 Java正则表达式
1. 简述什么是正则表达式(Regular Expression) ?
正则表达式就是一个验证字符串格式是否满足要求的字符串。 使用一个字符串匹配一组字符串,这个字符串就是正则表达式(模式)
2. 简述Java正则表达式字符类 ?
a 字符a
[abc] 匹配a、b、c
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[ ^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[ ^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
3. 简述Java正则表达式预定义字符类 ?重点
. 任意字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\w 单词字符[a-zA-Z_0-9]
^ 行开头
$ 行结尾
X? 一次或0次
X* 0次或多次(包括1次)
X+ 一次或多次
X{n} 恰好n次
X{n,} 至少n次
X{n,m} 至少n次,不超过m次
4. 简述Java正则表达式重复类 ?重点
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
五 Java日志
1. 简述Java常用的日志框架
1 Java Logging API(Oracle)—— Java默认的日志框架
2 Log4j(Apache)——开源日志框架
3 Logback(Logback Project)——开源项目,被设计成Log4j版本1的后续版本
4 tinylog(tinylog)——轻量级开源logger
2. 简述Java日志输出级别 ?重点
java中⽇志级别有7 个级别:
severe、Warning、info、config、fine、finer、finest。
默认情况只记录前三个级别。
另外可以使⽤log4j定义的8个级别的log:
(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:
OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
log4j规定了默认的几个级别:trace 这里要说明一下:
1)级别之间是包含的关系,意思是如果你设置日志级别是trace,则大于等于这个级别的日志都会输出。
2)基本上默认的级别没多大区别,就是一个默认的设定。你可以通过它的API自己定义级别。你也可以随意调用这些方法,不过你要在配置文件里面好好处理了,否则就起不到日志的作用了,而且也不易读,相当于一个规范,你要完全定义一套也可以,不用没多大必要。
ALL:最低等级的,用于打开所有日志记录。
TRACE(追踪): 就是程序推进一下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
INFO: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF: 最高等级的,用于关闭所有日志记录。
3. 编写Java代码实现log4j1集成 ?重点
Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码
导入maven
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>
在resources同级创建并设置log4j.properties
\### 设置###log4j.rootLogger = debug,stdout,D,E\### 输出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n\### 输出DEBUG 级别以上的日志到=E://logs/error.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = E://logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUGlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n\### 输出ERROR 级别以上的日志到=E://logs/error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =E://logs/error.loglog4j.appender.E.Append = truelog4j.appender.E.Threshold = ERRORlog4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appendeE.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n设置日志内容import org.apache.log4j.Logger;public class TestLog4j {private static Logger logger = Logger.getLogger(TestLog4j.class);public static void main(String[] args) {// 记录debug级别的信息logger.debug("This is debug message.");// 记录info级别的信息logger.info("This is info message.");// 记录error级别的信息logger.error("This is error message.");}}
输出结果
首先是控制台的信息
[DEBUG] 2021-06-23 12:00:46,717 method:com.middleware.test.log.TestLog4j.main(TestLog4j.java:11)
This is debug message.
[INFO ] 2021-06-23 12:00:46,719 method:com.middleware.test.log.TestLog4j.main(TestLog4j.java:13)
This is info message.
[ERROR] 2021-06-23 12:00:46,719 method:com.middleware.test.log.TestLog4j.main(TestLog4j.java:15)
This is error message.
六 Java其他
1. 简述对大O符号(big-O notation)的理解 ?
大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。 大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。 同时,大O符号表示一个程序运行时所需要的渐进时间复杂度上界。 其函数表示是: 对于函数f(n),g(n),如果存在一个常数c,使得f(n)<=c*g(n),则f(n)=O(g(n)); 大O描述当数据结构中的元素增加时,算法的规模和性能在最坏情景下有多好。 大O还可以描述其它行为,比如内存消耗。因为集合类实际上是数据结构,因此我们一般使用大O符号基于时间,内存,性能选择最好的实现。大O符号可以对大量数据性能给予一个很好的说明。
2. 简述Applet和Servlet有什么区别?
Applet是运行在客户端主机的浏览器上的客户端Java程序。而Servlet是运行在web服务器上的服务端的组件。applet可以使用用户界面类,而Servlet没有用户界面,相反,Servlet是等待客户端的HTTP请求,然后为请求产生响应
3. 浏览器和Servlet通信使用的是什么协议?
浏览器和Servlet通信使用的是HTTP协议
作用: 规范了浏览器和服务器的数据交互
HTTP协议特点:
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
支持 B/S 及 C/S 模式。
4.解释什么是JSP页面?
JSP页面是一种包含了静态数据和JSP元素两种类型的文本的文本文档。静态数据可以用任何基于文本的格式来表示,比如:HTML或者XML。JSP是一种混合了静态内容和动态产生的内容的技术
JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class)
5. 阐述JSP请求是如何被处理的?
浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求,然后,Web服务器读取这个请求,使用JSP编译器把JSP页面转化成一个Servlet类。需要注意的是,只有当第一次请求页面或者是JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用servlet类,处理浏览器的请求。一旦请求执行结束,servlet会把响应发送给客户端
总结
以上就是今天的内容~
欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。
最后:转载请注明出处!!!
相关文章:
Java基础知识题(五)
系列文章目录 Java基础知识题(一) Java基础知识题(二) Java基础知识题(三) Java基础知识题(四) Java基础知识题(五) 文章目录 系列文章目录 前言 一 Java的数据连接——JDBC 1. 简述什么是JDBC?重点 2. JDBC PreparedStatement比Statement有什么优势&…...
攻防世界-fileinclude
原题 解题思路 题目已经告诉了,flag在flag.php中,先查看网页源代码(快捷键CTRLU)。 通过抓包修改,可以把lan变量赋值flag。在cookie处修改。新打开的网页没有cookie,直接添加“Cookie: languagephp://filte…...
流媒体服务器SRS的搭建及QT下RTMP推流客户端的编写
一、前言 目前市面上有很多开源的流媒体服务器解决方案,常见的有SRS、EasyDarwin、ZLMediaKit和Monibuca。这几种的对比如下: (本图来源:https://www.ngui.cc/zz/1781086.html?actiononClick) 二、SRS的介绍 SRS&am…...
Effective C++条款11——在operator=中处理“自我赋值”(构造/析构/赋值运算)
“自我赋值”发生在对象被赋值给自己时: class Widget {}; Widget w; // ... w w; // 赋值给自己 这看起来有点愚蠢,但它合法,所以不要认定客户绝不会那么做。此外赋值动作并不总是那么可被一眼辨识出来,例如: a[i] a[j]; …...
可视化绘图技巧100篇基础篇(八)-气泡图(一)
目录 前言 适用场景 图例 绘图工具及代码实现 EXCEL 1、单轴气泡图...
Elasticsearch查询之Disjunction Max Query
前言 Disjunction Max Query 又称最佳 best_fields 匹配策略,用来优化当查询关键词出现在多个字段中,以单个字段的最大评分作为文档的最终评分,从而使得匹配结果更加合理 写入数据 如下的两条例子数据: docId: 1 title: java …...
Lock wait timeout exceeded; try restarting transaction的错误
文章目录 一、异常发现二、异常定位1、锁表语句确认2、实际场景排查三、解决思路1、本次解决方式2、其他场景解决思路扩展1、【治标方法】innodb_lock_wait_timeout 锁定等待时间改大2、【治标方法】事务信息查询3、【治标方法】如果杀掉线程依然不能解决,可以查找执行线程耗时…...
ShardingSphere01-docker环境安装
使用docker安装数据库是一个非常好的选择,后续的读写分离、数据分片等功能的数据库都是由docker创建。 一、安装准备 1、前提条件 Docker可以运行在Windows、Mac、CentOS、Ubuntu等操作系统上 Docker支持以下的CentOS版本: CentOS 7 (64-bit)CentOS …...
Java代码审计13之URLDNS链
文章目录 1、简介urldns链2、hashmap与url类的分析2.1、Hashmap类readObject方法的跟进2.2、URL类hashcode方法的跟进2.3、InetAddress类的getByName方法 3、整个链路的分析3.1、整理上述的思路3.2、一些疑问的测试3.3、hashmap的put方法分析3.4、反射3.5、整个代码 4、补充说明…...
区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRBiGRU双向门控循环单元分位数回归时间序列…...
Python面向对象植物大战僵尸
先来一波效果图 来看看如何设计游戏架构 import sysimport pygameclass BaseSprite(pygame.sprite.Sprite):def __init__(self, name):super().__init__()self.image pygame.image.load(name)self.rect self.image.get_rect()class AnimateSprite(BaseSprite):def __init__(…...
大屏模板,增加自适应(包含websocket)
1、简单的Node服务端 const WebSocket require(ws);// 创建 WebSocket 服务器 const wss new WebSocket.Server({ port: 8888 });const getHeader (protocol) > {const protocolArr protocol.split(,)const headers {};for (let i 0; i < protocolArr.length; i …...
电商系统架构设计系列(九):如何规划和设计分库分表?
上篇文章中,我给你留了一个思考题:分库分表该如何设计? 今天这篇文章,我们来聊一下如何规划和设计分库分表,以及要考虑哪些问题。 引言 当要解决海量数据的问题,就必须要用到分布式的存储集群了ÿ…...
从Web 2.0到Web 3.0,互联网有哪些变革?
文章目录 Web 2.0时代:用户参与和社交互动Web 3.0时代:语义化和智能化影响和展望 🎉欢迎来到Java学习路线专栏~从Web 2.0到Web 3.0,互联网有哪些变革? ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&#x…...
QT中资源文件resourcefile的使用,使用API完成页面布局
QT中资源文件resourcefile的使用 之前添加图标的方法使用资源文件的方法创建资源文件资源文件添加前缀资源文件添加资源使用资源文件中的资源 使用API完成布局使用QHBoxLayout完成水平布局使用QVBoxLayout完成垂直布局使用QGridLayout完成网格布局 在Qt中引入资源文件好处在于他…...
2337. 移动片段得到字符串
题目描述: 给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中: 字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动&a…...
Java并发编程第5讲——volatile关键字(万字详解)
volatile关键字大家并不陌生,尤其是在面试的时候,它被称为“轻量级的synchronized”。但是它并不容易完全被正确的理解,以至于很多程序员都不习惯去用它,处理并发问题的时候一律使用“万能”的sychronized来解决,然而如…...
6.小程序api分类
事件监听 以on开头,监听某个事件触发,例如:wx.WindowResize事件 同步 以Sync结尾的是同步,可以通过函数返回值直接获取,例如:wx.setStorageSync 异步 需要通过函数接收调用结果,例如&#…...
什么是PPS和TOD时序?授时防护设备是什么?
介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术,它们在许多领域都有广泛的应用,总的来说,PPS和TOD被广泛应用于各种需要高度精确时间同步的领域,包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS(…...
推荐一款好用的开源视频播放器(免费无广告)
mpv是一个自由开源的媒体播放器,它支持多种音频和视频格式,并且具有高度可定制性。mpv的设计理念是简洁、高效和功能强大。 软件特点: 1. 开源、跨平台。可以在Windows\Linux\MacOS\BSD等系统上使用,完全免费无广告。Windows版解压…...
STM32 CubeMX (第三步Freertos中断管理和软件定时)
STM32 CubeMX STM32 CubeMX (第三步Freertos中断管理和软件定时) STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)使用STM32 CubeMX 库,配置Fre…...
Java虚拟机(JVM):堆溢出
一、概念 Java堆溢出(Java Heap Overflow)是指在Java程序中,当创建对象时,无法分配足够的内存空间来存储对象,导致堆内存溢出的情况。 Java堆是Java虚拟机中用于存储对象的一块内存区域。当程序创建对象时,…...
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
静态库编写: 编写.o文件gcc -c(小写) seqlist.c(需要和头文件、main.c文件在同一文件目录下) libs.a->去掉lib与.a剩下的为库的名称‘s’。 -ls是指库名为s。 -L库的路径。 makefile文件编写: CFLAGS-Wall -O2 -g -I ./inc/ LDFLAGS-L./lib/ -l…...
Php“牵手”淘宝商品详情页数据采集方法,淘宝API接口申请指南
淘宝天猫详情接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用。 一、…...
如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…...
Docker之Compose
目录 前言 1.1Docker Swarm与Docker Compose 1.1.1Docker Swarm 1.1.2Docker Compose 1.1.2.1 三层容器 编辑 二、YAML 2.1YAML概述 2.2注意事项 2.3Docker Compose 环境安装 2.3.1下载 三、Docker-Compose配置常用字段 四、Docker-compose常用命令 五、Docker…...
安装chromedriver 115,对应chrome版本115(经检验,116也可以使用)
目录 1. 查看Chrome浏览器的版本2. 找到对应的chromedriver3. 安装ChromeDriver 1. 查看Chrome浏览器的版本 点进这个网站查看:chrome://settings/help (真是的,上一秒还是115版本,更新后就是116版本了,好在chromedi…...
排序算法:插入排序
插入排序的思想非常简单,生活中有一个很常见的场景:在打扑克牌时,我们一边抓牌一边给扑克牌排序,每次摸一张牌,就将它插入手上已有的牌中合适的位置,逐渐完成整个排序。 插入排序有两种写法: 交…...
掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「上篇」
在当今的AIGC时代,我们面临着越来越多的人工智能技术和应用。其中一个引人注目的工具就是Prompt(提示)。它就像是一种魔法,可以让我们与AI助手进行更加互动和有针对性的对话。那么,让我们一起来了解一下Prompt…...
JMeter - 接口压力测试工具简单使用
【启动前配置】 启动JMeter前可以先配置语言和编码: 修改:E:\JMeter\apache-jmeter-5.5\bin\jmeter.properties文件中: 1.language=en # 指定语言 language=zh_CN 2.sampleresult.default.encoding=ISO-8859-1 # 指定编码 UTF-8 sampleresult.default.encoding=UTF-8 也…...
做网站建设公司起名/明星百度指数在线查询
经过前面的一篇博客,Java—类反射(1),相信大家对类反射有了一定的了解了。 下面来进行对类反射的加强,了解一下怎么通过类反射去new一个对象, 怎么通过类反射去访问其他类的方法。 怎么通过类反射去访问其他类的成员变量。 大家…...
长沙市制作企业网站公司/东莞网络优化排名
siri早上好捷径分享Siri isn’t all that great to begin with, but here are some ways to at least improve the Siri experience and get her to understand you better when shouting voice commands. 首先,Siri并不是很好,但是这里有一些方法至少可…...
中国建设银行网站下载/对网站外部的搜索引擎优化
前言 转载自:https://blog.csdn.net/wangzibai/article/details/115283755 场景 在学习谷粒商城的过程中,我这边使用的springboot 版本和spring cloud版本比较高,所以一些配置不一样。 我这边springboot版本是2.5.0,spring cloud版…...
有了网站怎样做公众号/做网站排名服务热线
2019独角兽企业重金招聘Python工程师标准>>> 相信大家对代码质量规范已经不陌生,一般大公司都会进行代码质量检查,用来管理N多项目的质量,如果达不到要求,那么不好意思,请去搞搞代码,从今往后就…...
做以个一元购的网站多少钱/出词
编译原理三大圣书——龙书、虎书、鲸… 看到一位大神的博客时,博客中提到了三本书——龙书、虎书、鲸书。因为自己知识浅薄,所以在此之前还没有听说过这三本书。但是还在想这博客的内容是关于编译和链接的,干嘛要说起这三本和动物有关的书&am…...
wordpress远程图片下载插件/站长素材
flowable 新增了idm模块,主要用于管理flowable-admin、flowable-idm、flowable-modeler、flowable-rest、flowable-task等模块。 flowable idm用于管理 的表如下: act_id_priv、act_id_group、act_id_membership、act_id_priv_mapping、act_id_property、…...