zoukankan      html  css  js  c++  java
  • 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. 缓存使用不当,容易产生脏数据。




  • 相关阅读:
    1.4.2.3. SETUP(Core Data 应用程序实践指南)
    1.4.2.2. PATHS(Core Data 应用程序实践指南)
    1.4.2.1. FILES(Core Data 应用程序实践指南)
    1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
    1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
    1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
    1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
    1.3.1. 新建Xcode项目并设置故事板(Core Data 应用程序实践指南)
    php验证邮箱是否合法
    如何使js函数异步执行
  • 原文地址:https://www.cnblogs.com/zhangmu126/p/5333306.html
Copyright © 2011-2022 走看看