final、finally、finalize区别
final关键字可以用于类,方法,变量前,用于表示该关键词修饰的类,方法,变量具有不可变的特性。
finally 当代码抛出一个异常的时候,就会终止方法中剩余代码的处理,并退出这个方法的执行,这个时候如果资源文件被打开没有关闭,就会产生资源回收问题,这个时候我们就可以把关闭语句放在finally中,无论是否遇到异常退出,都会执行关闭语句,保证了资源的合理回收
fnalize方法来自于java.lang.Object,用于回收资源
运行时异常和编译时异常区别?
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指异常)IndexOutOfBoundsException(下标越界异常),这些异常是不检查异常,程序中可以选择捕获异常,也可以不处理,这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,java编译器不会检查它,当程序出现这类异常的时候即使灭有进行处理,编译也会通过
编译时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类,是必须处理的异常,如果不处理就编译不通过无法运行程序
throw和throws区别
throw是语句抛出的一个异常,抛出的是一个对象
语法:throw(异常对象)
throws是方法可能抛出的异常的声明
语法:[(修饰符)(返回值类型)(方法名)([参数列表])[thows(异常类)]{…}
public void doA(int a) throws Exception1,Exception3{……}
String和StringBuffer和StringBuilder区别
String 字符串常量,是不可变的一个对象
StringBuffer是字符串变量(线程安全)是可变长度的字符串,缓冲区默认为16位,主要操作是append和insert方法,可重载这些方法,以接受任何类型的数据,通过append添加字符串,通过insert在指定位置添加字符,
StringBuilde是字符串常量(非线程安全),这个比StringBuffer效率快,两者的方法基本相同
如何获取随机整数?如何获取随机小数?
java.util.Random: //获取随机整数 :nextint(int i)
java.lang.Math.random();获取0-1之间随机小数
线程和进程区别?
如何开启一个线程?
方法一: 继承Thread类
步骤:
方法二:实现Runnable接口*
步骤与继承Thread类一样
注意start()是启动一个线程,当调用start()方法时,系统才会开启一个新的线程,如果调用run()启动线程,并未真正的开启线程,反而会阻塞线程
wait() sleep()区别?
wait()是等待,Object中的方法,只能在同步方法或者同步块中使用,如果不调用notify()或者notifyAll()方法唤醒指定的线程,则不会进入运行状态
sleep()是线程类的方法,调用会暂停此线程指定的时间,到时间之后会自动恢复继续执行下面的代码
ArrayList、Vector、LinkedList区别?
ArrayList是一个可以改变大小的数组内部的元素可以直接通过get与set方法进行访问
LinkedList是一个双链表,在添加,删除,修改元素是,比ArrayList性能高,但是在get与set方面比ArrayList低
Vector属于强同步类,与ArrayList基本完全相同,线程安全但效率低
Collection和Collections区别:
Conllection是一个集合的接口,它提供了对集合对象进行基本操的通用接口方法,它的意义是为各种集合提供最大化的统一操作方法
Conllections是一个包装类,它包含了各种有关集合操作的静态多态方法,它无法实例化,相当于一个工具类
HashMap 和Hashtable 区别?
HsahMap未经同步,可以为null值
Hashtable的方法是同步的,不允许为null值
char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,所以char型变量中可以存储汉字,但是如果一些特殊的字符没有在Unicode编码字符集中,则不能存储这个特殊的汉字。
Get和Post的区别
Forword(请求转发)与Redirect(重定向) 的区别
从地址栏显示说:
请求转发是一次请求,重定向是两次请求
从数据共享说:
转发页面和转发到的页面可以共享request里面的数据
重定向不能共享数据
从运用地方说
请求转发一般用于用户登录的时候,根据角色转发到相应的模块
重定向一般用于用户注销登录返回主页面和跳转到其他的网站等
从效率来说
请求效率高,重定向效率低
request.getSession()reqeust.getSession(false)request.getSession(true) 的区别
getSession()/getSession(true):当session作用域存在的时候,就返回一个session,如果不存在,就新建一个session并返回该对象
getSession(false)当session存在时返回一个session,不存在则返回null
Page和PageContext的区别
page对象是当前页面转换后的servlet类的实类,作用返回是同一页面
pageContext该对象表示jsp页面的上下文,使用该对象可以访问页面中的共享数据,可以通过setAttribute()和getAttribute来设置和存放对象的值
java 反射 getDeclaredField()和getField()的区别
getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.
JSP9大隐视对象中四个作用域的大小与作用范围
pageContext作用域仅限当前页面对象,可以近似于理解为java的this对象,离开当前jsp页面则pageContext中的所有属性值就会丢失。
request作用域是同一个请求之内,在页面跳转是,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值,如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种情境下,request中的属性值会丢失
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失
application最用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享
JDBC连接数据库步骤
加载JDBC驱动程序
通过Class类的forName方法实现,并将驱动地址放进去,成功加载后,会想Driver类的实例注册到DriverManager类中
提供JDBC连接的URL,创建数据库的链接
要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接
使用DriverManager的getConnection()方法传入指定的欲连接的数据库的路径,数据库的用户名和密码
Connection con = DriverManager.getConnection(url,username,password);
创建一个Statement
要执行sql语句,必须获得java.sql.Statement实例
执行静态sql语句,通常通过Statement实例实现
执行动态sql语句,通常通过PreparedStatement实例实现
执行sql语句
Statement接口提供了executeQuery、executeUpdate、execute三种方法
executeQuery 执行select语句,返回ResultSet 结果集
executeUpdate 执行insert update delete 语句
主键和唯一索引的区别
Prepared statement和statement的区别
PreparedStatement提高了代码的灵活性和执行效率,它是Statement接口的子接口,他继承了Statement接口的所有功能,主要是那列解决我们使用Statement对象多次执行同一个Sql语句的效率问题,ParperStatement接口可以支持预编译
还可以提高程序的安全性 防止sql注入,因为Prepared statement是用‘?’传参,具有安全性,而statement用的是‘+’字符串拼接,安全性较低。
数据库三范式
第一范式:数据库表中的所有字段值都是不在分解的原子性
第二范式:需要确保数据库表中的每一行记录都和主键相关,而不能只与主键的某一部分相关
第三范式:表之间如果有关联关系需要在字表建立外键
存储过程概述
可以包含逻辑判断的slq语句集合
是经过预编译,存在于数据库中
通过调用指定存储过程的名字(可有参,可无参)来执行
事务的概述
在数据库中,所谓的事务是指一组逻辑操作单元即一组slq语句,当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交
Class.forName的作用?为什么要用?
加载类:
返回与给定的字符串名称相关联类或接口的Class对象 一般使用这个方法是反射方式创建Class对象,从而可以将一些信息写在文件中,避免硬编码,增加灵活性
cookie被禁止后怎样使用session?
url重写,对所有页面涉及到的连接都是用url重写方式,从而将jsessionId以参数的方式连接到url后面,保证每次页面提交时服务器都能获得sessionID,从而维持和客户端的状态
数据库连接池的原理。为什么要使用连接池
jsp是如何被容器调用和执行的?
编写一个servlet的步骤
为什么要为servlet配置URL映射?
Servlet注册包括两部分,第一,容器如何找到Servlet,利用
Servlet名字
Servlet类的全路径
完成。
第二,客户端如何找到当前的Servlet。利用
Servlet名字
客户端请求路径
完成。
配置URL的主要作用是客户端通过什么路径能去找到Servlet
谈谈servlet的生命周期?
servlet是线程安全的吗?为什么?
不安全。因为Servlet对象在整个过程中,至始至终只有一个对象。以节约服务器资源的消耗,这就意味着很多个线程会同时访问一个Servlet对象。所以线程不安全。
你是如何处理servlet线程安全问题的?
解决Servlet线程安全问题方法有三种
1)编写Servlet类的时候,实现SingleThreadModel接口,将Servlet变成单线程机制。
2)涉及对共享资源访问的时候,使用synchronized同步加锁,实现共享资源的保护。
3)尽量不在Servlet中定义成员变量,使用局部变量。
在三种方法中,最好使用第三种,这样线程安全,并且性能最高。
如何得到客户端的请求参数?
request.getParameter()单个数据
request.getParameterValues()一组数据
request.getParameter和request.getParameterValues的区别,它们的返回值是什么类型?
request.getParameter获得单个表单的数据。返回值是String类型。而request.getParameterValues()是获得表单元素名相同的一组数据。返回值是String[]数组。
response对象的作用?
Response对象是对服务器的响应信息作出的一个封装对象。主要作用有:
1)可以从response中获得输出流对象,从而可以向客户端输出信息
2)可以实现重定向,response.sendRedirect();
3)可以实现URL重写
session和cookie有什么区别
在servlet中定义成员变量(全局变量),有线程安全问题吗?
有,避免使用实例变量是保证servlet线程安全的最佳选择,每个线程有自己私有的栈空间,方法中的临时变量实在栈上分配空间,他们不会影响线程的安全。
MVC设计模式的概念,好处!
M 模型层:专注于处理业务逻辑和业务数据,它可以为多个视图准备数据,提高了应用的可重用性。
V 视图层:用户看到的并与系统交互的界面,接受用户数据,向用户显示相关的数据。
C 控制层:是模型层和视图层联系的纽带,接收视图层提交的请求,调用模型层的业务逻辑,根据业务逻辑的调用结果,控制系统转发的页面
好处:实现了业务逻辑和页面显示处理的分离,J2EE架构实现了业务逻辑和数据存储的分离,界面显示和业务逻辑的分离,各层之间不受影响
过滤器的作用
过滤器允许你拦截请求,还可以允许你控制响应,,还可以能够对请求头,响应头,消息体的数据进行更改,同时,还可以对返回的流信息进行压缩,项目中使用字符编码格式的处理使用了过滤器,过滤器需要在web.xml容器中进行注册,才能被web容器识别
说明Struts2框架的工作原理。
(1)客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。
(2)请求对象被一系列的Servlet过滤器过滤,Struts2中的过滤器有三种。
(3)FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个Action。
(4)如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的对象交给ActionProxy来处理。
(5)ActionProxy通过Configuration Manager 解析框架的配置文件struts.xml,找到需要调用的Action类。
(6)ActionProxy创建一个ActionInvocation实例。
(7)ActionInvocation实例使用命令模式回调Action中的execute()方法,Action调用业务逻辑类完成业务逻辑处理。在调用Action的前后,将调用该Action实际的相关拦截器(Interceptor)。
(8) Action执行完毕,ActionInvocation根据struts.xml中的配置找到相应的返回结果(成为Result)。
Struts2中有哪三层控制器?分别有什么作用?
(1) 过滤器:过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。
(2) 拦截器:拦截器(Interceptor)是Struts2中第二个层次的控制器,能够在Action执行前后运行一些Action类需要的通用功能。
(3) Action: Action 是Struts2的第三个层次的控制器,需要程序员自行开发。Action是Struts2应用中使用数量最多的控制器,调用业务逻辑,执行业务操作,根据执行结果返回结果视图,实现页面导航,被称为业务控制器。
struts2是如何管理action的?
struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。
主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
如何设置一个包的默认拦截器引用?
为一个包指定默认拦截器引用,可以在struts.xml中进行如下配置:
< package name=”chapter01”extends=”struts-default”>
其中default-interceptor-ref的name值可以是拦截器的名字,也可以是拦截器栈的名字。
如何编写并配置自定义的拦截器?
自定义拦截器的步骤如下:
(1)创建类实现Interceptor接口。
(2)覆盖Interceptor接口中的方法,重点实现intercept方法,定义拦截功能。
(3)在标签中使用元素定义拦截器,为拦截器类制定一个名字。
(4)在需要使用该拦截器的Action中使用标签引用拦截器的名字即可使用。
拦截器栈和拦截器有什么区别和联系?
拦截器栈是若干个拦截器的集合,如果某些拦截器总是按照一定的顺序一起工作,那么就可以把这些拦截器组织成一个拦截器栈,通过引用拦截器栈,就可以使用到拦截器栈中的所有拦截器。
拦截器和过滤器的区别
1、拦截器是基于java反射机制的。
2、过滤器依赖于servlet容器.
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
Action接口有什么?
Action接口中定义了五个常量和一个方法。五个常量都是字符串类型,分别是ERROR、INPUT、LOGIN、NONE以及SUCCESS,方法的声明形式是public String execute().自定义的Action类可以实现这个接口,使用其中的常量作为execute方法的返回值,实现execute方法实现业务控制逻辑。
Action类中进行业务控制的方法有什么编码规范?
Action类中进行业务控制的方法必须遵守一定的编码规范,即返回值为String,权限为public,没有形式参数。方法的名字默认为execute,可以被自动调用,如果不是execute,则需要进行配置或指定才能使用。
如果一个Action类中需要处理请求范围属性,使用什么方法实现可以与ServletAPI脱耦?
如果要与ServletAPI脱耦,同时又要处理请求属性,那么可以使用Struts2API中的ActionContext类实现。该类中的普通方法可以向请求范围存属性,该类中的get方法可以从请求范围返回属性。
ActionContext类中的哪个方法可以用来处理会话范围内的属性?
ActionContext中的getSession方法可以返回一个与会话对象相关的Map对象,通过使用该Map对象的put方法,可以往会话中存入属性,通过使用Map对象的get方法可以从会话中返回属性。
ActionContext类中的哪个方法可以用来处理上下文范围内的属性?
ActionContext中的getApplication方法可以返回一个与上下文对象相关的Map对象,通过使用该Map对象的put方法可以往上下文中保存属性,通过使用Map对象的get方法可以从上下文中返回属性。
如果一个Action类中需要获得Servlet API 中的对象进行处理,如何解决?
如果Action 类中需要获得Servlet API 中的对象,那么可以使用ServletActionContext类实现。该类中定义可以下四个方法:
(1) public static PageContextgetPageContext(): 获得PageContext对象。
(2) public static HttpServletRequestgetRequest():获得HttpServletRequest对象。
(3) public static HttpServletResponsegetResponse():获得HttpServletResponse对象。
(4) public static ServletContextgetServletContext():获得ServletContext对象
Struts2框架有哪些封装请求参数的方式?
Struts2 中封装请求参数的方式有两种,即Field_Driven,域模型, Model_Driven。其中Field_Driven是属性封装,在Action类中定义域请求参数对应的属性,并为之提供getters和setters,Struts2框架将自动把请求参数封装到这些属性中。Model-Driven 是模型驱动,Action 类需要实现ModelDriven接口,声明一个与表单对应的JavaBean属性,覆盖其中的getModel方法,回JavaBean实力,Struts2框架将自动把请求参数封装到JavaBean 实例中。
ActionSupport类有什么所用?
ActionSupport类定义了一系列与输入校验有关的方法,如果Action需要对输入进行校验,那么Action必须继承ActionSupport类
如果校验失败,Struts2将导航到什么视图上?
如果校验失败,Struts2框架将导航到当前的Action中名字是input的结果视图上,如果Action中的名字为input的结果视图,则查找名字为input的全局结果,如果依然没有,则发生错误。
Hibernate框架主要解决什么问题
Hibernate框架是一个ORM框架,既对象关系映射框架,能够将Java类与关系型数据表进行映射,同时提供面向对象的数据查询机制,能够最大程度缩短程序员在sql和jdbc上的程序时间,从大量的数据持久层编程工作中解脱出来、
Hibernate的运行原理
在初始化Hibernate是,会首先根据configuration接口去加载并读取Hibernate的配置信息(hibernate.cfg.xml)(一个Configeration实例代表Hibernate所有java类到Sql数据库映射的集合,),然后创建SessionFactory实例,把Configeration对象中的所有配置信息拷贝到SessionFactory的缓存中,最后通过调用SessionFactory创建Session对象,通过Session接口提供的何种方法曹庄数据库的访问(Query和Criteria接口)
Hibernate应用中的映射文件(hbm.xml)主要包括哪些内容?
映射文件中所有元素都存在于根元素hibernate-mapping下,其中使用最多的元素是class,class元素下最常用的子元素有id、property、componnent、subclass、joined-subclass、union-subclass等
Hibernate中持久化对象的三种状态,每种状态有什么特征?
瞬时状态
当通过new操作符实例化一个对象,二者个对象没有被Session对象操作,也就是该对象没有与一个Session对象联时,也不会被赋予持久化标识(ldentifier)
持久状态
如果一个对象与某一个Session对象关联,例如被Session对象刚加载的,刚保存的,刚更新的,那么该对象就成为持久状态对象,持久状态的对象与数据库中一条记录对应,并拥有持久标识(ldentifier)。当持久状态对象有改变时,当前事务提交后,Hibernate会自动检测到对象的变化,并持久化到数据库中
脱管状态
当与持久状态对象关联的Session关闭后,该对象就变成托管状态,托管状态的对象引用依然有效,可以继续使用,当托管状态的对象再次与某个Session关联后,托管装填对象将转变为持久状态对象,托管期间进行的修改将被持久化到数据库中。
HQL语言与SQL语言的区别
延迟加载的概念,如何设置延迟加载
延迟加载的意思是,当查询某个实例时,默认情况下不查询其关联的实例,使用属性lazy可以设置是否使用延迟加载,lazy=”true”表示使用延迟加载,lazy=“false”表好不使用延迟加载
Hibernate中的get和load的区别
加载方式:
load为延迟加载返回的是一个只有id属性的代理,只有使用该对象属性时,才发出sql语句
get为立即加载,执行时,会立即向数据库发出sql语句,返回结果
load检索不到记录是,会抛出ObjectNotFoundException异常
get检索不到记录时,会返回nul
Hibernate五大核心(类/接口)简述
Hibernate中的两大配置文件
*.hbm.xml:主键生成策略,映射关系。一对多。一对一的关系。
Hibernate.cfg.xml:方言,数据库连接信息,包含*.cfg.xm内容,映射文件,也可以配置事务
Hibernate事务处理
开启事务session。beginTransaction();
执行相关的操作,如果成功则session.getTransaction().commit();
执行操作失败则session.getTransaction.rollback();
Hibernate与JDBC的区别
IOC(inversion of control)的理解
一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但是这种方法显然两者的依赖(Dependency)太大了,而IOC的方法只在类A定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IOC容器中,通过一定的配置由容器来实现类A与接口B的实现C的关联,,把对象的实例交给容器的完成。
两种依赖注入方式
setter注入:一般情况下所有的java bean,我们使用setter方法和getter方法去设置和获取属性的值
构造器方法注入,
Dependency Injetion(DI)和IOC(inversion of control)的理解
依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接,控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用的控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它,也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转
Spring的优点
Spring中的applicationContext.xml能不能改为其他名字
ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置
Spring框架有哪几部分组成?