这两天一直忙着面试了,记录一下提问概率较大的面试题。前端
Struts2的工做流程。java
请求在Struts2框架中的处理大概分为如下几个步骤:
1 客户端初始化一个指向Servlet容器的请求;
2 这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action
4 若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类
6 ActionProxy建立一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也可 能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。mysql
SpringMVC的工做原理。程序员
一、 用户发送请求至前端控制器DispatcherServlet面试
二、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。spring
三、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(若是有则生成)一并返回给DispatcherServlet。sql
四、 DispatcherServlet经过HandlerAdapter处理器适配器调用处理器数据库
五、 执行处理器(Controller,也叫后端控制器)。编程
六、 Controller执行完成返回ModelAndView后端
七、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
八、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
九、 ViewReslover解析后返回具体View
十、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
十一、 DispatcherServlet响应用户
说说你对Spring IOC /AOP的理解。
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为什么是反转(有反转就应该有正转了),哪些方面反转了”,那咱们来深刻分析一下:
谁控制谁,控制什么:传统Java SE程序设计,咱们直接在对象内部经过new进行建立对象,是程序主动去建立依赖对象;而IoC是有专门一个容器来建立这些对象,即由Ioc容器来控制对 象的建立;谁控制谁?固然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不仅是对象包括好比文件等)。
为什么是反转,哪些方面反转了:有反转就有正转,传统应用程序是由咱们本身在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙建立及注入依赖对象;为什么是反转?由于由容器帮咱们查找及注入依赖对象,对象只是被动的接受依赖对象,因此是反转;哪些方面反转了?依赖对象的获取被反转了。
Hibernate与MyBatis的区别。
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员每每只需定义好了POJO 到数据库表的映射关系,便可经过Hibernate 提供的方法完成持久层操做。程序员甚至不须要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。而后经过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
Hibernate和Mybatis都是orm对象关系映射框架,都是用于将数据持久化的框架技术。
Hiberante较深度的封装了jdbc,对开发者写sql的能力要求的不是那么的高,咱们只要经过hql语句操做对象便可完成对数据持久化的操做了。
另外hibernate可移植性好,如一个项目开始使用的是mysql数据库,可是随着业务的发展,现mysql数据库已经没法知足当前的绣球了,如今决定使用Oracle数据库,虽然sql标准定义的数据库间的sql语句差距不大,可是不一样的数据库sql标准仍是有差距的,那么咱们手动修改起来会存在很大的困难,使用hibernate只需改变一下数据库方言便可搞定。用hibernate框架,数据库的移植变的很是方便。
可是hibernate也存在着诸多的不足,好比在实际开发过程当中会生成不少没必要要的sql语句耗费程序资源,优化起来也不是很方便,且对存储过程支持的也不够太强大。可是针对于hibernate它也提供了一些优化策略,好比说懒加载、缓存、策略模式等都是针对于它的优化方案。
Mybatis 也是对jdbc的封装,可是封装的没有hibernate那么深,咱们能够再配置文件中写sql语句,能够根据需求定制sql语句,数据优化起来较hibernate容易不少。
Mybatis要求程序员写sql的能力要相对使用hibernate的开发人员要高的多,且可移植性也不是很好。
涉及到大数据的系统使用Mybatis比较好,由于优化较方便。涉及的数据量不是很大且对优化没有那么高,可使用hibernate
为何要使用持久化框架而不用JDBC。
一、 数据库连接建立、释放频繁形成系统资源浪费从而影响系统性能,若是使用数据库连接池可解决此问题。
二、 Sql语句在代码中硬编码,形成代码不易维护,实际应用sql变化的可能较大,sql变更须要改变java代码。
三、 使用preparedStatement向占有位符号传参数存在硬编码,由于sql语句的where条件不必定,可能多也可能少,修改sql还要修改代码,系统不易维护。
四、 对结果集解析存在硬编码(查询列名),sql变化致使解析代码变化,系统不易维护,若是能将数据库记录封装成pojo对象解析比较方便。
写出你熟悉的开源框架以及各自的做用(项目中为何使用SSH)
答:框架:hibernate,spring,struts1/struts2.
Hibernate主要用于数据持久化;封装了JDBC操做;还提供了一个易用的、高效率的对象关系映射框架;
Spring 的控制反转能起到解耦合的做用;
Struts 主要用于请求处理的流程控制;struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;struts有着丰富的taglib,如能灵活运用,则能大大提升开发效率。
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
如何对hibernate进行优化?
1. 使用双向一对多关联,不使用单向一对多
2. 灵活使用单向一对多关联
3. 不用一对一,用多对一取代
4. 配置对象缓存,不使用集合缓存
5. 一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存
spring 的优势都有哪些?
1.下降了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各类应用服务器
9.spring的DI机制下降了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用彻底依赖于Spring,开发者能够自由选择spring的部分或所有
Spring事物的传播属性和隔离级别
PROPAGATION_REQUIRED–支持当前事务,若是当前没有事务,就新建一个事务。这是最多见的选择。
PROPAGATION_SUPPORTS–支持当前事务,若是当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,若是当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,若是当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,若是当前存在事务,则抛出异常。
PROPAGATION_NESTED–若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则进行与PROPAGATION_REQUIRED相似的操做。
ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与JDBC的隔离级别相对应 ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务能够看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另一个事务读取。另一个事务不能读取该事务未提交的数据 ISOLATION_REPEATABLE_READ: 这种事务隔离级别能够防止脏读,不可重复读。可是可能出现幻像读。 它除了保证一个事务不能读取另外一个事务未提交的数据外,还保证了避免下面的状况产生(不可重复读)。 ISOLATION_SERIALIZABLE 这是花费最高代价可是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。