Java面试100题参考答案精品资料.docx

上传人:封****n 文档编号:96698361 上传时间:2024-03-10 格式:DOCX 页数:70 大小:2.11MB
返回 下载 相关 举报
Java面试100题参考答案精品资料.docx_第1页
第1页 / 共70页
Java面试100题参考答案精品资料.docx_第2页
第2页 / 共70页
点击查看更多>>
资源描述

《Java面试100题参考答案精品资料.docx》由会员分享,可在线阅读,更多相关《Java面试100题参考答案精品资料.docx(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Java面试100题参考答案1Struts1的工作原理.在web应用程序启动就会加载ActionServlet,ActionServlet从配置文件struts-config.xml中读取配置信息,并把它们存放到各种配置对象中。用户发起请求后,按如下步骤执行:(1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet. (2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。 (3)当ActionServlet请求找到用户请求

2、的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。 (4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute()方法。 (5)execute()执行结束前会生成以和ActionForward类型的对象并将之返回给ActionServlet,该对象的作用是告诉ActionFroward就代表跳转到一个登陆成

3、功的页面。ActionServlet将对之进行分析,其实就相当于接收到一个新的请求,重复(2)(5)的过程,直到将某个界面返会给用户为止!2Struts2的工作原理Struts2的工作原理图Struts2的工作原理简图 Struts2执行流程 1、客户端向Servlet容器(如Tomcat)提交一个请求 2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等) 3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action 4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP

4、请求无需调用Action) 5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类 6、ActionProxy创建一个ActionInvocation的实例 7、ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器 8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果 9、拦截器被再次执行 10、过滤器被再次执行3Struts1与Struts2的区别特性 Struts1.xStruts2 Actio

5、n类Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。Struts2的Action类实现了一个Action接口。Struts2也提供ActionSupport基类来实现一般使用的接口。当然,Action接口不是必须的。任何使用execute方法的POJO可以被当作Struts 2的Action对象来使用。 线程模型Struts1.x Action类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。Struts2 Action对

6、象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)。Servlet 依赖 Struts1.x的Action类依赖于servlet API,当Action被调用时,以Request和Response作为参数传给execute方法。Struts2的Action和容器无关。Servlet上下文被表现为简单的Maps,允许Action被独立的测试。易测性 测试Struts1.x的主要问题是execute方法暴露了Servlet API使得测试依赖于容器。第三方扩展,如Struts TestCase,提供一套S

7、truts1的模拟对象(来进行测试)。Struts2的Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。捕获输入Struts1.x使用ActionForm对象来捕获输入。象Action一样,所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用,开发者经常创建多余的类来捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。Struts2直接使用Action属性作为输入属性,消除了对第二个输

8、入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。表达式语言 Struts1.x整合JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。Struts2使用JSTL,但是也支持一个更强大和灵活的表达式语言Object Graph Notation Language (OGNL)。将值绑定到页面 S

9、truts1.x使用标准JSP机制来绑定对象到页面上下文。Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。类型转换 Struts1.x的ActionForm属性经常都是String。Struts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。验证 Struts1.x支持在ActionForm的validate方法中手动校验,

10、或者通过Commons Validator的扩展来校验。Struts2支持通过validate方法和XWork校验框架来进行校验。Action执行控制 Struts1.x支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。4Struts2中拦截器的主要作用、工作原理,如何自定义拦截器1拦截器的主要作用早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、

11、可扩展性降低;Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦。为Action提供附加功能时,无需修改Action代码,使用拦截器来提供。Struts 2大多数核心功能是通过拦截器实现的,比如表单组装、表单验证、类型转换、模型驱动、Servlet对象注入、文件上传等,每个拦截器完成某项功能。2.Struts2中拦截器的工作原理拦截器与过滤器原理很相似。三阶段执行周期:1、做一些Action执行前的预处理;2、将控制交给后续拦截器或返回结果字符串;3、做一些Action执行后的处理。多个拦截器可以组成拦截器栈一起起作用。从结构上看,拦截器栈相

12、当于多个拦截器的组合;在功能上看,拦截器栈也是拦截器 3.1自定义拦截器的方法 实现Interceptor接口 void init():初始化拦截器所需资源 void destroy():释放在init()中分配的资源 String intercept(ActionInvocation ai) throws Exception 实现拦截器功能 利用ActionInvocation参数获取Action状态 返回结果码(result)字符串 继承AbstractInterceptor类 提供了init()和destroy()方法的空实现,只需要实现intercept方法即可 推荐使用 继承Meth

13、odFilterInterceptor 指定拦截的方法:includeMethods 指定不拦截的方法:excludeMethods3.2配置和引用拦截器 interceptor-ref name=defaultStack/success.jsp/error.jsp5拦截器和过滤器的异同1、过滤器是web项目的普遍概念,而拦截器是struts2中的特有概念2、过滤器可以过滤所有请求,拦截器只拦截action请求3、自定义过滤器需要实现Filter接口,而自定义拦截器可以实现Interceptor接口4、在web.xml中配置过滤器,在struts.xml中配置拦截器5、拦截器可以访问Servl

14、et API、ActionContext、值栈,而过滤器只能访问Servlet API6、使用通配符来定义过滤器的过滤路径,过滤的是地址。通过为Action指定拦截器来调用拦截器,拦截器可以细化到方法层次。7、在Struts2项目中如果使用过滤器,一般应该将过滤器置于Struts2总控制器之前8、执行顺序:过滤器-拦截器-Action-拦截器-过滤器(过滤器靠前)9、拦截器是基于java的反射机制的,而过滤器是基于函数回调(待确认)6Hibernate相比JDBC的优势所在二者的联系:JDBC是java应用程序连接数据库,进行数据存取的一种机制,是一组用java语言编写的类和接口的API,它和

15、数据库之间由各个厂商提供的数据库驱动进行关联。hibernate是一个开源的轻量级的ORM框架,它在底层对jdbc进行了封装。Hibernate可以用在任何JDBC可以使用的场合优点:1、hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。2、使用的语言不同:JDBC使用基于关系型数据库的标准SQL语言,Hibernate使用的是HQL语言3、操作的对象不同:JDBC通过SQL语句直接传送到数据库中执行,Hibernate操作

16、的是持久化对象,由底层持久化对象的数据更新到数据库中。4、hibernate开发的程序具有更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。5、使用Hibernate极大的提高了开发者的开发效率。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。6、Hibernate缓存机制对提升性能

17、大有裨益。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。缺点:1、从理论上来说,ORM永远也不可能比JDBC好,就像任何高级语言的运行性能永远也不会好过汇编语言一个道 理。但从这个角度讲,精心编写的JDBC无论如何都是最快的。2、hibernate更消耗内存。因为它每次的数据库操作都要做数据和对象的转换/封装,查询出一条数据就要创建一个或多个对象,这样也太消耗内存了。3、对hibernate而言,它对JDBC封装过于厉害,所以就失去了对SQL的控制(

18、当然hibernate也可以使用native sql既使用createSQLQuery等方法来调用与数据库相关的sql,但这样一来也就影响了hibernate的可移植性),使得 hibernate的在很多地方不够灵活,难于优化,尤其对于一些复杂的关联查询时,hibernate提供的功能远不及直接使用JDBC方便性能更高。7Hibenate的基本原理(ORM)Hibenate的核心是ORM映射。hibernate通过对jdbc进行封装,对 java类和关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的jdbc + sql操作数据的方式,从而使开发人员可以花更多精力

19、进行对象方面的开发。8cascade和inverse的区别inverse和cascade两者之间没有任何关系。但是它们又都能影响对象关联关系的维护,所以将这两个属性的作用区分开也不是很容易的。inverse和cascade的区别主要表现在以下几个方面: 作用的范围不同inverse是设置在集合元素中的,而对于和则无此属性。而cascade则对于所有涉及到关联的元素都是有效的,其中包括了集合元素以及和 执行的策略不同inverse会首先判断集合的变化情况,然后针对变化执行相应的处理。而cascade则是直接对集合的每个元素执行相应的处理。 执行的时机不同inverse是在执行SQL语句之前判断是

20、否要执行该SQL语句,而cascade则是在主控方发生操作时用来判断是否进行级联操作。 执行的目标不同inverse对于和处理不尽相同。对于,inverse所处理的是对被关联表(的外键)进行修改操作。对于,inverse所处理则是中间关联表(增减记录)。而cascade则不会区分这两种关系的差别,所做的操作都是针对被关联表的。9HQL和SQL的区别1. 操作对象不同:HQL操作的类及其属性,SQL操作的是数据库表及其字段2. 相比SQL语句,HQL有所简化3. HQL结果直接返回List或其他对象,而不是像JDBC中使用SQL返回结果集,还要转化成对象。4. 不同数据库的SQL语句会有细微差别

21、,HQL独立于数据库,根据方言设置转换为对应的SQL语句10如何提高Hibernate的性能1. 配置数据源2. 使用延迟加载3. 使用二级缓存、查询缓存4. 对HQL语句的优化:避免or、not、like、having、distinct等操作5. 映射文件配置参数:fetch-size, fetch, batch-size6. 操作方法使用:比如load和get,list和iterate等11Hibernate中持久化类的三种状态及其特征瞬时状态特征:不在Session缓存中,不与任何Session实例相关联;在数据库中没有与之对应数据。持久化状态特征:在Session缓存中,与Sessio

22、n实例相关联;在数据库中有与之对应的数据。脱管状态特征:不在Session缓存中,不与任何Session实例相关联;在数据库中有与之对应数据。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行update()语句。多次save()是多余的。12Spring IoC的原理采用IoC之前 采用IoC之后采用IoC之前,对象的创建以及对象关系的维护都要由程序员通过硬编码的形式来维护。采用IoC后,对象的创建以及对象关系的维护将由IoC容器来实现,维护的依据是配置文件,程序员直接从容器中取对象就可以了 。13Spring AO

23、P的原理AOP,面向切面编程,是一种编程方法,它和面向对象编程采用的顺序(纵向)编程形成互补,可以解决一些在OOP中无法或很难解决的问题,例如事务、日志、权限等横切性问题,使得OOP集中精力于业务逻辑编程。OOP实现横切性关注点导致代码混乱,开发者必须同时考虑业务逻辑、性能、日志、安全等问题。代码分散,横切性代码散布在各个模块中。AOP将这些代码模块化,然后织入到需要的模块中。过滤器,拦截器都可以理解为一种AOP技术。14AOP的基本概念:切面、通知、切入点、连接点、织入1. 切面(Aspect):从对象中抽取出来的横切性功能模块。类似与OOP中的一个类。由通知和切入点两部分组成。2. 通知(

24、Adivice):切面的具体实现,例如具体的日志操作代码,一般是是切面中的某个方法。3. 连接点(Joinpoint):目标对象中插入通知的地方。即advice的应用位置。spring中只支持是方法4. 切入点(Pointcut):切面的一部分,对应一个表达式,定义了advice应该被插入到什么样的Joinpoint点上,即 advice的应用范围5. 目标对象(Target Object):被通知的对象。6. 代理(AOP Proxy):由AOP框架创建的目标对象的代理对象。是被插入了advice的Target Object 。7. 织入(Weaving):将通知与目标对象结合在一起,生成新

25、的对象的过程。新的对象就是AOP Proxy 。Spring是在运行是完成织入工作的。15SSH整合的基本步骤1、 Spring向下整合Hibernate(DAO层)1.1使用Spring的IoC容器创建sessionFactory1.2使用Spring的IoC容器创建DAO2、 Spring中间管理业务层2.1使用Spring的IoC容器创建Biz Bean2.2使用Spring的AOP配置业务层事务3、 Spring向上整合Struts2(控制层)3.1配置监听器和上下文参数3.2使用Spring的IoC容器来管理Action4、 其他4.1使用Spring提供的过滤器解决中文乱码问题4.

26、2使用Spring提供的OpenSessionInViewFilter解决懒加载问题4.3使用Spring的IoC容器管理数据源16并行操作下数据库事务出现的问题及含义;事务的隔离级别和四大属性1、并行操作下数据库事务出现的问题: 脏读(Dirty read):脏读发生在一个事务读取了被另一个事务改写但还未提交的数据时.如果这些改变在稍后被回滚,那么第一个事务读取的数据就是无效的. 不可重复读(Nonrepeatable read):不可重复读发生在一个事务执行相同的查询两次或两次以上,但每一次查询结果都不相同.这通常是由于另一个并发事务在两次查询之间更新了数据. 幻读(Phantom rea

27、d):幻读和不可重复读相似.当一个事务(T1)读取几行纪录后,另一个并发事务(T2)插入一些数据,幻读就发生了.在后来的查询中,第一个事务(T1)就会发现一些原来没有的额外纪录.2、事务的隔离级别 READ_UNCOMMITTED 允许你读取还未提交的改变了的数据.可能导致脏读,幻读或不可重复读. READ_COMMITTED 允许在并发事务已经提交后读取,可防止脏读,但幻读和不可重复读仍可能发生. REPEATABLE_READ 对相同字段的多次读取结果是一致的,除非数据被事务本身改变.可防止脏读和不可重复读,但幻读仍可能发生. SERIALIZABLE 完全服从ACID的隔离级别,确保不发

28、生脏读,不可重复读和幻读.这在所有隔离级别中也是最慢的,因为它是通过完全锁定在事务中涉及的数据表来完成的.3、事务的四大属性设置 事务的传播特性PROPAGATION:v REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启。v SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。 只读特性readonly=”true”v 只读事务。如果一个事务只对数据库执行读操作,设为只读事务可以提高效率 隔离级别特性isolation=DEFAULTv 事务的隔离级别。并行情况下保证事务的完整性。 超时特性timeout=-1v 事务的超时时间。超时则事务

29、回滚。17JSP的执行过程在JSP运行过程中,首先由客户端发出请求,Web服务器接收到请求后,如果是第一次访问某个jsp页面,Web服务器对它进行以下3个操作。1. 翻译:由.jsp变为.java,由JSP引擎实现。2. 编译:由.java变为.class,由 Java编译器实现。3. 执行:由.class变为.html,用Java虚拟机执行编译文件,然后将执行结果返回给Web服务器,并最终返回给客户端如果不是第一次访问某个JSP页面,则只执行第三步。所以第一次访问JSP较慢。18JSP和Servlet的区别和联系区别1. JSP是在HTML代码里写JAVA代码,框架是HTML;而Servle

30、t是在JAVA代码中写HTML代码,本身是个JAVA类。2. JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。3. Servlet独立地处理静态表示逻辑与动态业务逻辑.这样,任何文件的变动都需要对此服务程序重新编译;JSP允许用特殊标签直接嵌入到HTML页面, HTML内容与JAVA内容也可放在单独文件中,HTML内容的任何变动会自动编译装入到服务程序.4. Servlet需要在web.xml中配置,而JSP无需配置。5. 目前JSP主要用在视图层,负责显示,而Servlet主要用在控制层,负责调度联系:都是Sun公司推出的动态网页技术,先

31、有Servlet,针对Servlet缺点推出JSP。JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例JSP页面由系统翻译成Servlet,Servlet再负责响应用户请求。19JSP的9个内置对象及其含义,分别写出其常用方法三个常用方法略20page/request/session/application的范围区别page:当前页面范围request:当前页面范围+转发页面(forward)+包含页面(include)session:当前会话:session在以下几种情况下失效1. 销毁session:Session.invalidate();2. 超过最大非活动

32、间隔时间3. 手动关闭浏览器(session并没有立刻失效,因为服务器端session仍旧存在,超过最大非活动间隔时间后真正失效)application:当前应用;服务器重新启动前一直有效21get和post的区别1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。2. Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。4. Get执行效率却比Post方法好。Get是form提交的默认

33、方法。22Servlet的生命周期1. 加载:在下列时刻加载 Servlet:(1)如果已配置自动加载选项,则在启动服务器时自动加载 (web.xml中设置);(2)在服务器启动后,客户机首次向 Servlet 发出请求时;(3)重新加载 Servlet 时(只执行一次)2. 实例化:加载 Servlet 后,服务器创建一个 Servlet 实例。(只执行一次)3. 初始化:调用 Servlet 的 init() 方法。在初始化阶段,Servlet 初始化参数被传递给 Servlet 配置对象ServletConfig。 (只执行一次)4. 请求处理:对于到达服务器的客户机请求,服务器创建针对

34、此次请求的一个“请求”对象和一个“响应”对象。服务器调用 Servlet 的 service() 方法,该方法用于传递“请求”和“响应”对象。service() 方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。service() 方法可以调用其它方法来处理请求,例如 doGet()、doPost() 或其它的方法。(每次请求都执行该步骤)5. 销毁:当服务器不再需要 Servlet, 或重新装入 Servlet 的新实例时,服务器会调用 Servlet 的 destroy() 方法。(只执行一次)23session和cookie的区别1、联系http是无状态

35、的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能在多次请求之间共享信息呢(比如实现网上商店中的购物车)?session和cookie就是为了解决HTTP协议的无状态而采用的两种解决方案。2、原理(通过比喻形象说明,真正原理自己总结)n Cookie:发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 【卡上记录所有信息,而店家只认卡不认人。】n Session:发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次

36、消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 【只记用户ID,而ID的详细记录放在店家的数据库里;每次凭ID检索服务器的记录。】3、区别n cookie数据存放在客户的浏览器上,session数据放在服务器上(sessionid可以通过cookie保存在客户端,也可以使用URL重写方式)。n cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用sessionn session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,

37、应当使用COOKIEn 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。n 个人建议:将登陆信息等重要信息存放为SESSION;其他信息如需保留,可放在COOKIE中24转发和重定向的区别 转发是在服务端直接做的事情,是对客户端的同一个request进行传递,浏览器并不知道。重定向是由浏览器来做的事情。重定向时,服务端返回一个response,里面包含了跳转的地址,由浏览器获得后,自动发送一个新request。转发像呼叫转移或者110报警中心,重定向似114查号台。u 区别1:跳转效率的不同 n 转发效率相对高 n 重定向效率相对低u 区别2:实现语句不

38、同 n 转发 request.getRequestDispatcher(xxxx).forward(request,response) ;n 重定向 response.sendRedirect(xxxx)u 区别3:是否共有同一个request的数据n 转发源组件与目标组件共有同一个request数据n 重定向源组件与目标组件不共有同一个request数据(可使用session共有数据) u 区别4:浏览器URL地址的不同 n 转发后浏览器URL地址保持不变(源组件地址) n 重定向后浏览器URL地址改变为重定向后的地址(目标组件地址) u 区别5:/路径的含义不同 n 转发时/代表当前项目的

39、根路径 n 重定向时/代表当前服务器的根路径 u 区别6:跳转范围的不同 n 只能转发到同一应用中的URL(默认) n 可以重定向任何服务器、任何应用的URLu 区别7:刷新是否导致重复提交 n 转发会导致重复提交(可以通过同步令牌解决)n 重定向不会导致重复提交u 区别8:是否经过过滤器 n 转发不经过过滤器(默认情况)n 重定向经过过滤器25MVC模式及其优缺点 一、MVC原理 MVC是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。 1、模型(model)它是应用程序的主体部

40、分,主要包括业务逻辑模块和数据模块。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性 2、视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成 3、控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的作用 二、MVC的优点 1、降低代码耦合性。在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。 2、有利于分工合作。在MVC模式中,由于按层把系统分开,

41、那么就能更好的实现开发中的分工。网页设计人员可进行开发视图层中的JSP,而对业务熟悉的开发人员可开发业务层,而其他开发人员可开发控制层。 3、有利于组件的重用。如控制层可独立成一个能用的组件,表示层也可做成通用的操作界面。可以为一个模型在运行时同时建立和使用多个视图。三、MVC的不足之处 1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重

42、用。 3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。26B/S和C/S的含义及其区别C/S结构,即Client/Server(客户机/服务器)结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可充分利用两端硬件环境优势。早期软件系统多以此作为首选设计标准。B/S结构,即Browser/Server(浏览器/服务器)结构,是随着I

43、nternet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,节约了开发成本,便于软件维护。区别1、C/S是建立在局域网的基础上的。B/S是建立在广域网的基础上的,但并不是说B/S结构不能在局域网上使用。2、B/S业务扩展简单方便,通过增加页面即可增加服务器功能。C/S的客户端还需要安装专用的客户端软件,不利于扩展。3、B/S维护简单方便。开发、维护等几乎所有工作也都集中在服务器端,当企业对网络应用进行升级时,只需更新服务器端的软件就可以,这减轻了异地用户系统维护与升级的成本。 4、B/

44、S响应速度不及C/S;5、B/S用户体验效果不是很理想27Java集合体系结构(List、Set、Collection、Map的区别和联系)Collection 接口存储一组不唯一,无序的对象List 接口存储一组不唯一,有序(插入顺序)的对象Set 接口存储一组唯一,无序的对象Map接口存储一组键值对象,提供key到value的映射。Key无序,唯一。value不要求有序,允许重复。(如果只使用key存储,而不使用value,那就是Set)28Vector和ArrayList、ArrayList和LinkedList的区别和联系Vector和ArrayList的区别和联系实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用两者的主要区别如下1. Vector是早期JDK接口,ArrayList是替代Vector的新接口2. Vector线程安全,ArrayList重速度轻安全,线程非安全3. 长度需增

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 期刊短文 > 互联网

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁