注:资料有书为证,大伙可放心翻阅并熟记,由本人亲自整理总结!
1、什么是Struts框架?
Struts框架的名字起源于在建筑与旧式飞机中使用的支持的金属架,它是由自定义标签、信息资源、Servlet和JSP组成的一个可重用的MVC2模式的框架。
控制器主要包括ActionServlet和RequestProcessor,其中,ActionServlet类是MVC实现的控制器部分,是整个框架的核心部分,它通过struts-config.xml配置文件来确定处理请求的Action类。
需要注意的是Action不是一个线程安全的类!它采用的是适配器设计模式。
模型可以分为系统的内部状态和可以改变状态的操作。
使用Struts的优点是:
①、由于采用了MVC模式,因此它实现了表现与逻辑的分离,使得系统有较好的可扩展性。
②、提供了页面导航功能,是系统的脉络更加清晰。
③、提供了表单的验证功能,进一步增强了系统的健壮性。
④、提供了数据库连接池管理。
⑤、提供了Exception处理机制。
⑥、支持国际化。
但它也有缺点:
①、Taglib中包含了大量的tag,初学难度大。
②、包含许多XML格式的配置文件,不易配置且不易管理。
③、只能支持Web应用程序的开发。
④、Action不是线程安全的,很多资源都要进行同步。
⑤、单元测试不便。
⑥、部署麻烦。
⑦、对Servlet的依赖性过强。
2、Struts框架响应客户请求的工作流程是什么?
①、检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
②、如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
③、根据配置信息决定是否需要表单验证。如果验证,就调用ActionForm中的validate()方法。
④、如果ActionForm中的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象就表示表单验证成功。
⑤、ActionServelt根据ActionMessage实例包含的映射信息决定将请求转发给哪个Action。如果对应的Action实例不存在,就显创建一个实例,然后调用Action的execute()方法。
⑥、Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
⑦、ActionForward对象指向的JSP组件生成动态页面,返回给客户。
3、Struts框架的数据验证可分为几种类型?
数据验证可以分为表单验证和业务逻辑验证;
其中表单验证有ActionForm Bean处理,该方式重写ActionForm的validate()方法,在该方法内对所有字段进行基本的校验。
业务逻辑验证由Action处理,实际上就是在Action中的execute()方法前面增加数据验证的部分代码。
4、Form Bean的表单验证流程是什么?
Form Bean的表单验证主要有以下4个步骤:
①、用户提交HTML表单后,Struts框架会自动把表单数据组装到ActionForm Bean中。
②、 Struts 框架调用ActionForm Bean的validate( )方法进行表单验证。
③、如果validate( )方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
④、如果ActionErrors中包含ActionMessage 对象,就表示发生了验证错误,Struts 框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件中,视图组件通过< html: errors >标签把request范围内的ActionErors对象中包含的错误消息显示出来,提示用户修改错误。
5、在Struts配置文件中,元素包含哪些属性和元素?
6、ActionFormBean的作用有哪些?
Action一般用于控制业务逻辑的处理,ActionForm Bean用于封装用户请求的参数。
作用有三点:
①、专门用来传递表单数据的数据传递对象。
②、Struts框架利用ActionForm Bean来进行View组件和Controller组件之间表单数据的传递。
③、Struts框架把View组件接收到的用户输人的表单数据保存在ActionForm Bean中,然后把它传递给Cotoller组件,Cntroler 组件可以对ActionForm Bean中的数据进行修改,JSP文件使用Stuts 标签读取修改后的AcioFo Ben的信息,重新设置HTML表单。
7、ActionForm的执行步骤有哪些?
①、检查Acion的映射,确定Action 中是否已经配置了对ActionFormm 的映射。
②、根据name属性查找Form Bean的配置信息。
③、检查Action的FormBean的使用范围,确定在此范围下是否已经有此FormBean的实例。假如当前范围下已经存在此Form Bean 的实例,而且对当前请求来说,是同一种类型的话,那么就重用。否则,就重新构建个Form Bean的实例。
④、Form Bean的reset( )方法被调用。
⑤、调用对应的setter( )方法,对状态属性赋值。
⑥、根据validate的属性选择调用方法。如果validate的属性被设置为true,那么就调用Form Bean 的validate( )方法。如果validate( )方法没有返回任何错误,控制器将ActionForm 作为参数传递给Action实例的execute( )方法并执行。
8、forward与global-forward的区别。
forward的主要作用是根据Action返回的值找到对应的JSP页面;global-forward是全局forward,当多个Action返回同一个值时,例如在分页时或者得到数据列表时可将这个forward元素写在global-forward中,这样就不用每次都在Action里面配置forward了。
9、Struts 1与Struts 2有哪些区别
Struts 1框架由ActionForm 和JavaBean组成,其中ActionForm 用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet 转发给Action, Action 根据ActionFrom 里面的请求参数处理用户的请求。Struts 2框架的基础是核心控制器FilterDispatcher,它包含了框架内部的控制流程和处理机制。
具体而言,主要表现在以下几个方面:
①、风险控制;②、Action实现类;③、线程模式;④、Servlet依赖;⑤、可测性;⑥、封装请求参数;⑦、表达式语言;⑧、绑定值到视图;⑨、类型转换;⑩、数据校验;⑪Action执行控制;⑫捕获输入。
10、什么是IOC?
控制反转有时也被称为依赖注入,是一种降低对象之间耦合关系的设计思想。
使用设计模式中的工厂模式把创建对象的行为包装起来可以增强系统的可扩展性。
具体而言,IOC主要有以下两个方面的优点:
①、通过IOC容器,开发人员不需要关注对象如何被创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的“热插拔”。
②、IOC容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试。
缺点是:
①、对象是通过反射机制实例化出来的,因此会对系统的性能有一定的影响。
②、创建对象的流程变得比较复杂。
11、什么是AOP?
面向切面编程是对面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态地修改模型以满足新的需求。
12、什么是Spring框架?
Spring是一个J2EE矿建,这个框架提供了对轻量级IOC的良好支持,同时也提供了对AOP技术非常好的封装、
Spring主要由七个板块组成:Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context、Spring Web MVC、Spring Core。
Spring工作的原理:
Spring有着非常广泛的用途,不仅可以在Web容器中用来管理Web服务器端的模块,还可以用来管理用于访问数据库的Hibernate。
除此之外,Spring还有如下好处:
①、在使用J2EE开发多层应用程序时,Spring有效地管理了中间层的代码,由于Spring采用了控制反转和面向切面编程的思想,因此这些代码非常容易进行单独测试。
②、使用Spring有助于开发人员培养一个良好的编程习惯:面向接口编程而不是面向类编程。面向接口编程使得程序由更好的可扩展性。
③、Spring对数据的存取提供了一个一致的框架。
④、Spring通过支持不同的事务处理API的方法对事务的管理提供了一致的抽象方法。
⑤、使用Spring框架编写的大部分业务对象不需要依赖spring。
13、什么是Hibernate?
Hibernate是一个开放源代码的对象关系映射,它对JDBC进行了轻量级的对象封装,Hibernate实现了Java对象与关系数据库记录的映射关系。
Hibernate提供的5个核心接口,分别是Session、SessionFactory、Transaction、Query和Configuration
Hibernate的使用过程如下:
①、应用程序通过Configuration类读取配置文件并创建SessionFactory对象。
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
②、通过SessionFactory生成一个Session对象。
Session session = sessionFactory.openSession();
③、通过Session对象的beginTrancation()方法创建一个事务。
④、在完成所有持久化操作与事务操作后需要关闭Session与SessionFactory。
Hibernate的好处:
①、提高开发效率。
②、使得开发可以完全采用面向对象的思想,不需要关心数据库的关系模型。
③、使用Hibernate开发的系统有很好的可移植性。
④、支持透明化,Hibernate的API没有侵入性。
尽管如此,但Hibernate只适合用于针对单一对象简单的增删改查操作,对于批量的修改删除的场合不适用。
拓展1:在使用Hibernate时如何提高性能?
①、延迟加载;②、缓存技术;③、优化查询语句;
拓展2:Hibernate中怎样实现类之间的关系?
类之间的关系主要体现在表之间的关系,它们都是对对象进行操作,程序中把所有表与类都映射在一起,它们通过配置文件的many-to-one,one-to-many,many-to-many来进行配置。
14、什么时HIbernate的二级缓存?
缓存的目的是为了通过减少应用程序对物理数据源访问的次数来提高程序运行的效率,原理则是把当前或接下来一段时间可能会用到的数据保存到内存中,在使用时直接从内存中读取,而不是从硬盘中去读取。
在Hibematle 中有一级缓存与二级缓存的概念,一级缓存由 Session来管理,二级缓存由SessionFactory 来管理。在使用时,二级缓存是可有可无的, 但一级缓存是必不可少的。
一级缓存使用的场合如下: 当使用Session查询数据时,首先会在该Session内部查找该对象的是否存在,若存在,则直接返回,否则,就到数据库中去查询,并将查询的结果缓存起来以便后期使用。一级缓存的缺点就是当使用Session来表示一次会话时,它的生命周期较短,而且它是线程不安全的, 不能被多个线程共享,因此,在实际使用时,对效率的提升不是非常明显。
鉴于以上原因,二级缓存的概念被引入了。二级缓存用来为Hibernate配置一种 全局的缓存,以便实现多个线程与事务共享。在使用了二级缓存机制后,当查询数据时,会首先在内部缓存中去查找,如果不存在,接着在二级缓存中查找,最后才去数据库中查找。与一级缓存相比,二级缓存是独立于Hibernate的软件部件,属于第三方的产品。
二级缓存一般适用于以下几种情况:
①、数据量较小;②、对数据的修改较少;③、不会被大量的应用共享的数据;④、不是很重要的数据。
15、Hibernate中session的update()和saveOrUpdate()、load()和get()有什么区别?
Hibernate的对象有3种状态,分别为瞬时态、持久态和脱管态。处于持久态的对象也被称为PO,瞬时对象和托管对象也被称为VO。
saveOrUpdate( )方法同时包含了save() 和update( )方法的功能。Hibernate 会根据对象的状态来确定是调用save( )方法还是调用update( )方法:若对象是持久化对象,则不进行任何操作,直接返回;若传入的对象与session中的另一个对象有相同的标识符,则抛出一个异常;若对象的标识符属性在数据库中不存在或者是一个临时值,则调用save( )方法把它保存到数据库中,否则, 调用update( )方法更新对象的值到数据库中。鉴于此,在使用时,若能确定对象的状态,则最好不要调用saveOrUpdatere )方法,这样有助于提高效率,例如,如果能够确定这个对象所对应的值在数据库中肯定不存在.那么前可以直接调用save( )方法。
get()方法与load()方法都是用来通过从数据库中加载所需的数据来创建一个持久化的对象,它们主要有以下几个不同点:
①、如果数据库种没有这个对象,load()方法会抛出一个ObjectNotFoundException异常,而get()方法则会返回null。
②、get()方法首先查询Session内部缓存,若不存在,则接着查询二级缓存,最后查询数据库;而load()方法在创建时会首先查询Session内部缓存,如果不存在,就创建代理对象,实际使用数据时才查询二级缓存和数据库,因此load()方法支持延迟加载。
③、get()方法永远只返回实体类,而load()方法可以返回实体类的代理类实例。
④、get( )方法和find( )方法都是直接从数据库中检索,而load( )方法的执行则比较复杂;首先查找Session的persistent Context 中是否有缓存,若有,则直接返回;若没有,则判断是否是lazy。如果不是,直接访问数据库检索,查到记录返回,查不到抛出异常;若是lazy,则需要建立代理对象,对象的initialized 属性为false, target 属性为null。 在访问获得的代理对象的属性时检索数据库,若找到记录, 则把该记录的对象 复制到代理对象的targe上,并将initialized置为true;若找不到,就抛出异常。
16、Hibernate有哪些主键生成策略?
Assigned;Hilo;Seqhilo;Increment;Identity;Sequence;Native;UUID;Foregin GUID;select;
17、如何实现分页机制?
即不是把用户所需数据一次性全部查找出来,而是把数据分成很多的页,每一页只包含指定的记录数,在查询时根据需求每次只查找一页或多页的数据而不是所有数据。
由于采用分页机制使得查询的结果集中数据量减少了,同时降低了内存的消耗,因此可以显著降低响应时间,有助于提高系统的可用性,增强用户体液。
(1) Hibernate 自带的分页机制
Hibernate提供了一个支持跨系统的分页机制,该机制保证无论底层是什么样的数据库都能使用统一的接口进行分页操作。其用法如下:首先,通过Session对象获取Query对象;其次,使用Query对象的setFirstResult( )方法来设置要查询的第一行数据;最后,用setMaxResults( )方法来设置要查询结果集的大小。
(2)用SQL语句来实现分页(limit关键字)
18、什么时SSH?
SSH时Struts、Spring和Hibernate的首字母组合。
使用SSH框架开发的系统从职责上可以分为4层:表示层,业务逻辑层,数据持久化层和域模块层。
Spring把抽象出来的模型用Java类来实现,同时为这些模型编写对应的DAO接口,同时给出基于Hibernate的DAO的实现,即实现Java对象与关系数据库之间数据的转换,然后使用Spring来完成业务逻辑,来管理Hibernate与Struts对象。
使用SSH的优点:
①、Struts实现了MVC模式。
②、Spring可以用来管理对象。(IOC和AOP)
③、Hibernate作为一个轻量级的持久性框架。实现了高效的对象关系映射,使得开发可以完全采用面向对象的思想,而不需要关心数据库的关系模型。