java基础概要(面试)

JAVA基础部分(面试)

  1. 8b java的三大特性;
    a).封装:
    1)类:封装的是对象的属性和行为
    2)方法:封装的是具体的业务逻辑功能
    3)访问控制修饰符:封装的是访问的权限
    b).继承:
    1)作用:代码的复用
    2)父类:所有子类共有的属性和行为子类:子类所特有的属性和行为
    3)子继承父后,子具有:父类+子类
    4)单一继承、多接口实现,传递性.
    b)多态:
    1)意义:行为的多态、对象的多态
    2)向上造型、强制类型转换、instanceof
    3)多态的表现形式:
    3.1)重写:主要是依据对象
    3.2)重载:主要是依据参数

  2. JDK、JRE、JVM三者的关系;
    JVM:java虚拟机,加载.class并运行.class
    JRE:java运行环境,除了包含JVM以外还包含运行java程序所必须的环境
    JRE=JVM+java系统类库
    JDK:java开发工具包,除了包含JRE以外还包含开发java程序所必须的命令工具
    JDK=JRE+编译、运行等命令工具
    说明:
    运行java程序的最小环境为JRE
    开发java程序的最小环境为JDK

3.8种基本类型;
byte(字节型,1个字节)、short(短整型,2个字节)、int(整型,4个字节)、long(长整型,8个字节)、
float(单精度浮点数,4个字节)、double(双精度浮点数,8个字节)、
boolean(布尔类型,1个字节)、char(字符类型2个字节)

4.linux系统常用的指令;
pwd:显示当前工作目录
ls:查看当前工作目录的内容
cd:改变当前工作目录
绝对路径:相对于根目录的位置,以/开头
相对路径:相对于当前目录的位置
.:当前目录
…:上一级目录

5.访问权限修饰词作用范围;
public protected 默认(default) private
1)public:公开的,任何类
2)private:私有的,本类
3)protected:受保护的,本类、子类、同包类
4)默认的(default):什么也不写,本类、同包类
类的访问修饰: public和默认的,类中成员的访问修饰: 如上4种都可以

6.Java内存分为哪几个区域;
堆、栈、方法区
1)堆:
1.1)存储new出来的对象(包括实例变量)
1.2)成员变量的生命周期:
创建对象时存在堆中,对象被回收时一并消失
1.3)垃圾:没有任何引用指向的对象
垃圾回收器不定时到内存中清扫垃圾,
回收过程是透明的,不一定发现垃圾就立刻回收,
调用System.gc()可以建议JVM尽快调度GC来回收
1.4)内存泄漏:不再使用的内存没有被及时的回收
建议:不再使用的对象需及时将引用设置为null
2)栈:
2.1)存储正在调用中的方法中的所有局部变量(包括参数)
2.2)调用方法时,会在栈中为该方法分配一块对应的栈帧,
栈帧中存储方法中所有局部变量(包括参数)
方法调用完后,栈帧被清除,局部变量一并失效
2.3)局部变量的生命周期:
调用方法时存在栈中,方法完之后与栈帧一并消失
3)方法区:
3.1)存储.class字节码文件(包括方法)
3.2)方法只有一份,能用this来区分具体的调用对象

7.重写和重载的区别;
1)重写(Override):
1.1)发生在父子类中,方法名相同,参数列表相同,方法体不同
1.2)重写遵循"运行期"绑定,看对象的类型来调用方法
遵从“两同两小一大”原则:
两同:方法名相同,参数列表相同
两小:返回值类型小于等于父类方法返回值类型(基本类型必须等于,void必须一致),
抛出的异常小于等于父类方法抛出的异常
一大:访问权限要大于父类方法访问权限
2)重载(Overload):
2.1)发生在一个类中,方法名相同,参数列表不同,方法体不同
2.2)重载遵循"编译期"绑定,看引用的类型来绑定方法

8.抽象类和接口的区别;
a)声明方法的存在而不实现它的类叫做抽象类
接口是抽象类的变体,是纯抽象类
b)抽象类由关键字abstract来声明
接口由interface声明
c)继承抽象类要使用extends
实现接口要使用implements
d)抽象类可以有构造器,接口中不能有
e)抽象类可以有普通成员变量
接口中的变量默认为public static final
f)抽象类中的抽象方法的访问权限可以是public protected 和默认
接口中的方法默认为public abstract
g)抽象类只能单继承,接口可以多实现
h)抽象类中可以包含静态方法,
接口中不能有
i)抽象类中可以有非抽象方法,
接口中不能有
j)继承抽象类或实现接口,必须实现其中所有的抽象方法,否则其子类也是abstract类型的,
接口的子类如果接口,它们之间是继承关系

9.和equals的区别;
操作符专门用来比较两个变量的值是否相等,
也就是用于比较变量所对应的内存中所存储的数值是否相同,
要比较两个基本类型的数据或两个引用变量是否相等,只能用
操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,
对象本身占用一块内存(堆内存),变量也占用一块内存,
例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,
变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。
对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,
即要看这两个变量所对应的内存中的数值是否相等,
这时候就需要用
操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,
就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,
这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,
所以,表达式ab将返回false,而这两个对象中的内容是相同的,
所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,
例如,String input = …;input.equals(“quit”),许多人稍不注意就使用
进行比较了,
这是错误的,随便从网上找几个项目实战的教学视频看看,
里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,
Object类的equals方法的实现代码如下:
boolean equals(Object o){
return thiso;
}
这说明,如果一个类没有自己定义equals方法,
它默认的equals方法(从Object 类继承的)就是使用
操作符,
也是在比较两个变量指向的对象是否是同一对象,
这时候使用equals和使用==会得到同样的结果,
如果比较的是两个独立的对象则总返回false。
如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,
那么你必须覆盖equals方法,由你自己写代码来决定
在什么情况即可认为两个对象的内容是相同的。

10.Integer和int的区别;
int是java提供的8种原始数据类型之一。
Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
int的默认值为0,而Integer的默认值为null,
即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,
例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,
Integer的默认为null,所以用EL表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,
所以用EL表达式在文本框中显示时,结果为0.
所以,int不适合作为web层的表单数据的类型。
在Hibernate中,如果将OID定义为Integer类型,
那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,
如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,
Integer中还定义了表示整数的最大值和最小值的常量。

11.String、StringBuffer和StringBuild的区别,String类能不能被继承,为什么;
String的长度是不可变的。
StringBuffer是长度可变的,如果对字符串进行频繁操作,特别是进行内容修改,就要使用StringBuffer,如果最后需要String,
使用StringBuffer的toString()方法,线程安全。
StringBuilder是从jdk1.5开始,为StringBuffer补充了一个单线程使用的等价类。通常应该优先使用StringBuilder类,
因为它支持所有的相同的操作,但由于它不执行同步,所以效率较高。
Java.lang.String使用了final修饰,所以不能被继承。
12.说几种常见的运行时异常;
Java异常结构中定义有Throwable类,Exception和Error是其派生的两个子类,其中Exception表示由于网络故障,文件损坏,
设备故障,用户输入非法等情况导致的异常;而Error表示Java运行时环境出现的错误,例如JVM内存耗尽等。
Error和Exception有什么区别?
Error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
Exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
Java异常可以分为可检测异常以及非检测异常,可检测异常即编译期检测到的异常,编译器将强制执行处理或声明规则,
非检测异常不遵循处理或声明规则,编译器不会检查,RuntimeException(运行时异常)属于非检测异常,
因为普通JVM操作引起的运行时异常随时可能发生,此类异常一般是由特定操作引起的,但这些操作在Java程序中会频繁出现,
因此它们不受编译器检查与处理或声明规则的限制。
常见的运行时异常有:

  1. 空指针异常:NullPointerException
  2. 数组下标越界异常:ArrayIndexOutOfBoundsException
  3. 数学异常:IllegaArgumentException,即向方法传递了一个不合法或不正确的参数
  4. 强制类型转换异常:ClassCastException,试图将对象强制转换为不是实例的子类时,抛出该异常。
  5. NumberFormatException:将字符串转换成一种数值类型时,但该字符串不能转换成适当格式,抛出该异常。
    IOException和FileNotFoundException是可检测异常。

13.Collection和Collections的区别,集合常用的方法;
Collection是java.util包下的集合接口,它是各种集合的
父接口,继承它的主要子接口有List和Set。
Collections是java.util包下的类,是针对集合的工具类,
提供了一系列对集合操作的静态方法,如:对各种集合的搜索,排序,线程安全等操作。

14.List和set的区别,ArrayList,Vector和LinkedList的区别;
java体系中,容器类库分为两大类:Collection和Map(映射)Collection中存放的一组各自独立的对象。
Map中存放的是“键-值”对象,是映射的接口,没有继承集合接口
List和Set都是Collection的子接口:
List是一个有序可重复的集合,使用此接口能够精确的控制每一个元素插入位置,用户能够使用索引来访问List中的元素,
这类似于java的数组。主要的实现类有ArrayList和LinkedList。
Set是一个无序不可重复的集合,Set中只能有一个null元素。主要是实现类HashSet。
ArrayList和Vector都是数组方式存储数据,此数组长度大于实际存储的数据数量,以便增加和插入元素,
它们都允许直接按序列号索引元素。但是插入元素要涉及数组元素移动等内存操作,所以查找数据快,修改数据效率低。
Vector由于线程安全,通常性能上较ArrayList差。
LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,
但是插入数据时只需要记录本项的前后项即可,所以插入数据速度较快。

15.throws 和 throw;
throws 在方法中声明,定义要抛出异常,是一种状态表示可能有异常抛出,可以抛出多个异常。
throw 动作,抛出异常实例,在方法中实现,只能抛出一种异常。

16.谈谈final, finally, finalize的区别
final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,
不能重载 (也不能被重写)
finally在异常处理时提供finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch子句就会执行,
然后控制就会进入 finally 块(如果有的话)
finalize方法名。
Java 技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去
之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,
因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的

18.创建线程有哪些方法,同步的方法有几种,都是什么?线程的几种状态,具体流程;
多线程有两种创建方法:继承Thread类或者实现Runnable接口。
实现同步也有两种方法:
一种是同步方法,另一种是同步代码块。
同步方法是在方法返回类型前面加上synchronized关键字
同步代码块是synchronized (这里写需要同步的对象){…}
线程有5中状态:创建(new),就绪(Runnable),运行状态(Running),阻塞状态(Block),死亡状态(Dead)
通过new创建线程,调用start()方法进入就绪状态,获得CPU分配的时间,开始执行run()方法,进入运行状态,
线程可通过调用sleep(),yield(),notify(通知)方法,以及IO阻塞(scanner是IO阻塞)从运行状态进入阻塞状态,阻塞状态结束后,
再次进入就绪状态,然后等待CPU分配时间,等待进入运行状态,线程run方法执行完毕,或者抛出一个未捕获的Exception或Error,
或者直接调用该线程的stop()方法(不推荐使用)进入死亡状态。

19.什么是线程并发?
同一时刻只能有一个线程执行,但多个线程被快速的轮换执行,宏观上以为都在同时运行,并不是真正的同时发生,
这种现象叫做并发。

20.说说java线程安全问题,怎么处理?
由于线程调度的不确定性,多个线程并发读写同一个临界资源时会发生“线程并发安全问题”,
常见的临界资源:多线程共享实例变量或者共享静态公共变量。若想解决线程安全问题,需要将异步操作变为同步操作,
异步操作:多线程并发的操作,相当于各干各的。
同步操作:有先后顺序的操作,相当于你干完我再干。
Java提供了一种内置的锁机制来支持原子性(即不可再分的最小的逻辑执行单位).多个线程无法同时访问;
同步代码块(synchronized关键字修饰),包含两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。
每个Java对象都可以用作一个实现同步的锁,线程进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁,
而且无论是通过正常途径还是抛异常退出都一样,获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

21.TCP和UDP的区别;
TCP与UDP是TCP/IP协议中四层结构中的传输层的两种高级协议;
TCP:即传输控制协议,它是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,
在该连接中要明确客户端与服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过“三次握手”,
由于TCP协议的面相连接的特性,它可以保证传输数据的安全性。
UDP:即用户数据报协议,它是无连接通信,即在数据传输时,数据的发送端和接收端不建立逻辑连接,
就是当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在就会发出数据,
同样接收端收到数据后也不会反馈是否收到数据,使用该协议消耗资源少,通信效率高,所以通常都会用于音频、
视频和普通数据的传输。

22.事务是什么?有哪些属性,并简要说明这些属性的含义。
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,
并用形如begin transaction和end transaction语句(或函数调用)来界定。
事务由事务开始(begin transaction)和事务结束(end transaction)
之间执行的全体操作组成。
事务应该具有4个属性:
原子性、一致性、隔离性、持久性。
这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,
并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其有任何影响。

SQL:结构化查询语言,SQL是在关系数据库上执行数据操作,检索,及维护所使用的标准语言,可以用来查询数据,操纵数据,
定义数据,控制数据。
SQL可分为以下几类:
DDL 数据定义语言 :用于建立,修改,删除数据库对象
create:创建表或其他对象
alter:修改表或其他对象
drop:删除表或其他对象
truncate:删除表数据,
DML 数据操作语言 :用于改变数据表中的数据
insert:插入数据
update:更新表中已存在的数据
delete:删除表中的数据
TCL 事务控制语言: 用来维护数据一致性的语句
Commit:提交,确认已经进行的数据改变
Roolback:回滚,取消已经进行的数据改变
Savepoint:保存点,使当前的事物可以回退到制定的保存点,以便于取消部分改变。
DQL 数据查询语言 : 用来查询所需要的数据
Select语句
DCL 数据控制语言 :用于执行权限的授予和收回操作
Grant;授予,用于给用户或角色授予权限
Revoke:用于收回用户或角色已有的权限
Create user:创建用户。

当一个引用型变量为空时,返回其值,则会出现空指针异常。

jdbc:java连接数据库的一些API规范.具体的实现由数据库厂商去实现。

ORM:Object/Relation Mapping 对象关系映射:描述对象和数据表之间的映射,将java程序中的对象对应到关系数据库中。

23.存储过程和函数的区别:
从参数的返回情况来看: 如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数。
从调用情况来看:
如果在SQL语句(DML或SELECT)中调用的话,一定是存储函数或存储的封装函数不可以是存储过程,但调用存储函数的时候
还有好多限制以及函数的纯度等级的问题,如果是在过程化语句中调用的话,就要看你要实现什么样的功能。函数一般情况下是
用来计算并返回一个计算结果,而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等),
所以虽然他们的语法上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。

24.对触发器的认识:
触发器是表上的程序,主要提供数据添加、修改与删除后的程序处理方法,可以用来检查数据及进行数据更新,也可以分担一些
前端应用程序撰写的逻辑规则。
场景:触发器可以查询其他表,而且可以包含复杂的SQL语句,它们主要用于强制复杂的业务规则或要求。
主要应用场合:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。
2.当表上某行数据的值与其他表中的数据有联系时。
3.当需要对某张表进行跟踪时。

25.谈谈对xml的理解?说明web应用中web.xml文件的作用?
xml即可扩展标记语言,与html一样,都是标准通用标记语言(SGML).xml是Internet环境中跨平台的,依赖于内容的技术,
是当前处理结构化文档,信息的有力工具,是一种简单的数据存储语言,使用一系列简单的技术描述数据,而这些标记可以
用方便的方式建立,虽然xml比二进制占用更多的空间,但xml极其简单易于掌握和使用。web.xml的作用是配置欢迎页面,
servlet,filter,listener等的。

Servlet: sun公司制定的一种用来扩展web服务器功能的组件规范,即在服务器端处理HTTP协议的组件。
组件:在软件开发中,符合一定规范,实现部分功能,并且需要部署到容器中才能运行的软件模块。
容器:符合一定规范,提供组件运行环境的一个程序。
HTTP协议:是w3c制定的一个应用层规范,规定了浏览器和服务器如何通信,以及通信的数据格式。

Servlet是运行在Servlet容器中的,由Servlet容器 来负责Servlet实例查找,创建以及整个生命周期的管理,
Servlet整个生命周期可以分为四个阶段:类装载及实例创建阶段,实例初始化阶段,服务阶段以及实例销毁阶段。
1).类装载及实例创建阶段:
默认情况下Servlet实例是在接受到第一个请求时进行创建并且以后的请求进行复用,
如果有Servlet实例需要进行一些复杂的操作,需要在初始化时就完成,比如打开文件,初始化网络连接等,
可以配置在服务器启动时就创建实例,具体配置方法为在声明servlet标签中添加1标签。
2).初始化 init(ServletConfig config)
一旦Servlet实例被创建,将会调用Servlet的init方法,同时传ServletConfig实例,传入Servlet的相关配置信息,
init方法在整个Servlet生命周期中只会调用一次。
3).服务 service():
为了提高效率,Servlet规范要求一个Servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,
Servlet开发者必须保证该方法的线程安全性。
4).销毁 destory():
当Servlet容器将决定结束某个Servlet时,将会调用destory()方法,在destory()方法中进行资源释放,一旦destory方法被调用,
Servlet容器将不会再发送任何请求给这个实例,若Servelt容器需再次使用该Servlet,需重新再实例化该Servlet实例。
客户端如何与服务端通信:建立连接,发送请求,接收响应
请求数据结构:
请求行:请求的基本信息
消息头:对实体内容的描述
实体内容:浏览器向服务器发送的业务数据
响应数据结构:
状态行:响应的基本信息
消息头:对实体内容的描述
实体内容:服务器向浏览器发送的业务数据。
配置Servlet访问路径的三种方式:

  1. 精确匹配/xx
  2. 通配符/*
  3. 后缀*.xx
    ServletConfig和ServletContext
    都能读取web.xml中为Servlet预设的参数
    Config和servlet是一对一的关系,若数据只有某个servlet使用,用config
    Context和servlet是一对多的关系,若数据给多个servlet使用,用context

JSP:是sun公司制定的一种服务器端动态页面技术的组件规范,JSP是一个后缀为”.jsp”的文件,
主要内容是HTML和少量的Java代码。Jsp文件会被容器转换成一个Servlet类,然后执行,
其本质就是一个Servlet.但它的工作方式与Servlet不太一样,HttpServlet是先由源代码编译为class文件后部署到服务器下的,
先编译后部署。而jsp则是先部署源代码后编译为class文件,先部署后编译,jsp会在客户端第一次请求jsp文件时被编译
为HttpJspPage类(接口servlet的一个子类),该类会被服务器临时存放在服务器工作目录中。

JSP有9大隐含对象(隐含对象:容器自动创建,在JSP文件中可以直接使用的对象),
作用:JSP预先创建这些对象可以简化对HTTP请求、响应信息的访问。
三大输出对象:request(请求信息),response(响应信息),out(输出的数据流)
三大作用域对象:session(会话),application(全局的上下文对象),pageContext(JSP页面上下文)
Servlet对象:page(JSP页面本身),config(Servlet配置对象)
异常对象:exception(捕获网页异常)

EL表达式:
JSP中嵌套了大量的Java代码增加了页面的复杂度,使得页面不够简洁,不方便代码的维护,
为此sun公司制定了JSP标签(类似HTML标签)来代替Java代码。EL表达式是一套简单的计算规则,
用于给jsp标签的属性赋值,也可以直接用来输出。也可以脱离标签使用。
EL表达式的作用可分为三类:访问Bean的属性,输出简单的运算结果,获取请求参数值。

JSTL:Apache组织开发的一套标签库被sun公司整合后,称为标准标签库,配合EL表达式,以达到减轻jsp文件的复杂度、
方便维护jsp文件的目的。
如何开发自定义标签:1.编写Java类,继承SimpleTagSupport类2.+在doTag方法中添加处理逻辑3.配置标签说明文件

Cookie和Session
它们内部的数据可以在多个请求之间共用,
它们的内部数据可以在多个Servlet之间共用,
服务器会给每个浏览器创建一组cookie,一个session。
Cookie存储在浏览器上,服务器压力小,但不安全。
Session存储在服务器上,服务器压力大,安全。
建议:重要的存入session,不重要的存入cookie

过滤器:是servlet规范中定义的一种小型的,可插入的web组件。用来拦截servlet容器的请求和响应过程,以便查看,
提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器通常封装一些web组件,但对于处理客户端请求或
发送响应来说不是决定性的,典型的应用包括记录请求和响应的数据,管理会话属性等。
主要作用是用来处理项目中的公共的业务,记录日志,过滤敏感词,登录检查等。编写一个java类,实现Filter接口。
filter在容器启动时就会创建实例。

监听器:servlet规范中定义的一种特殊的组件,用来监听servlet容器产生的事件并进行相应的处理,它监听的目标是一些对象。
容器产生的两大类事件:生命周期相关的事件,绑定数据相关的事件。
生命周期相关的事件:容器创建或销毁request,session,ServletContext时产生的事件
绑定数据相关的事件:调用了request,session,ServletContext的setAttribute,removeAttribute方法时产生的事件。
创建监听器:创建一个类,实现对应的监听器接口,例如要监听session对象的创建与销毁,就要实现HttpSessionListener.

拦截器:Spring的HandlerMappint处理器支持拦截器应用,当需要为某些请求提供特殊功能时,例如对用户进行身份验证,
就非常适用。
拦截器必须实现HandlerInterceptor接口,这个接口有三个方法,
preHandle():处理器执行前被调用,
方法返回true表示会继续调用其他拦截器和处理器;返回false表示中断流程,不会执行后续拦截器和处理器。
postHandle()处理器执行后,视图处理前调用,此时可以通过modelAndView对象模型数据进行处理或对视图进行处理。
afterCompletion()整个请求处理完毕后调用,如性能监控中我们
可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,只有preHandle返回true时才会执行。

26.jsp有哪些内置对象,作用分别是什么?
1.request表示HttpServletRequest对象,它包含了有关浏览器请求的
信息,提供了几个获取cookie,header和session数据的有用的方法。
2.response表示HttpServletResponse对象,提供了几个用于设置送回
浏览器响应的方法(cookie,消息头等).
3.out:javax.jsp.JspWriter的一个实例,提供了几个方法,用于向浏览器
回送输出结果。
4.pageContext:javax.servlet.jsp.PageContext的一个对象,用于方便
存取各种范围的名字空间,servlet相关的对象的API,并包装了通用的servlet相关功能的方法。
5.session:javax.servlet.http.HttpSession的一个请求对象,可存储用户的
状态信息。
6.application:javax.servlet.ServletContext的一个对象,有助于查找
有关servlet引擎和servlet环境的信息。

7.config:javax.servlet.ServletConfig的一个对象,用于存取servlet实现
的初始化参数.每个jsp文件共有一个config对象。
8.page表示从该页面生成一个servlet实例。
9.exception针对错误页面,来捕捉的例外。
27.session,request的联系和区别:
request对象和session对象最大的区别是生命周期:
requset对象生命周期是针对一个客户的一次请求,当请求完毕之后,request
里边的内容也将被释放掉。
session的生命周期也是针对一个客户端,但是却是在别人设置的会话周期内(
一般是20-30分钟)session里边的内容将一直存在,即便关闭了这个客户端
浏览器session也不一定会马上释放掉的。
其优缺点也很明显:
request占用资源比较少,安全性也比较高,可是相对来说,缺乏持续性。
session相对来说对资源的消耗会大点,安全性相对来说会稍微低点,可它
能实现比如会话跟踪技术。
如果可以使用request,尽量使用request,因为对服务器来说,资源的消耗问题
还是比较重要的。在传递页面过程中request传递到下一个页面就不能再传递了,每按一个网页上的链接就是一个新的request,
当服务器返回给浏览器一个response时,request就结束了,此时保存在request中的对象就不存在了。
但是当你用一个浏览器连到服务器上时,aplication-server会新开一个session给你,当链接超时时或浏览器关闭时session才销毁,
所以说作用的范围是不一样。
session也就可以跟踪用户的状态,session相对于是一个客户端的全局变量,
比如A机与服务器第一次访问时设置session.setAttribute(“aaa”)=“ComputerA”,则在A机访问继续访问的任意一个页面都可以取得
session.getAttribute(“aaa”)的值是ComputerA.
request是某一次访问的局域变量:生命周期是一次请求。
因此login(登录)的变量应该放在session中。
28.转发(forward)和重定向(redirect)的区别:
转发:

  1. 一次请求,地址不变,
  2. 一次请求服务器,只创建一个request,2个组件可以通过requst共享数据,
  3. 只能转发到同项目内部的组件
    重定向:
    1. 两次请求,地址改变
    2. 两次请求服务器会创建两个request,两个组件无法通过它共享数据
    3. 可以重定向到项目外部的组件
    重定向本质是服务器向浏览器发出特殊响应,本次响应包含一个特殊的状码302,还有要访问的目标。

29.get和post的区别:
Form中的get和post方法,在数据传输过程中分别对应了Http协议中的get和post方法。
区别:
1.get是用来从服务器上获得数据,而post是用来向服务器上传数据。

2.get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?“连接,
而各个变量之间使用"&"连接,路径传参。
post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向的URL.实体内容传参。
3.get是不安全的,因为传输过程,数据被放在请求的URL中;post的所有操作对用户来说是不可见的.
4.get传输的数据量小,这主要因为受URL长度限制;而post可以传输大量的数据,所以在上传文件时只能使用post.
5.get限制form表单的数据集,必须为ASCII字符,而post支持整个ISO10646字符集.
6.get是form的默认方法。

30.JSP中动态include和静态include的区别:
动态include中用jsp:include动作实现<jsp:include page=“head.jsp”/>
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数;
静态include用include伪码实现,它不会检查所含文件的变化,适用于包含
静态页面<%@ include file=“head.html”%>.

31.session的基本原理是什么:
session对象的原理在于,服务器可以为客户端创建并维护一个所谓的session对象用于存放数据,在创建session对象的同时,
服务器将会该session对象产生一个唯一编号,这个编号称为sessionID,服务器以cookie的方式将sessionID存放在客户端,
当浏览器再次访问该服务器时,会将sessionID作为cookie信息带到服务器,服务器可以通过该sessionID检索到以前的session对象,
并对其进行访问,需要注意的是,
此时的cookie中仅仅保存了一个sessionID,而相对较多的会话数据保存在服务器对应的session对象中,由服务器来统一保护,
这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销,存放在客户端的用于保存sessionID的cookie会在
浏览器关闭时消除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程成为一个“会话”,
在一个“会话“过程中,可能会向一个应用发出了多次请求,这些请求将共享一个session,
因为这些请求携带了相同的sessionID信息。session对象的正常使用要依赖于cookie,如果考虑到客户端可能处于安全的考虑,
禁用了cookie,应该使用url重写的方式使session在客户端禁用cookie的情况下继续生效。

32.jsp有哪些动作?作用分别是什么?
jsp:include:在页面请求的时候引入一个文件
jsp:useBean:寻找或实例化一个JavaBean
jsp:setProperty:设置JavaBean的属性
jsp:getProperty:输出某个JavaBean的属性
jsp:forward:把请求转到一个新的页面
jsp:plugin:根据浏览器类型为java插件生成object或EMBED标记。

32.解释四种会话跟踪技术:
隐藏表单域、URL重写、cookie、session
1.隐藏表单域:,非常适合不需要大量数据存储的会话应用。
2.URL重写:URL可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3.cookie:一个cookie是一个小的以命名数据元素,服务器使用SET-cookie头标将它作为HTTP相应的一部分,
传送给客户端,客户端被请求保存cookie值,在对同一服务器的后续请求使用一个cookie头标将之返回到服务器,
与其它技术比较cookie的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值。
4.session使用setAttribute(String str,Objcet obj)方法将对象捆绑到一个会话。

33.struts2工作原理:
1,客户发送一个Action请求,请求交给控制器;
2,控制器创建一个ValueStack,将Action压入栈顶;
3,控制器调ActionInvocation组件执行请求处理;
4,ActionInvocation组件调用请求相关的拦截器组件–前部分处理;
5,然后再调用Action组件业务方法;
6,然后调用Result组件处理方法;
7,最后执行拦截器组件–后部分处理;
8,将响应信息输出,为客户端响应。

自动扫描的注解标记:
@Component
@Named
@Repository 持久层组件注解
@Service 业务层组件注解
@Controller 控制层组件注解

指定依赖注入关系
@Resource (只能处理Setter注入)
@RequestMapping(“/login.do”):可以用在类定义和方法定义上,标明这个类或方法与哪一个客户请求对应

网络程序-BS架构
B/S:Browser(浏览器)+Web Server +DB 即:浏览器-服务器-数据库
特点:数据库只负责数据的管理
Web服务器负责业务逻辑的处理
浏览器负责显示提供操作页面
优点:不需要单独安装客户端
开发相对于CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信的。

Servlet是Sun公司制定的一种用来扩展Web服务器功能的组件规范,可以在服务器端处理HTTP协议的组件。
动态的拼资源,即处理HTTP协议。

404错误:
404数字是服务器执行完客户端的请求后,
返回给客户端的一个执行结果的状态编码。
产生的原因:web服务器根据请求地址找不到对应的资源。

  1. 地址错误
  2. Web.xml文件中的name不一致
  3. 工程没有部署成功
  4. Web应用程序部署结构没有遵守Servlet规范

405错误:
服务器找不到service()方法处理请求。

500错误:
程序运行过程中出错
原因:1.Servlet类没有继承HttpServlet或实现Servlet接口
2.web.xml文件中写错
3.service方法中的代码运行时抛出异常。

JSON:是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据,
与XML相比,JSON是在JavaScript中读写结构化数据的更好的方式,因为可以把JSON直接传给eval(),
而且不必创建DOM对象。它是一种数据格式,不是一种编程语言,虽然具有与JavaScript相同的语法形式,
但JSON并不从属于JavaScript,而且并不是只有JavaScript才能使用 JSON。
JSON的两个重要方法:
stringify():把JavaScript对象序列化为JSON字符串。
parse():把JSON字符串解析为原生的JavaScript值。
JavaScript的eval()方法也可以将JSON解析、解释并返回JavaScript对象和数组

Ajax:一种能够向服务器请求额外的数据而无需卸载页面,给用户带来更好的体验的一种技术,
本质是利用浏览器提供的一个特殊的对象(XMLHttpRequest(XHR)对象,一般也可称为ajax对象),
向服务器发送异步请求,服务器返回部分数据,浏览器利用这些数据对当前页面进行部分更新,整个过程页面无需刷新,
不打断用户的操作。异步请求:当ajax对象发送请求时,浏览器不会销毁当前页面,用户仍然可以对当前页面做其他操作。

DOM:文档对象模型,是针对XML但经过扩展用于HTML的应用程序编程接口。即,提供访问和操作网页内容的方法和接口;
DOM把整个页面映射为一个多层节点结构,HTML或XML页面中的每个组成部分都是某种类型的节点,
这些节点又包含不同类型的数据。
BOM:浏览器对象模型,提供与浏览器交互的方法和接口,用来访问和操纵浏览器窗口,使JavaScript有能力与浏览器“对话”。
Window表示浏览器窗口,所有JavaScript全局对象,函数以及变量都自动成为window对象的成员。
常用属性:document:窗口中显示的HTML文档对象
History:浏览过窗口的历史记录对象:back()等同于单击后退按钮;forward():等同于单击前进按钮
Location:窗口文件地址对象:href属性:当前窗口正在浏览的网页地址;reload():重新载入当前网页,等同于按下刷新按钮。
Screen:当前屏幕对象
Navigator:浏览器相关信息

Spring:是一种开源的,用来简化企业级应用开发的应用开发框架。

  1. 简化开发:spring对一些常用的api(如jdbc)做了封装,这样可以大大简化这些api的使用。
  2. Spring帮我们建立对象之间的依赖关系,这样,对象之间的耦合度会大大降低,代码的维护性会很大提高。
  3. Spring还可以集成别的框架,方便这些框架的使用。
    Spring容器是spring框架的一个核心模块,用于管理对象。
    IOC:控制反转,对象之间的依赖关系由容器来建立。
    DI:依赖注入,容器可以通过调用set方法或者构造器来建立对象之间的依赖关系。
    IOC是目标,DI是手段。
    使用注解来简化配置文件:
    组件扫描:容器会扫描指定的包及其子包下面所有的类,如果该类前面有特定的注解比如@Component,
    则容器会将其纳入容器管理(相当于在配置文件里面有一个bean元素。)
    SpringMVC:用来简化基于MVC架构的web应用程序开发的架构。SpringMVC是spring中的一个模块。
    Spring有五大组件:
    DispatcherServlet 前端控制器
    HandlerMapping 映射处理器
    Controller: 处理器
    ModelAndView: (处理结果和视图名)
    ViewResolver 视图解析器。
    工作过程:
    1.请求发给DispatcherServlet来处理,DispatcherServle会依据HandlerMapping的配置调用对应的Controller来处理。
    2.Controller将处理结果封装成ModelAndView,然后返回给DispatcherServlet。
    3.DispatcherServlet会依据ViewResolver的解析调用对应的视图对象(比如jsp)来生成相应的页面。2018/2/23 星期五awe
    注:视图部分可以使用jsp,也可以使用其它的视图技术,比如freemarker,velocity等等。

MyBatis:开源的持久层框架,它的底层仍然是jdbc;mybatis封装了几乎所有的jdbc代码和参数的手工设置以及结果集的检索。

jQuery是一个优秀的JavaScript框架,一个轻量级的JS库,封装了JS,CSS,DOM,提供了一致的,
简洁的API,使用户更方便的处理HTML,Events,实现动画效果,并且方便的为网站提供ajax交互,
它使用户的HTML页面保持代码和HTML内容的分离。总的来说,jQuery是一个JS框架,极大的简化了JS编程。
jQuery对象本质上一个DOM对象数组,它在该数组上扩展了一些操作数组中元素的方法。
DOM对象可以直接转换为jQuery对象: ( D O M 对 象 ) 通 过 (DOM对象) 通过 (DOM)所获得的对象是jQuery对象例如: ( “ p ” ) , (“p”), (p),(img),$(“”);
调用修改方法返回的是jQuery对象:obj.width(218),obj.height(218)
调用读取方法:
若方法返回的是元素,则是jQuery对象:obj.parent(),obj.next()
若方法返回的是文本,则是DOM对象:obj.html(),obj.attr(“src”);
事件:指页面元素状态改变,用户在操作鼠标或键盘时触发的动作。
鼠标事件:onclick ondblclick onmousedown onmouseup onmouseover onmouseout
键盘事件:onkeydown onkeyup
状态改变事件:onload onchange onfocus onblur onsubmit
event对象:事件触发后将会产生一个event对象。
事件属性:通过一个事件属性,可以在某个事件发生时,对某个元素进行某种操作。
任何事件触发后都会产生一个event对象
Event对象记录事件发生时鼠标的位置,键盘按键状态和触发对象等信息。对于event对象,经常需要获得事件源,
事件源:即触发事件的元素(事件的目标节点)
对象是JavaScript中最重要的API
JavaScript包含多种对象:
内置对象:String对象,Number对象,Array对象等,JavaScript中一切皆对象。
外部对象:window对象,DOM对象
自定义对象:

Web三要素:
浏览器,
服务器,
http协议:浏览器与服务器的通信协议。

XML:指可扩展标记语言,是独立于软件和硬件的信息传输工具,XML应用于web开发的许多方面,常用于简化数据的存储和共享。
HTML:是一种部署在服务器上,运行在浏览器上的的文本文件,超文本标记语言,纯文本文件。可以用来设计网页的标记语言,
在HTML页面上,可以嵌套用脚本语言编写的程序段,如javaScript.根据HTTP协议,浏览器发出请求给服务器,服务器作出响应,
给浏览器返回一个HTML,浏览器解释执行HTML,从而显示出内容。
CSS:指层叠样式表,样式定义如何显示HTML元素,样式通常存存在样式表中。CSS就是给HTML增加各种样式的。
JavaScript:是一种嵌入HTML中在浏览器中的脚本语言,具有与java和C语言类似的语法,是一种网页编程技术,
用来向HTML页面添加交互行为,直接嵌入HTML页面,由浏览器解释执行代码,不进行预编译。
JQuery是一个优秀的javaScript框架,一个轻量级的JS库。封装了JS,CSS,DOM,使用户的HTML页面保持代码和HTML内容分离。
Servlet是sun公司制定的一种用来扩展Web服务器功能的组件规范。
JSP:sun公司制定的一种服务器端动态页面技术的组件规范。主要是HTML和少量的java代码,
JSP文件会被容器转换成一个Servlet类,然后执行,它本质就是一个Servlet.
HTTP协议:是w3c制定的一个应用层规范,规定了浏览器和服务器如何通信,以及通信的数据格式。

数据库:
视图(VIEW):也被称作虚表,是一组数据的逻辑表示。视图对应一条SELECT语句,结果集被赋予一个名字,即视图的名字。
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
Select语句基于单表建立,不包含任何函数运算,表达式或分组函数,叫做简单视图,
Select语句基于单表 建立,但包含了单行函数,表达式,分组函数或group by子句,叫做复杂视图,
Select语句基于多个表的,叫做连接视图。
视图的作用:如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询。
视图本质上就是一句select查询语句,所以当访问视图时,只能访问到所对应的select语句中所涉及到的列,对基表中的其他列起到安全和保密的作用,限制数据访问。
查询视图和查询表的操作一样。视图本身并不包含数据,只是基表数据的逻辑映射,当对视图执行DML操作时,实际上是对基表的DML操作。
视图的创建:create [or replace] VIEW view_name AS select empno,ename from emp where deptno=xx;
序列(SEQUENCE):是一种用来生成唯一数字值的数据库对象。
序列是独立的数据库对象,和表是对立的对象,序列并不依附于表。
通常情况下一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。
创建序列:
create sequence sequence_name
start with I increment by j i是序列的第一个值,j是步进 j正,递增,j负,递减
maxvalue m 可序列可生成的最大值是m,最小值是n
minvalue n
cycle | nocycle cache p
序列中有两个伪列,nextval:获取序列的下个值,currval:获取序列的当前值
序列创建后,必须先执行一次nextval,才可执行currval.
索引:是一种允许直接访问数据表中的某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,
可以存放在与表不同的表空间中。
索引记录中存有索引关键字和指向表中数据的指针(地址),对索引进行的I/O操作比对表进行操作要少很多。
索引一旦被建立,将被Oracle系统自动维护,查询语句中不用指定使用哪个索引,索引是一种提高查询效率的机制。
创建索引:reate [unique] index index_name on table(column[,column…]);
Index_name 是索引名,table是表名,column是列名,unique表示唯一索引。
复合索引也叫多列索引,是基于多个列的索引。
如果经常在order by子句中使用job和sal作为排序依据,可以建立复合索引。

约束:约束条件,也称完整性约束条件,约束是建立在数据表上强制执行的一些数据的校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合则无法执行。约束可以保证表中数据的完整性,保证数据间的商业逻辑。
约束类型:
非空约束(not null)un
唯一性约束(unique):uk
主键约束(primary key):pk
外键约束(foreign key):fk
检查约束(check):ck

过滤器 拦截器 AOP 区别?

Spring AOP :看图
底层由AspectJ实现的 反射
动态代理是由JAVA Proxy基于接口 CGLIB基于类代理可以没有接口,不推荐使用

int 和Integer由什么区别?
Java 提供两种不同的类型:引用类型和原始类型(或内置类型);
int 是 java 的原始数据类型,Integer 是 java 为 int 提供的封装类。
Java 为每个原始类型提供了封装类:
原始类型: boolean,char,byte,short,int,long,float,double
封装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和
原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种
类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的
缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与
它们的类型有关。
有没有 length()这个方法? String 有没有 length()这个方法?【基础】
答:数组没有 length()这个方法,有 length 的属性。String 有 length()这个
方法。

描述一下 JVM 加载 class 文件的原理机制? 【基础】
答:JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader
是一个重要的 Java 运行时系统组件。它负责在运行时查找和装入类文件的类。

静态变量和实例变量的区别?【基础】
答:静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直
接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。

java 中实现多态的机制是什么?【基础】
答:方法的覆盖 Overriding 和重载 Overloading 是 java 多态性的不同表现;覆
盖 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个
类中多态性的一种表现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值