您的位置:首页 > 其它

文章标题

2017-01-20 16:02 218 查看

三大框架面试题集锦

1.Hibernate工作原理及为什么要用?

原理:

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Session

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SessionFactory.

为什么要用:

1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码

2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.它很大程度的简化DAO层的编码工作

3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂操作

2.Hibernate是如何延迟加载?

1.Hibernate2延迟加载实现:

a)实体对象

b)集合

2.Hibernate3提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,它节省了服务器的内存开销,从而提高了服务器的性能.

3.Hibernate中怎样实现类之间的关系?

类与类之间的关系主要体现在表与表之间的关系进行操作,他们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,他们通过配置文件中的many-to-one,one-to-many,many-to-many

4.Struts1流程

1.客户端浏览器发出HTTP请求

2.根据web.xml配置,该请求被ActionServlet接收

3.根据struts-config.xml配置,ActionServlet先将请求中的参数填充到ActionForm中,然后ActionServlet再将请求发生到Action进行处理

4.是否验证,需要验证则调用ActionForm的validate方法,验证失败则跳转到input,成功则继续。

5.Action从ActionForm获得数据,调用javabean中的业务方法处理数据。

6.Action返回ActionForward对象,跳转到相应JSP页面或Action

7.返回HTTP响应到客户端浏览器

5.MVC设计模式

modal业务逻辑,是真正完成任务的代码,相当与JavaBean

view视图,显示界面,相当于JSP

controller:控制器,他控制模型和视图的交互过程,相当于servlet

struts1是基于MVC设计模式 hibernate是基于ORM对象关系映射

6.Struts是什么?

struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框 架,是sun和webwork公司联手开发的一个功能非常齐全的框架,struts2和struts1没有任何关系,是一个全新的框架

7.Spring?

核心技术IOC(控制反转,也称依赖注入)和AOP(面向切面编程)

8.Hibernate是什么?

hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,做数据持久化的工具

9.数据库里面的索引和约束是什么?

索引是为了提高数据的检索速度,索引是建立在数据表上,根据一个或多个字段建立的.

约束是为了保持数据的完整性,约束有非空约束,主键约束,外键约束等

10.Spring是什么?

AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将他们插入到应用程序代码中,使用AOP后,公共服务(比如日志,持久性,事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。IOC允许创建一个可以构造对象的应用环境,然后这些对象传递它们的协作对象。IOC反过来就是JNDI。没有使用一堆抽象工厂,服务定位器,单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造,因此是由容器管理协作对象(collaborator),spring既是一个AOP框架,也是一个IOC容器.Spring最好的地方是它有助于你替换对象,有了Spring,只要用JavaBean属性和配置文件加入依赖性(协作对象).然后可以很容易地在需要时替换具有类似接口的协作对象.

11.简述struts2的执行流程

Struts2框架大致可以分为3个部分:核心控制器FilterDispatcher,业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用.

工作流程:

1.客户端浏览器发出HTTP请求

2.根据web.xml配置,该请求被FilterDispatcher接收。

3.根据struts.xml配置,找到需要调用的Action类和方法,并通过IOC方式,将值注入给Action.

4.Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证

5.Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

6.返回HTTP响应到客户端浏览器

1.Action是不是线程安全的?如果不是有什么方式可以保证Actiion的线程安全?

不是, 声明局部变量,或者扩展RequestProcessor,让每次创建一个Action,或者在spring中用scope=”prototype”来管理

2.struts是如何实现MVC模式的?

m:JavaBean或结合EJB组件或者pojo构成

c:Action来实现

v:一组JSP文件及其标签构成

3.struts中的几个关键对象的作用

Action:控制器类, ActionForm:表单对象, DynaValidatorForm:动态form,ActionMapping:配置文件中action节点的信息

4.AOP:面向方面编程,IOC:依赖注入;声明式事务和编程式事务以及一些通用部分

5.Hibernate有哪几种查询数据的方式

hql查询,sql查询,条件查询

6.load()和get()的区别

hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundException;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在, 不存在则创建代理(load时候只查询一级缓存,不存在则创建代理).get()先在一级缓存找,没有去二级缓存找,没有就去数据库找,没有就返回null;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

7.谈谈hinbernate的延迟加载和openSessionInView

延迟加载要在session范围内,用到的时候再加载;

openSessioninview是在web层写了一个filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟加载在session中的这个前提.

8.spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为

spring的事务有声明事务和编程事务

隔离级别:

DEFAULT使用数据库默认的隔离级别

READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题

READ_COMMITTED会出现重复读和幻影读

SERIALIZABLE最安全,但是代价最大,性能影响极其严重

传播行为:

REQUIRED存在事务就融入该事务,不存在就创建事务

SUPPORTS存在事务就融入事务,不存在则不创建事务

MANDATORY存在事务则融入该事务,不存在,抛异常

REQUIRES_NEW总是创建新事务

NOT_SUPPORTED存在事务则挂起,一直执行非事务操作

NEVER总是执行非事务,如果当前存在事务则抛异常

NESTED嵌入式事务.

9.Hibernate中的update()和saveOrUpdate()的区别

saveOrUpdate()

如果对象已经在本session中持久化了,不做任何事

如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常

如果 对象没有持久化标识属性(identifier)表明其是一个新实例化的对象,对其调用save()

如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()

如果对象是附带版本信息的(通过或)并且版本属性的值表明其是一个新实例化的对象.save()它,否则update()这个对象

10.Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理

getHibernatTemplate里面提供了save,update,delete,find等方法

如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会自动被加载

如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernate的autocommit=true

11.Hibernate的缓存机制

1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2.二级缓存

a.应用级缓存

b.分布式缓存

条件:数据不会被第三方修改,数据大小在可接受范围,数据更新频率低,同一数据被系统频繁使用,非关键数据

12.Hibernate的查询方式

Sql,

Hql

1。属性查询

2。参数查询,命名参数查询

3。关联查询

4。分页查询

5。统计函数

13.如何优化Hibernate

1。 使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6。继承类使用显示多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

8. Struts的工作流程

在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把他们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程

(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息

(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户端提交的

表单数据保存到ActionForm对象中

(3)根据配置信息决定是否需要表单验证,如果需要验证,就调用ActionForm的validate()方法

(4)如果ActionForm的validate()方法返回一个不包含ActionMessge的ActuibError对象,就表示表单验证成功

(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给那个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法

(6)Action的execute(方法返回一个Actionforward对象,ActinServlet再把客户端请求转发给ActionForward对象指向的JSP组件

(7)ActionForward对象指向JSP组件生成动态网页,返回给客户

为什么要用:

JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

9.Struts的validte框架是如何验证的?

在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用

10.spring工作机制及为什么要用?

1.spring mvc请求所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller

3.DispatcherServlet请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个viewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端

##Struts的优点:

1.实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现

2.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率.另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许struts是一个很好的起点.

3.页面导航页。 页面导航将是今后一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把我整个系统各部分之间的联系这对于后期的维护有着莫大的好处,尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显

4.提供Exception处理机制

5.数据库连接池管理

6.支持I18N

缺点:

一.转到展示层时,需要配置forward,每一次转到展示层,相信大家都是直接转到jsp,而涉及到转向,需要配置forward,如果有是个展示层的jsp,需要配置十次struts而且还不包括有时候目录,文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更频繁的系统,这样的操作不可想象.

二.Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求,所以action用到的所有的资源都必须统一同步,这个就引起了线程安全的问题.

三.测试不便Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现.不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试

四.类型的转换,Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化.但他的转化都是Class级别,而且转化的类型是不可配置的,类型转化时的错误信息返回给用户也是非常困难的

五.对Servlet的依赖性过强,Struts处理Action时必需依赖ServletRequest和ServletResponse,所以它摆脱不了Servlet容器.

六.前端表达式语言方面Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱.

七.对Action的执行的控制困难.Struts创建一个Action,如果想控制它的执行顺序将会非常困难,甚至你要重新去写Servlet来实现你的这个功能需求

八.对Action执行前和后的处理,Struts处理Action的时候是基于class的hierarchies,很难在action处理前和处理后进行操作

九.对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件.

Struts重要的表单对象ActionForm是一种对象,它代表了一种应用,这个对象至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用struts就不太可能.当然通过结合JavaScript也是可以转弯实现的.

2.Hibernate

Hiberbate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库

Hibernate可以应用在任何使用JDBC的场合,既可以在java的客户端使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE框架中取代CMP完成数据持久化的重任.

优点:

a.Hibrnate使用Java反射机制而不是字节码增强程序来实现透明性

b.Hibernate的性能非常好,因为他是个轻量级框架.映射的灵活性很出色.

c.它支持各种关系数据库,从一对一到多对多的各种复杂操作.

缺点:

一个持久性类不能映射到多个表

传统的架构:

1)Session Bean <->Entity Bean<->DB

为了解决性能障碍的替代架构

2)Session Bean<->DAO<->JDBC<->DB

使用Hibernate来提高上面架构的开发效率的架构

3)Session Bean<->DAO<->Hibernate<->DB

1.内存消耗:采用JDBC的架构2最省内存.Hibernate的架构3次之,EB的架构1最差.

2.运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等,而一般情况下程序员做不到这一点.因此Hibernate架构表现出最快的运行效率

3.开发效率:大项目,特别是持久层关系映射复杂的情况下,Hibernate效率最高

4.分布式,安全检查,集群,负载均衡的支持.

##3.Spring

##Class.forName的作用?为什么要用?

按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotfoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法区创建该类的实例对象了.

有些时候我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时就需要使用Class.forName去动态加载该类,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名.

3.大数据量下的分页解决方法

最好的方法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容.在sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据

sql server:

Stringsql =

"selecttop " + pageSize + " * from students where id not in" +


“(select top ” + pageSize *(pageNumber-1) + ” id from students order by id)” +

“order by id”;

mysql:

Stringsql =

"select* from students order by id limit " + pageSize*(pageNumber-1) +"," + pageSize;


oracle:

Stringsql =

"select * from " +

(select *,rownum rid from (select * fromstudents order by postime desc) where rid<=" + pagesize*pagenumber +") as t" +

"where t>" +pageSize*(pageNumber-1);


##数据连接池的工作机制

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于次数目的池连接. 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙,如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定,当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接.

实现方式,返回的Connection是原始connection的代理,代理Connection的close方法不是真正连接,而是把它代理的connection对象还回到连接池中.

###为什么要用ORM?和JDBC有何不一样?

orm是一种思想,就是把object转变成数据库中的记录,或者把数据库中的记录转变成object,我们可以用jdbc来实现这种思想,其实,如果我们的项目时严格按照oop方式编写的话,我们的jdbc程序不管是有意还是无意,就已经在实现orm的工作了。

现在有许多orm工具,它们底层调用jdbc来实现了orm工作,我们直接使用这些工具,就省去了直接使用jdbc的繁琐细节,提高了开发效率,现在用的较多的orm工具是hibernate。也听说一些其他orm工具,如toplink,ojb等。

xml解析技术

DOM处理大文件时其性能下降的非常厉害,这个问题是由DOM的数结构所造成的,这种结构占用的内存比较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件,用户通过其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

2.你在项目中用到了xml技术的那些方面?如何实现?

用到了数据存储,信息配置两方面.在做数据交换平台交换时,将不是数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理,在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存储在XML文件中

3.Hibernate的基本流程:

配置Configuration对象,产生SessionFactory,创建session对象,启动事务,完成CRUD操作,提交事务,关闭session

4.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件.

5.对Spring的理解

Spring实现了工长模式的工长类,这个类名为BeanFactory(实际是一个接口),在程序中通常BeanFactory的子类ApplicationContext.Spring相当于一个大的工厂类,在其配置文件中通过元素配置用于创建实例对象的类名和实例对象的属性.

6.Spring提供了对AOP技术的良好封装,AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP.实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明.有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLIB.在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类,spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可以实现代理和aop功能.

7.iBatis和Hibernate有什么不同?

相同点;屏蔽jdbc api的底层访问细节,使我们不用与jdbc api打交道,就可以访问数据

ibatis的好处:屏蔽jdbc api的底层访问细节 ,将sql语句与java代码进行分离,提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryObject返回单个对象,提供了自动将实体对象的属性传递给sql语句的参数

Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多,因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句

9.hibernate的inverse属性的作用

解决方案一:按照Object[]数组取出数组,然后自己组bean

解决方案二:对每个表的bena写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数是Bean,然后在hql里面就可以直接生成这个bean了.

10.介绍一下Hibernate的二级缓存

缓存是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用.

Hibernate的Session就是一种一级缓存,我们通常称之为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部,由于Session代表一次会话过程,一个Session和一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务中,在事务结束时就应该关闭.

.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: