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类型,这样方便我们读取. 在对象-关系映射文件里的

  1. increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.

  2. identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.

  3. sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列

  4. hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用hibernate_unique_key表的next_hi字段

  5. native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.

  6. uuid.hex 代理主键,hibernate采用128位的UUID算法生成标识符,UUID算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.

  7. 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上注册)

其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

2. 为什么要用Dubbo?

Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它主要解决了分布式服务治理的问题。使用Dubbo可以快速创建一个稳定、高效的服务远程调用框架。下面是为什么要用Dubbo的几个原因:

  1. 分布式远程调用

随着业务的发展,我们通常需要将应用系统分别部署在不同的机器上,这时需要在不同的应用之间进行远程调用。Dubbo为服务提供者和服务消费者提供了高效的远程通讯能力,提供了不同协议的支持和负载均衡等机制,保证了远程调用的效率和稳定性。

  1. 服务治理

对于分布式系统来说,必须解决服务治理的问题,管理动态加入或退出的服务和避免服务的雪崩现象。Dubbo提供了注册中心、负载均衡、容错和路由等功能,为服务提供了更完善的治理功能。

  1. 水平扩展

Dubbo对服务提供了良好的扩展性,可以无缝地扩展业务功能和服务提供方的数量。同时,通过服务分组、按权重自动Dubbo等负载均衡机制,可以优化服务提供方的扩容策略,保证了应用在不断扩展的同时能够保持系统的稳定性和性能。

  1. 易于集成

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.ConsoleAppender
 log4j.appender.stdout.Target = System.out
 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
 log4j.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.DailyRollingFileAppender
 log4j.appender.D.File = E://logs/log.log
 log4j.appender.D.Append = true
 log4j.appender.D.Threshold = DEBUG
 log4j.appender.D.layout = org.apache.log4j.PatternLayout
 log4j.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.DailyRollingFileAppender
 log4j.appender.E.File =E://logs/error.log
 log4j.appender.E.Append = true
 log4j.appender.E.Threshold = ERROR
 log4j.appender.E.layout = org.apache.log4j.PatternLayout
 log4j.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会把响应发送给客户端

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小鱼༒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值