2016-03-29 面试总结

   

  1.jsp静态include与动态include区别

动态INCLUDE
用法:
<jsp:include page="included.jsp" flush="true" />
说明:它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数,先编译之后再进行处理
动态include的结构是两者独立,直到输出时才合并( 看看jsp生成的java文件就可以知道了)。

动态include的jsp文件独立性很强,是一个单独的jsp文件,需要使用的对象,页面设置,都必须有自己创建,当然,还好它和include它的页面的request范围是一致的。

静态INCLUDE
用法:<%@ include file="included.htm" %>
说明:用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面,直接将内容先包含后处理。
静态include的结果是把其他jsp引入当前jsp,两者合为一体。
静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设置也可以借用主文件的.


2.软件生命周期(引用自:http://blog.csdn.net/zrbin153/article/details/6657332)
  是软件从产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段。
1)瀑布模型瀑布模型,就是要求每一个阶段都有明确的文档产出,对于严格的瀑布模型每一个阶段都不应该重叠,而应该在评审通过、相关的产出物都已经基线后才能够进入到下一个阶段。
就是说瀑布模型一般是按顺序执行的(图1所示)。


图1  瀑布模型阶段示意图

其优点是可以保证系统在整体上的充分把握,可以保证整个软件产品有较高的质量,保证缺陷能够被提前发现和解决。
瀑布模型不适用情况有:采用瀑布模型可以使系统具备良好的扩展性和可维护性,但对于需求不明确,不确定因素多的项目,很难利用瀑布模型。
2)螺旋模型
螺旋模型并不是一个完全独立的模型,而是与瀑布模型有着内在联系。它遵从瀑布模型“需求→架构→设计→编码→测试”的路线。其最大的特点是整个开发过程是迭代的和风险驱动的。
就是通过将瀑布模型的多个阶段转化到多个迭代过程中,以减少项目的风险。
螺旋模型的每一次迭代都包含了六个步骤:决定目标,替代方案和约束→识别和解决项目的风险→评估技术方案和替代解决方案→开发本次迭代的交付物和验证迭代产出的正确性→
计划下一次迭代→提交下一次迭代的步骤和方案(图2所示)。

图2  螺旋模型示意图
3)增量迭代模型

增量迭代模型并不尝试一次性地完成所有的设计,而是首先进行较小范围的、关键核心的设计,然后在设计验证通过后,对当前设计进行扩展。增量和迭代有区别,
但两者又经常一起使用。所以要想解释这个模型,就要先了解一下增量和迭代的概念。
假设现在要开发A、B、C、D四个大的业务功能,每个功能都需要两周的开发时间。则对于增量开发方法而言可以将四个功能分为两次增量来完成,第一次 增量完成 A、B功能,
第二次增量完成C、D功能;而对于迭代开发来说则是分两次迭代来开发,第一次迭代完成A、B、C、D四项基本业务功能但不含复杂的业务逻辑, 而第二次迭代,
将功能再逐渐细化补充完整相关的业务逻辑。在第一个月过去后,采用增量开发的时候A、B功能全部开发完成而C、D功能还一点都没有动;而采 用迭代开发的时候A、B、C、D
四项基础功能都已经完成。
4)快速原型模型
快速原型模型,就是在需求阶段也可以进行界面和操作建模,形成DEMO后和用户进一步进行需求沟通和确认。当用户没有信息系统的使用经验,
系统分析 员也没有过多的需求分析和挖掘经验的时候,需求分析和调研过程则更需要是一个启发式的过程。而原型则是一种很好的启发式方法,
可以快速地挖掘用户需求并达 成需求理解上的一致。否则即使双方都签字认可的需求,往往仍然不是客户真正想要的东西。
三、如何选择软件生命周期模型 在软件产品开发的项目中有这么多的模型可以选择,那么我们应该如何选择呢?下面举例说明:1)对于以前曾经开发过同类型的项目,或用过相同的技术开发过的项目,或在前期需求明确的情况下,可以采用瀑布模型或改进的瀑布模型。2)对于用户无信息系统使用经验,无法提出需求时,或者需求分析人员技能不足时,采用快速原型模型。3)有的项目不确定性因素很多,很多东西前面无法计划,这时可以采用增量迭代模型或螺旋模型。4)有的项目需求总是变来变去,即需求不稳定,这时可以采用增量迭代模型。5)有的软件比较大,公司不可能一次投入那么多的人力、物力,这时可以采用增量迭代模型,软件产品分多个版本进行发布。6)有的项目有多个独立功能,这时可以分别针对每个功能,将其作为子项目,每个子项目内都可以采用瀑布模型。
四、其他应注意的事项
我们开发软件项目中经常会遇到使用新的开发技术的情况,也就是创新型的项目。对于创新型的软件项目的开发,风险比较高,容易延期甚至失败,一般是比 较难以把握和控制的。
对于这种项目的开发,建议先进行预研项目的开发。预研项目只是对技术路线进行探索和修正的过程,是很必要的。我们以前可能是有预研 的,但这种预研完全依靠技术尖子的主观能动性,
对于人的依赖性太大,不规范。采用CMM后,可能给每个人的任务都比较紧张,技术尖子自由发挥的时间也少 了,所以应该有预研项目。
软件项目预研阶段一般采用快速原型模型,就是要先将路走通,并测试开发技术的效率、总结经验、找到行之有效的技术路线。在开发的原型的基础上,再正式立项,
因为对于细节已经能够把握,可以进行详细设计,这时可以采用瀑布模型。这样开发效率就可以控制了。另外,在开发的各个阶段都要有相应的评审会并形成相应的记录和文档。五、结论 国内外成功的软件公司,多数都采用软件生命周期方法来管理软件项目,这确实是一种行之有效的管理方法。我们自己可以学习和消化这种方法,因地制宜地开展起来,
相信对于软件开发项目管理水平的提高是非常有益的。

3.hibernate与mybatis优缺点(引用自:http://www.cnblogs.com/inspurhaitian/p/4647485.html)

  第一方面:开发速度的对比
就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。
比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没 有,就是简单的增删改查,
这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的 时间,但是对于一个大型项目,复杂语句较多,
这样再去选择hibernate就不是一个太好的选择,选择mybatis就会加快许多,而且语句的管理也比较方便。
  第二方面:开发工作量的对比
Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语 句,以及ResultMap。
而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
  第三方面:sql优化方面
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。
而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。
Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。
MyBatis的SQL是自己手动写的所以调整方便。但 Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。
  第四方面:对象管理的对比
Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。也就是说,
相对于常见的 JDBC/SQL 持久层方案中需要管 理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。换句话说,使用 Hibernate 
的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执行。这部分细节已经 由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。
而MyBatis在这一块没有文档说明,用户需要对对象自己进行 详细的管理。
  第五方面:缓存机制
Hibernate缓存
Hibernate一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好。建议在一个Action操作中使用一个Session。一级缓存需要对Session进行严格管理。
Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据
(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用
硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。
MyBatis缓存
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有
开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:  <cache/>
字面上看就是这样。这个简单语句的效果如下:
  1.映射语句文件中的所有 select 语句将会被缓存。
  2.映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
  3.缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
  4.根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
  5.缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  6.缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
所有的这些属性都可以通过缓存元素的属性来修改。
比如: <cache  eviction=”FIFO”  flushInterval=”60000″  size=”512″  readOnly=”true”/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。
可用的收回策略有, 默认的是 LRU:
  1.LRU – 最近最少使用的:移除最长时间不被使用的对象。
  2.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  3.SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  4.WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,
通过Cache-ref来实现。
两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
  第六方面:总结
相同点:Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,
最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

Hibernate和MyBatis都支持JDBC和JTA事务处理。
Mybatis优势
  MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

jdbc缺点:编程代码繁琐session的获取关闭,异常的捕获一大堆代码要写,代码移植性差,没有提供数据缓存,面向sql语句操作而不是面向对象的操作
jdbc有点:效率比框架高

hibernate优点:代码简单,面向对象操作移植性好,提供很好的缓存。缺点:无法干预sql语句的生成,如果对sql语句优化较高就不适合,hibernate只适合中小型项目开发
优点:
1. 易于上手和掌握。2. sql写在xml里,便于统一管理和优化。3. 解除sql与程序代码的耦合。4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护6. 提供xml标签,支持编写动态sql。
缺点:
1. sql工作量很大,尤其是字段多、关联表多时,更是如此。2. sql依赖于数据库,导致数据库移植性差。3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,
查询后返回的对象是不具备对象关系的,即Collection的对象为null)5. DAO层过于简单,对象组装的工作量较大。6.  不支持级联更新、级联删除。
7. 编写动态sql时,不方便调试,尤其逻辑复杂时。8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低
9. 使用不当,容易导致N+1的sql性能问题。10. 使用不当,关联查询时容易产生分页bug。11. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
12. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
13. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)14. 缓存使用不当,容易产生脏数据。




原文地址:https://www.cnblogs.com/zhangmu126/p/5333306.html