Java面试题专题之SSH框架ssm框架面试题Word文件下载.docx
《Java面试题专题之SSH框架ssm框架面试题Word文件下载.docx》由会员分享,可在线阅读,更多相关《Java面试题专题之SSH框架ssm框架面试题Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。
流程:
在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程.
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;
(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;
(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
3、Struts对MVC的体现
M:
在Struts中,模型由JavaBean和EJB组件组成,用来实现程序的业务逻辑部分.
C:
ActionServlet,RequestProcessor和Struts辅助类来实现控制器。
ActionServlet是Struts中的核心控制器ActionServlet会根据在Struts配置文件中的配置将控制权转交给相应的Action类。
Action类是业务的代理,在Action类中可以调用模型组件或者编写其他业务逻辑代码来完成一项具体的业务。
V:
Struts框架中的视图主要由JSP文件构成,在JSP文件中可应用Struts标签和自定义标签来表现模型组件中的数据进行简单的处理。
ActionFormBean实际上是一个遵循了特殊约定的JavaBean,在Struts中ActionFormBean可看作为一个中间存储器在视图与控制器之间进行数据传递。
4、struts1.2和struts2.0的区别?
a、Action类:
struts1.2要求Action类继承一个基类。
struts2.0Action可以是简单的JOPO对象或者(都会)继承ActionSupport基类
b、线程模式
struts1.2Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。
单例策略限制了Struts1.2Action能做的事情,并且开发时特别小心。
Action资源必须是线程安全的或同步的。
struts2.0Action为每一个请求产生一个实例,因此没有线程安全问题。
c、Servlet依赖
struts1.2Action依赖于ServletAPI,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execut方法。
struts2.0Action不依赖于容器,允许Action脱离容器单独测试。
如果需要,Struts2Action仍然可以访问初始的Request和Response。
但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。
d、可测性
测试struts1.2Action的一个主要问题是execute方法暴露了ServletAPI(这使得测试要依赖于容器)。
一个第三方扩展:
strutsTestCase
提供了一套struts1.2的模拟对象来进行测试。
Struts2.0Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。
5、struts如何实现国际化
以下以两国语言(中文,英文)为例:
1.在工程中加入Struts支持
2.编辑ApplicationResource.properties文件,在其中加入要使用国际化的信息,例如:
lable.welcome.china=Welcome!
!
3.创建英文资源文件ApplicationResource_en.properites
4.创建临时中文资源文件ApplicationResource_temp.properites例如:
lable.welcom.china=中国欢迎您!
5.对临时中文资源文件进行编码转换。
可以使用myeclipse的插件,也可以在dos下执行:
native2ascii-encodinggb2312ApplicationResource_temp.propertiesApplicationResource_zh_CN.properties
6.在jsp中加入struts的bean标记库
6、Struts框架的数据验证可分为几种类型?
表单验证(由ActionFormBean处理):
如果用户没有在表单中输入姓名,就提交表单,将生成表单验证错误
业务逻辑验证(由Action处理):
如果用户在表单中输入的姓名为“Monster”,按照本应用的业务规则,不允许向“Monster”打招呼,因此将生成业务逻辑错误。
7、简述FormBean的表单验证流程。
1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionFormBean中。
2、接下来Struts框架会调用ActionFormBean的validate()方法进行表单验证。
3、如果validate()方法返回的ActionErrors对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。
8、简单叙述ActionFormBean的作用
1、ActionFormBean也是一种JavaBean,除了具有一些JavaBean的常规方法,还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。
2、Struts框架利用ActionFormBean来进行View组件和Controller组件之间表单数据的传递。
3、Struts框架把View组件接受到的用户输入的表单数据保存在ActionFormBean中,把它传递给Controller组件,Controller组件可以对ActionFormBean中的数据进行修改JSP文件使用Struts标签读取修改后的ActionFormBean的信息,重新设置HTML表单。
9、Struts优缺点
优点:
1.实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2.有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
3.页面导航
使系统的脉络更加清晰。
通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
4.提供Exception处理机制.
5.数据库链接池管理
6.支持I18N
缺点
一、转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器
二、二、Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。
所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
三、测试不方便.Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。
不过有一个Junit的扩展工具StrutsTestCase可以实现它的单元测试。
四、类型的转换.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这种事件方式称为applicationevent,applicationevent和componentevent相比是一种粗粒度的事件
Java面试题专题之SSH框架篇2
1、Hibernate框架的认识(工作原理)
Hibernate是一个轻量级的持久层开源框架,它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射.
Hibernate内部对JDBCAPI进行了封装,负责Java对象的持久化.
因为它封装了所有的数据访问细节,使得业务逻辑层可以专注于实现业务逻辑.
它是一种优秀的ORM映射工具,提供了完善的对象-关系映射服务,开发过程不依赖容器,灵活性非常大,可以无缝集成到任何一个java系统中
2、为什么要用Hibernate
1.封装了jdbc,简化了很多重复性代码。
2.简化了DAO层编码工作,使开发更对象化了。
3.移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4.支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。
所以说它是一个轻量级框架。
3、缓存:
session缓存:
被称为Hibernate的第一级缓存.它存放被单前工作单元加载的对象.
sessionFactory缓存:
被称为Hibernate的第二级缓存.一个实例对应一个数据存储源.它是线程安全的,是重量级的.
它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等.
4、对象的3个状态
瞬时:
一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,
也没有手动赋值过该实体的持久化标识(持久化标识可以认为映射表的主键)。
此时该实体中的任何属性的更新都不会反映到数据库表中。
持久化:
当一个实体和Hibernate的Session创建了关系,
并获取了持久化标识,而且在Hibernate的Session生命周期内存在。
此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,
也即与对应数据库表保持同步。
脱管:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,
而此时Hibernate的Session的生命周期结束,实体的持久化标识没有被改动过。
针对该实体的任何属性的修改都不会及时反映到数据库表中。
5、性能问题
在批操作性能和cache之间存在不可调和的矛盾,
你要熟悉hibernate一级和二级缓存机制才能写出合理批操作代码,
否则不但性能低下,还可能导致outmemory。
hibernatereference文档中的Bestpractise也提到,
Usehand-codedJDBCinbottlenecks,
也就是说在某些性能瓶颈的地方考虑使用硬编码jdbc。
6、JDBC,Hibernate,EJB三者的区别?
EJB:
我们必须遵守复杂的J2EE规范,Hibernate不强迫必须满足特定的规范.
EJB只能运行在EJB容器中,Hibernate可以运行在任何java环境中.
目前,对于复杂的域模型,EJB容器提供的对象-关系映射能力有限.相比之下,Hibernate提供了完善的对象-关系映射服务.
EJB虽然是一种可以移植的组件,但是实际上却受到很大的限制,因为各个产商生产CMP引擎差异,它们使用的对象-关系映射
元数据各不相同,使得EJB不能顺利的从一个EJB容器移植到另一个EJB容器当中.而Hibernate可以无缝集成到任何一个Java系统中.
JDBC:
实现业务逻辑的代码和访问数据库的代码混杂在一起,使程序结构不清晰,可读性差
7、get和load的区别
1不存在对应记录时表现不一样
2load返回的是代理对象(javassist.jar生成二进制码),等到真正用到对象的内容才会发出SQL语句
3get直接从数据库加载,不会延迟
无论是get还是load,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法,可以强制清除
8、Hibernate是如何延迟加载?
1.Hibernate2延迟加载实现:
a)实体对象b)集合(Collection)
2.Hibernate3提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
9、如何对hibernate进行优化?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显式多态
7.表字段要少,表关联不要怕多,有二级缓存
10、hibernate的核心类是什么,它们的相互关系是什么?
重要的方法是什么?
Configuration接口:
配置Hibernate,根据其启动hibernate,创建SessionFactory对象;
SessionFactory接口:
初始化Hibernate,充当数据存储源的代理,创建session对象,sessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存;
Session接口:
负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存;
Session如下方法:
save,load,update,delete,
Queryq=CreateQuery(“fromCustomerwherecustomerName=:
customerName”)
beginTransaction,close,transaction,commit
Transaction接口:
管理事务;
Query和Criteria接口:
执行数据库的查询。
Java面试题专题之SSH框架篇3
1、Spring的理解
Spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的实现方式,提供对持久层,事务的支持,对当前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了与它们的相整合的方案.
使用Spring,我们能够减少类之间的依赖性和程序之间的耦合度,最大程度的实现松耦合,使程序更加灵活,可扩展性更强.
IOC,中文翻译为“反转控制,"
.DI-"
依赖注入"
指的是:
我们不必自己在程序代码中维护对象的依赖关系,而是通过一个xml配置文件,将类的属性和实例悄悄的注入到类里面.实现类的动态加载,使得类和类之间可以方便的切换(通过接口).
这种设计方式的思想表现为:
高层模块不应该依赖低层模块,而是模块都必须依赖于抽象.程序不应改依赖于实现,而是依赖于抽象接口.应用程序不要去找容器,而是容器给我们所有想要的对象.
Spring的另一个重要的方面是支持AOP的实现:
AOP的中文翻译是:
面向切面编程,也称为面向问题编程.面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性2.源代码无关性
2、Spring注解
Spring2.5中除了提供@Component注释外,还定义了几个拥有特殊语义的注释,它们分别是:
@Repository、@Service和@Controller。
在目前的Spring版本中,这3个注释和@Component是等效的,但是从注释类的命名上,很容易看出这3个注释分别和持久层、业务层和控制层(Web层)相对应。
虽然目前这3个注释和@Component相比没有什么新意,但Spring将在以后的版本中为它们添加特殊的功能。
所以,如果Web应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service和@Controller对分层中的类进行注释,而用@Component对那些比较中立的类进行注释。
在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。
Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
它的作用和在xml文件中使用bean节点配置组件时一样的。
@Service用于标注业务层组件,
@Controller用于标注控制层组件(如struts中的action),
@Repository用于标注数据访问组件,即DAO组件,
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
3、spring的优点都有哪些?
1.降低了组件之间的耦合性,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部
4、Spring里面如何配置数据库驱动?
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。
5、Spring里面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一个ServletContextListener,它在你的web应用启动的时候初始化。
缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。
你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
示例如下:
org.springframework.web.context.ContextLoaderListenercontextConfigLocation/WEB-INF/xyz.xml
6、AOP里面重要的几个名词概念解释
切面(Aspect):
一个关注点的模块化,这个关注点可能会横切多个对象。
事务管理是J2EE应用中一个关于横切关注点的很好的例子。
在SpringAOP中,切面可以使用通用类(基于模式的风格)或者在普