|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。ajax|web|编程|架构 择要
流派使用程序十分合用于从多个源提失信息和为包括流派Web使用程序的portlet供应使用服务。关于用户,portlet使用程序是自力的实体,相似于桌面上的窗口使用程序。假如在一个窗口使用程序中实行一项操纵会招致其他一切使用程序中的内容被革新,那又会怎样呢?这就是以后年夜多半流派的情形。在一个portlet中经由过程页面流举行转移会招致全部Web页面被革新,包含该页面上的其他一切portlet。
为了不呈现这类偶然不但愿有的举动,Web开辟职员接纳了所谓Ajax-作风的编程办法。Ajax即异步Java和XML(AsynchronousJavaandXML),它是一个手艺的汇合,包含用于创立交互式Web使用程序的XHTML、CSS、JavaScript、DOM和XmlHttpRequest工具。本文将申明在BEAWebLogicPortal情况中利用Ajax编程办法的基础道理,并供应了一些最好理论和倡议,以免老手Ajax程序员常常会犯的很多毛病。
Ajax简介
思索一个基于一些用户尺度(好比街道地点、乡村和州,)来绘制街道舆图的Web使用程序。这类使用程序在用户界面中已存在良多年了,而且很少有所改动。用户输出一个地点,然后单击一个按钮,页面中央就会显现周边地区的舆图。用户一般必要减少和缩小以更分明地显现四周地区,大概必要把舆图向左或向右稍作挪动,以找到一些可以匡助他们举行定位的次要街道或地界标。会见maps.yahoo.com或mapquest.com,即可以取得这类体验。来吧,尝尝这个地点:100EastWackerDriveChicago,IL
终极,您将看到一幅芝加哥郊区的舆图,中央是Wacker和Michigan年夜街。在右方,您将看到一系列缩放级别,您能够从当选择一个。中选定一个缩放级别以后,会呈现甚么情形呢?全部页面将会革新,这会消费相称长一段工夫。如今,当您把舆图向左或向右挪动时,又会呈现甚么情形呢?您不成制止地会革新全部页面,而全部舆图必要再次下载。页面巨细一般是75到100k,而均匀的前往工夫约莫是3到10秒钟,这取决于您的收集毗连速率。
如今利用GoogleMaps举行一样的实验,这是一个完整利用Ajax手艺的站点。输出地点,然后单击Search。页面将完整显现出来。如今举行缩放。注重,舆图以外的页面内容不会革新。上面列出了这面前所产生的事变:
- 用户单击缩放控件。
- 缩放控件挪用一个JavaScript办法。
- JavaScript办法挪用服务器来哀求新的舆图信息。
- 服务器创立新的图象,然后将其发还给扫瞄器。
- 扫瞄器利用新的图象数据交换现有的图象数据。
- 用户在旧图象的地位看到新图象。
注重,舆图上没有唆使器材南北的箭头。用户怎样与舆图举行交互呢?只需像在一个转动窗口中那样举行拖沓便可。试着单击舆图的中央,然后把舆图向左方拖动。注重拖动舆图时舆图是怎样呼应的!上面列出这面前所产生的事变:
- 用户把舆图向左方拖动。
- Web页面利用它所下载的图象信息,而用户守候着页面依据客户端已存在的数据从头绘制舆图。
- 假如事后没有检索到图象数据,扫瞄器将从服务器取得它所必要的附加信息(新呈现的舆图地区)。
- 新的数据被增加至现无数据,并在扫瞄器中从头绘制出来。
- 用户瞥见舆图向右方转动,就像是一幅真实的年夜图那样。
上面是利用Ajax手艺所带来的优点:
- 客户端与服务器之间传输的数据量年夜年夜削减。
- 可感知的体系呼应工夫年夜幅度延长。
- 因为反应实时,用户感到对使用程序的把持加倍轻车熟路。
- 用户喜好这个站点,由于利用它能够进步他们的事情效力。
- 用户将会再次会见站点,如许其合作敌手的客户就会削减。
下面关于Ajax作风的用户界面的演示使人印象深入。(假如在利用GoogleMaps数天以后,您还不信任其合作敌手已大发雷霆,那末您就不用浏览本文上面的内容了。)
有关Ajax的完全先容,请浏览AnIntroductiontoAjax(中文版,dev2dev,2005年11月)。
Ajax所办理的流派成绩
思索那些大批利用Javaapplet并且但愿使用其现有资产创立流派的潜伏客户。把现有applet和其他页面流包装到portlet容器中是一件很复杂的事变,可是也要思索到举行流派测试时会呈现哪些成绩。比方,某个porlet中的一个举措会招致革新和随后的从头加载,偏重新初始化页面上其他一切基于applet的portlet。假如所会商的applet具有后端毗连,那末portlet的从头初始化将招致服务器抛弃现有毗连,然后强迫applet从头举行毗连,这不但减轻了服务器的包袱,并且会使流派用户看到几秒钟的“运动工夫”,在这段工夫内,基于applet的portlet必需坚持灰色,一向到它们完成初始化为止。
这明显是一个潜伏的瑕疵。告知客户们重写一切的applet,由于基于JSP的使用程序并不是有效的呼应,特别是关于已在现有资产中投进大批资本的客户来讲。别的,流派必需匡助客户包装现有的使用程序,而不是强制他们重写全部体系。
我们必要一种让单个portlet在不引发页面革新的情形下举行操纵或取得新数据的办法。固然这明显存在一些倒霉的地方(我将在本文前面会商这些),可是在这类情形下,把制止页面革新作为利用流派的进进屏蔽是完整有需要的。
注:关于这个成绩,一个可行的办理计划是iframes,也就是inlineframes,一种基于扫瞄器的机制,它可使屏幕的一块地区变成自力的实体,当页面从头加载时它不会革新。利用相似于Ajax编程中所利用的手艺,我们可使用XML-RPC举行服务器挪用,从而猎取数据并将其加载到DOM文档中。Apple的开辟者Web站点上有一篇文章十分好地总结了这类办法的长处和弱点。我确信,关于为何iframes更好或Ajax更好,两边的撑持者已举行过出色的争吵,可是Ajax已盛行开来,而iframes则没有。因而,本文只先容了Ajax,而没有就iframes举行会商。
用例
鄙人列情况下,Ajax手艺很有效处:
- 流派中利用了一个或多个基于applet的portlet。
例子:拜见后面内容中形貌的场景。
- portlet必要按期革新其数据或重绘其内容。
例子:一个带有股票代价表的可实行面板,这些值每分钟都要更新。
- 利用Portlet间通讯(Inter-Communication,IPC)而不克不及革新全部Web页面。
例子:一个列出股票称号的portlet必要更新另外一个用于扼要形貌这些股票确当前形态(好比股票确当前代价、最低价格和最低代价)的portlet。
- 页面包括大批一般为静态的数据,如许页面操纵只必要置换大批数据。
例子:Google舆图。
- 一个portlet必要基于在此portlet中的其他中央所做的选择来检索一个无限的数据集。
例子:一个表单有3个组合框:State、City和ZIP。当用户选择一个州时,该州一切的乡村称号都将呈现在City组合框中。然后,用户从City组合框当选择一个乡村,接着ZIP组合框中就会显现该乡村一切无效的邮政编码。
示例架构
Ajax手艺的中心是Web扫瞄器对一些卖力供应信息的Web服务的挪用。怎样为该办理计划计划架构呢?有3种值得思索的架构。第一种架构利用Web扫瞄器作为集成点,出于随之而来的平安思索和扫瞄器方面的成绩,该架构存在成绩。第二种办理计划利用代办署理来猎取散布的资本,这打消了平安成绩,可是增加了一个单点妨碍。第三种架构利用企业服务总线(enterpriseservicebus,ESB)来打消单点妨碍,并为Web服务和Ajax手艺的兴旺开展供应了最合适的情况。
以扫瞄器为中央
在以扫瞄器为中央的架构中,Web扫瞄器成为接洽远程体系的中央点,如所示。数据从各个远程体系中取得,然后在扫瞄器处的JavaScript中举行收拾和排序。
.以扫瞄器为中央的架构
这类架构是最天然的计划,它具有多处计划缺点:
- JavaScript是一种糟的集成言语/情况。Java在各个方面都要比它好很多。
- 扫瞄器必需经由过程每一个体系的身份考证,并且大概利用分歧的办法。
- 缓存静态信息的才能很差,这会招致全部体系呈现很长的提早,这起首就得到了利用Ajax办法的意义!
代办署理服务
如所示,代办署理服务打消了第一种架构的一切缺点,可是它也有本人的不敷的地方。它招致呈现了一个体系单点妨碍。固然,Web服务器能够作为带有硬件负载均衡器的集群的一部分。这无疑能够办理这个成绩。
.代办署理服务架构
只管这类架构比起以扫瞄器为中央的架构已有了伟大的改善,还能够做得更好。我们已为Web开辟职员供应了一个十分好的情况,可是这极可能为后端体系开辟职员带来方便。对远程体系举行身份考证和数据收拾仍旧是需要的,可是最少后端程序员应当有更多可以使用的工具来欢迎应战。
企业服务总线
与后面的两幅图又有所分歧,由于企业服务总线(ESB)架构是一种逻辑架构。服务能够位于收集上的恣意地位,数据源能够被笼统到(可拔出到ESB中的)服务中。ESB为后端体系开辟职员处置了他们一般必需做的事情,好比服务身份考证、数据转换、协定转换和牢靠性特性。ESB能够扩大到带有硬件负载均衡器的盘算机集群上,这供应了代办署理服务架构所具有的长处。
.企业服务总线
为了申明在流派中对Ajax使用程序利用ESB的长处,思索关于每次Ajax挪用都要援用一个Web服务的情形。关于小型流派来讲,Web服务的数目大概绝对较少,比如说几十个。可是跟着流派的增加,将会引进更多的Web服务。大批Web服务的增加与Ajax没有干系,可是与SOA的完成有着亲切的接洽。这是一个ESB的典范用例。只管从严厉意义下去说,它关于Ajax完成的操纵不是需要的,可是它仍是带来了几个优点:
- ESB打消了对ProxyServlet类(稍后将会先容)的需求,由于代办署理服务更好地完成了一样的事情。
- ESB撑持监控和办理单个Web服务,同时无需在每一个Web服务中增添分外的代码。这包含监控服务程度协定(SLA)和呈报违背情形。
- ESB能够回护Ajax代码不会被内部供应者修正。假如内部供应者以一种无需修正流派用户界面但必要修正Ajax挪用代码的体例修正了WSDL,那末就有大概在ESB的代办署理服务中修正设置,而不必修正Ajax代码。为何如许做比修正Ajax代码更好呢?我以为,在ESB中代办署理服务的设置中举行小的修改比起在JavaScript中对每一个到相干服务的援用举行修正更不简单堕落。别的,关于一样的信息(好比股票报价查询)还可使用多个内部供应者,可是每一个供应者具有分歧的挪用接口并前往XML。假如某个供应者呈现妨碍大概只是为了举行负载均衡,利用多个供应者就很有益了。在ESB中能够轻松完成这一点,可是在JavaScript中这几近是不成能的。
在这里的例子中,我之以是利用了以扫瞄器为中央的架构和代办署理服务架构,是由于作为例子来讲,它们对照复杂,可是我但愿可以使您信任,Ajax是表现ESB长处的十分不错的体例。
对流派利用的影响
当在流派内接纳Ajax编程办法时,呈现了几个成绩。这些成绩中的年夜多半与流派的性命周期和怎样/什么时候选择用户信息有关。详细来讲,流派要利用诸如用户在那里单击之类的信息来决意向其显现何品种型的相干信息。WebLogicPortal具有一种叫做campaign的特征,它同意流派计划职员基于用户团体信息指定对用户的有目标告白宣扬。用户团体信息中包含用户的页面汗青,即,用户已往点击过的页面。流派在页面革新时搜集这类信息,以是假如用户从未革新页面,流派就没法(简单地)主动搜集用户信息。
思索Ajax编程大概对流派发生的以下反作用:
- 不成跟踪性使campaign得不到无效利用(拜见下面的内容)。
- 页面革新重置了DOM树,以是当用户终极革新页面时,一切对利用Ajax修正过的portlet的更新城市丧失。对portlet内容的修正将会丧失,复原为初始的页面形态。
- JSP中的一切JavaScript都是全部页面共用的。思索一个包括在每一个portlet中的JavaScript片段。当出现终极的HTML页面时,JavaScript片段将在包括它的每一个portlet中反复利用。相似地,假如已将两个portlet嵌进了JavaScript,并且每一个portlet的剧本都有一个名为getData()的办法,那末终极的HTML页面将会有两个分歧的getData()函数界说。挪用该函数时极可能招致挪用不准确的办法。假如有两个名为isOK()的变量,也会呈现一样的情形。
利用得当的编码作风能够避免这些成绩的产生,好比给一切变量和函数取独占的称号,大概利用cookies来保留portlet中利用确当前数据。
一种最好理论是在一切剧本中利用独占的变量和函数称号,详细做法是在每一个变量和函数的称号前加上包括它们的portlet的称号。
扫瞄器和平还没有停止,专有扫瞄器和基于尺度的扫瞄器之间的和平仍在持续。Ajax相称风趣的一点是,个中有一半是尺度(XHTML、XSLT、JavaScript/ECMAScript、DOM和Webservices)驱动的。可是其中心手艺――XmlHttpRequest工具――来自微软。
上面列出了在举行跨扫瞄器的Ajax编程时要注重的一些主要的罕见毛病,和怎样制止这些圈套。
平安性
XmlHttpRequest工具间接把扫瞄器毗连到一台远程主机,要末是加载页面的Web服务器,要末是从另外一个完整分歧的服务器。正如您所想像的,这里为歹意软件供应了大批的时机。比方,一段歹意的JavaScript大概等着用户输出口令字段,然后把口令传送给一个远程扫瞄器,而用户却不晓得,乃至还没有单击页面上的提交按钮。假如把口令换为信誉卡号码,事变就变得加倍风趣了。
为了不这类风险,Mozilla回绝到为Web页面供应服务的主机以外的恣意主机的毗连。用户不会看到毛病动静,由于它基本就不会运转!
InternetExplorer(IE)接纳另外一种办法。当请求毗连到远程主机时,将利用一个对话框关照用户,而用户能够决意实行甚么操纵。可是要注重,该对话框不会告知用户要毗连到哪一个站点,以是用户缺少能够用于做出决议的信息。
.没有有效的信息!
这个成绩的办理计划是利用一个Javaservlet作为到Web服务的代办署理。该servlet取得一切的参数,并把它们传送给远程服务,接着将呼应前往给Web站点。经由过程让servlet运转在创立Web页面的Web服务器上,Mozilla就会以为服务是当地的。注重,这是企业服务总线(好比AquaLogicServiceBus)的一个尽好用例。
利用XmlHttpRequest工具
包括XmlHttpRequest工具的XmlHttp库最后是随InternetExplorer4一同刊行的ActiveX控件。Mozilla包括一个兼容的函数库,以是没有甚么好忧虑的。我仍旧保举利用一个开源库,好比Sarissa或DWR。但是,它们在将XML数据传送到工具的体例上存在着渺小的区分。
更新DOM节点
Mozilla和IE之间最使人末路火的区分就是Web页面中对DOM(DocumentObjectModel,文档工具模子)的处置。年夜多半函数的事情体例是一样的(最少在DOMLevel2上),可是仍旧有良多值得注重的中央。上面给出两个例子。
innerHtml与innerText的利用
当利用新的静态内容更新<div>标签时,IE用户有两个选择:能够更新节点的innerText或innerHTML。两者的区分很渺小,可是却能在信息的显现方面形成很年夜的不同,特别是当要显现的文本是XML格局大概包括HTML实体(好比尖括号或&标记)时。利用innerHTML时假定内容与标签是一同放进的(不论内容是甚么)。假定我们试着把以下文本放进一个节点中:
- vartxt=<b>Thisisatest</b>document.getElementById(mydivtext).innerText=txt;document.getElementById(mydivhtml).innerHTML=txt;
复制代码 <divid="mydivhtml">部分在扫瞄器中看起来以下:
<divid="mydivtext">部分看起来则是上面如许:
基础上,innerText节点对输出字符串举行本义,如许显现在用户眼前的就是内容本来的模样。可是Mozilla在DOM节点上不撑持innerText属性,以是更好的办法是用户亲身对文本举行本义,并一直利用innerHTML。Sarissa有一个匡助器函数用于完成这一项功效:
- document.getElementById(mydivtext).innerHTML=Sarissa.escape("<b>Thisisatest</b>")
复制代码 我们将失掉一样的了局,以下:
- document.getElementById(mydivtext).innerText="<b>Thisisatest</b>")
复制代码 在流派中利用独占称号
当某个流派页面由WebLogicPortal(或任何流派)举行剖析时,每一个portlet均作为完全的Web页面放在HTML文档中,包含<body>标签(偶然乃至包含<html>标签)。因而,假如在每一个portlet中一直以不异的ID来定名<div>标签(实际下去说,这仿佛是使编程尺度化的一种优秀办法),那末将取得不准确的了局。思索假如有两个ID为“result_data”的元素,那末剖析后的流派页面将会是甚么模样。
- //Outerportalshell<html>//Firstportlet...<divid="result_data"></div>...//Secondportlet...<divid="result_data"></div>...</html>
复制代码 如今,举行一次以下的挪用:
- document.getElementById(result_data).innerText="stuff";
复制代码 哪一个元素将被更新呢?谜底基础上会随扫瞄器的分歧而分歧,可是一样平常的谜底就是“第一个”。
因而,这里的最好理论是利用portlet称号作为HTML标签中一切ID的前缀。
停止语
传统的Web使用程序已没法满意客户的请求。因为Google之类的公司供应了更新、更快和交互性更强的Web站点,客户的希冀值变得愈来愈高。构建使客户能够进步事情速率和效力的用户界面一直是一项计谋性应战。
Ajax编程是Web使用程序交互方面的新的现实尺度,它为严密耦合的数据和使用程序筒仓供应了部分化决计划。出格是在与BEAWebLogic平台分离利用时,Ajax代表了Web编程的将来偏向,并预示着构建具有高度的交互性和呼应敏捷度的Web站点的新潮水。
在本系列的第二部分中,我将利用详细的例子申明怎样在WebLogicPortal情况中利用Ajax。详细来讲,我将演示大批portlet,以申明怎样从JavaScript挪用Web服务和利用了局更新页面、怎样完成代办署理servlet来处置对内部Web服务的挪用、怎样利用Ajax把Web页面嵌进到另外一个Web页面中,和怎样更新您本人的可更新数据库表小构件。
也许C#刚上市的时候有些抄袭Java吧,但自从C#2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。 |
|