华为外包java面试题Word文件下载.docx
- 文档编号:21508503
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:159.60KB
华为外包java面试题Word文件下载.docx
《华为外包java面试题Word文件下载.docx》由会员分享,可在线阅读,更多相关《华为外包java面试题Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
使用标准的JSP以外,还提供了大量的标签库使用,同时也可以与其他表现层组件技术(产品)进行整合。
Struts出现之前J2EEWeb层没有统一标准,各个公司都是自有框架,给从业者,企业带来了诸多不便。
Struts采用了经典MVC设计,从而事实上成为WEB层开发的标准
2.2Struts的原理
在谈到Struts前,简单讲下MVC设计模式。
MVC即Model-View-Controller的缩写,MVC减弱了业务逻辑接口和数据接口之间的耦合,同时让视图层更富于变化。
MVC的工作原理,如下图1所示:
控制器(Controller)-负责转发请求,对请求进行处理。
视图(View)-界面设计人员进行图形界面设计。
模型(Model)-程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
Struts是MVC的一种实现,它将Servlet和JSP标记用作实现的一部分。
Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。
Struts的体系结构与工作原理如下图2所示:
从图2中我们可以知道,Struts的体系结构包括模型(Model),视图(View)和控制器(Controller)三部分。
下面让我们从用户发出请示角度来看看struts的体系结构(Model2)与工作原理:
(1)首先,用户(通常通过浏览器,如IE)发出请求,Struts的控制器(ControllerServlet)得到请求。
(2)Struts控制器通过配置文件得到业务逻辑处理Action,并调用Action的处理用户请求。
(3)Action处理业务业务逻辑(可能查找数据库或调用别的系统),处理完成后,填充相关的Model对象,并把控制权返回控制器。
(4)控制器选择相应的视图(视图从模型里取出数据),并返回给用户。
2.3Struts2简介
Struts2提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:
拦截器、OGNL表达式语言、堆栈。
下图是Struts2的处理流程。
一个请求在Struts2框架中的处理大概分为以下几个步骤
1客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:
SiteMeshPlugin)
3接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类
6ActionProxy创建一个ActionInvocation的实例。
7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2框架中继承的标签。
在这个过程中需要涉及到ActionMapper
2.4Struts,Struts2的比较
在Action实现类方面的对比:
Struts1要求Action类继承一个抽象基类;
Struts1的一个具体问题是使用抽象类编程而不是接口。
Struts2Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。
Struts2提供一ActionSupport
基类去实现常用的接口。
即使Action
接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts2的Action。
线程模式方面的对比:
Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts1Action能做的事,并且要在开发时特别小心。
Action资源必须是线程安全的或同步的;
Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖方面的对比:
Struts1Action依赖于ServletAPI,因为Struts1Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts2Action不再依赖于ServletAPI,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。
当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts2Action仍然可以访问它们。
但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
可测性方面的对比:
测试Struts1Action的一个主要问题是execute方法依赖于ServletAPI,这使得Action的测试要依赖于Web容器。
为了脱离Web容器测试Struts1的Action,必须借助于第三方扩展:
StrutsTestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts1的Action类。
Struts2Action可以通过初始化、设置属性、调用方法来测试。
封装请求参数的对比:
Struts1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:
ActionForm。
普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。
虽然Struts1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;
Struts2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Ric对象类型。
如果开发者依然怀念Struts1
ActionForm的模式,Struts2提供ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts2基类,是一个POJO,从而降低了代码污染。
表达式语言方面的对比:
Struts1整合了JSTL,因此可以使用JSTL表达式语言。
这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;
Struts2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:
OGNL(ObjectGraphNotationLanguage),因此,Struts2下的表达式语言功能更加强大。
绑定值到视图的对比:
Struts1使用标准JSP机制把对象绑定到视图页面;
Struts2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
类型转换的对比:
Struts1
ActionForm
属性通常都是String
类型。
Struts
1使用commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;
Struts2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。
数据校验的对比:
Struts1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons-validator框架来完成数据校验。
Struts2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
Action执行控制的对比:
Struts1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor
Stacks)为每一个Action创建不同的生命周期。
开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。
经过上面简要介绍,不难发现,Struts2确实在Struts1上做出了巨大的改进,的确是一个非常具有实用价值的MVC框架。
三、Spring-轻量级容器
3.1Spring简介
Spring是新一代的J2EE框架,核心在于对受其管理的对象提供所需服务,而不要求对象做出任何改变,具体包括:
注入协作对象或依赖对象,声明性事务,同现有大量框架的无缝集成。
3.2Spring的原理
Spring核心可用两句话概括:
自动注入某一对象或组件所需要的服务而不用修改对象;
通过AOP为POJO对象提供声明性的企业级服务。
3.3Spring与EJB容器
Spring容器与EJB容器一样提供了大量企业级服务,但不要求受管理的对象知道容器的存在,即对象不需要实现Spring特有的东西。
与些同时,Spring提供的服务是可选择的,即可以使用也可以不使用。
EJB容器是一种重量级容器,要么接受其提供的所有服务(即使不用),要么任何服务都不接受,并且求受其管理的对象要实现EJB特有的东西,从而干扰了业务实现。
3.4Spring在开发中的应用
Spring有完整的Web层MVC,同时提供了Hibernate,Ibatis的集成。
由于Struts是事实上Web层开发的标准,尽管SpringMVC更先进,开发效率更高,现阶段Spring在开发中提供
SPRING七大模块图:
四、Hibernate-持久化的标准
4.1Hibernate简介
Hibernate是一种Java语言下的对象关系映射解决方案。
它的设计目标是在JDBC之上提供一层薄薄的封装,同时提供完善的透明的持久化;
为应用程序增加O/R映射,但又不脱离底层的关系数据库。
4.2Hibernate原理和功能
Hibernate采用CGLIB以动态字节码生成的方式为持久化对象创建运行时代理,执行变更侦测来提供透明的持久化,动态的在POJO(老式JAVA对象),PO(持久化对象)之间自动转换。
新建的POJO或托管POJO调用Session对象保存后自动成为PO,而PO与Session脱离干系之后又变成托管POJO,可以充当数据传输对象而不用再额外的对象。
同时Hibernate提供了延迟加载与缓存功能提供更好的性能。
4.3Hibernate的缓存机制
Hibernate支持两级缓存,一级Session内缓存,不可选,强制使用;
二级进程间或集群间,可选的。
一级Session缓存主要提供在同一个事务内部的缓存,保持事物唯一性(确保事务内两次加载数据库同一行时,返回的对象为同一个内存对象),不存在并发访问。
二级缓存可以为进程间或集群间,二级缓存需要提供并发访问机制(数据库同一行在内存对应不同的JAVA对象),二级缓存可以把JAVA对象缓存到内存中,虚拟内存,磁盘上等。
4.4Hibernate,Ibatis的比较
相对Hibernate"
一站式"
ORM解决方案而言,ibatis是一种"
半自动化"
的ORM实现,仅提供SQL映射,SQL参数输入输出绑定到POJO上,而把SQL语句定义留给开发人员。
Ibatis提供了缓存查询结果,缓存策略也是可插拔的。
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/RMapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。
程序员往往只需定义好了POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作。
程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
iBATIS虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合。
系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
在这种情况下iBATIS会有更好的可控性和表现。
4.5Hibernate进行大数据量处理时的优化操作
1)在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session.Evict(Object)在处理过程中,清除全部的缓存或者清除某个对象。
2)对大数据量查询时,慎用list()或者iterator()返回查询结果,
1.使用List()返回结果时,Hibernate会所有查询结果初始化为持久化对象,结果集较大时,会占用很多的处理时间。
2.而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花费较多的时间。
当结果集较大,但是含有较大量相同的数据,或者结果集不是全部都会使用时,使用iterator()才有优势。
3.对于大数据量,使用qry.scroll()可以得到较好的处理速度以及性能。
而且直接对结果集向前向后滚动。
3)对于关联操作,Hibernate虽然可以表达复杂的数据关系,但请慎用,使数据关系较为简单时会得到较好的效率,特别是较深层次的关联时,性能会很差。
4)对含有关联的PO(持久化对象)时,若default-cascade="
all"
或者“save-update”,新增PO时,请注意对PO中的集合的赋值操作,因为有可能使得多执行一次update操作。
5)在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时方会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。
6)对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。
7)Hibernate是以JDBC为基础,但是Hibernate是对JDBC的优化,其中使用Hibernate的缓冲机制会使性能提升,如使用二级缓存以及查询缓存,若命中率较高明,性能会是到大幅提升。
8)Hibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。
前台篇
1.1AjaxA原理
ajax并不是一个新生的语言,它是一系列语言的结合体:
HTML/XHTML、CSS、DOM、XML、XSLT、XMLHttp、JavaScript。
Ajax的工作原理如下图,由此用户可以不用为提交了Form而长时间等待服务器应答,而且通过Ajax也可以开发出华丽的Web交互页面。
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
在使用Ajax时,需要创建XMLHttpRequest对象,由XMLHttpRequest对象代表用户提交数据给后台服务器,不同浏览器的创建方式略有不同。
在利用Ajax向服务器提交请求时,需要先确定三点:
∙使用GET或POST方式提交请求?
∙请求的url地址和传递的参数。
?
∙传输方式,false为同步,true为异步。
默认为true。
如果是异步通信方式(true),客户机就不等待服务器的响应;
如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作。
例如:
request
=
new
XMLHttpRequest();
var
url="
http:
//localhost/test/ajax.do?
method=list&
time="
+
Math.random();
request.open("
GET"
url,
true);
request.onreadystatechange
updatePage;
request.send(null);
//更新页面
function
updatePage()
{
//检测返回状态,并更新页面
}
1.2ajax的优点
1、最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
2、使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻
服务器和带宽的负担,节约空间和宽带租用成本。
并且减轻服务器的负担,ajax的原则
是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
1.3常用AJAX框架比较
jQuery是一个优秀的Javascrīpt框架,其宗旨是——WRITELESS,DOMORE,写更少的代码,做更多的事情。
快速、简洁,能够很轻易地处理HTML文档、控制事件、给页面添加动画和Ajax效果。
它是轻量级的js库,它兼容CSS3,还兼容各种浏览器。
DWR(DirectWebRemoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码),对于不熟悉JavaScrip的开发人员也用DWR也可以开发出很好的效果。
1.4JS,DOM
DOM是W3C标准(DocumentObjectModelforHTML)。
DOM定义了用于HTML的一系列标准的对象,以及访问和处理HTML文档的标准方法。
DOM的原理是将XML/XHTML文档装入内容,并以节点的形式解析为一棵节点树。
DOM提供相应的API,可以对节点树进行增删改查,通过DOM,可以访问所有的HTML元素,连同它们所包含的文本和属性。
可以对其中的内容进行修改和删除,同时也可以创建新的元素。
DOM能被JavaScript使用,从而动态的更新页面内容。
下面举一些用法
//查找节点:
三种方式。
//1:
getElementById();
--比较常用,根据id获取节点,缺陷:
如果要获取一个相同的节点,每个节点都需要加上一个id。
所以引发了另一种。
getElementsByTagName();
//2:
--根据标签名称获取元素。
//3:
getElementByName();
--专门争对单选框和多选框。
因为单选框和多选框他们的name值都是一样的。
//varnode=document.getElementById("
emnode"
);
//获取一个元素
//varnodeName=document.getElementsByTagName("
li"
//获取整个文档中的li标签
//varnodeName1=node.getElementsByTagName("
//只获取node节点下面的li标签
//varname=document.getElementByNmae("
radioName"
//获取选中框的name属性。
用于单选框和多选框
//争对dom文档中的增删改查
//增加元素
//创建元素
//document.createElement("
标签名称"
如:
document.createElement("
div"
//创建文本节点
//document.createTextNode("
文本内容"
//追加到元素中。
//div.appendChild(p);
//往div标记里面追加一个p标记
//从前面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 外包 java 试题