《【软件工程】DWR入门教程1736.docx》由会员分享,可在线阅读,更多相关《【软件工程】DWR入门教程1736.docx(94页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如何开始用DWR有两种方法开始DWR,简单的方式是下载WAR文件然后看看。但是这不能帮你知道如何轻松的把DWR整合到你的web应用中,所以还是推荐你按照下面的3个步骤做:1. 安装DWR的Jar包下载dwr.jjar文件。把把它放到你的的webappp的WEBB-INF/lib目录录下。那里可可能已经有很很多其他的jjar文件了了。2. 编辑配置置文件需要把下面的代代码加到WEEB-INFF/web.xml文件件中。那部分需需要和其他的的在在一起,部分也一样样。 ddwr-innvokerr DDWR Seervlett uk.lttd.gettaheadd.dwr.DWRSeervlett
2、debugg truee ddwr-innvokerr /ddwr/*在WEB-INNF目录下的的web.xxml旁边创创建一个dwwr.xmll文件。可以以从最简单的的配置开始: DWR配置文件件定义了那些些DWR会创创建提供远程程调用的Jaavascrript类。在在上面的例子子中我们定义义了两个类来来提供远程调调用,并为其其提供的Jaavascrript类的的名字。在上面我们使用用了new创建器器,它会调用用没有参数的的构造函数来来创建实例,但但是所有JaavaBeaan必须有这这一构造函数数。还要注意意DWR有一一些限制: 不要出现Javvascriipt保留关关键字;和保保留关键字同
3、同名的函数指指定被排除。多多数Javaascrippt的关键字字和Javaa是相同的。所所以你不可能能有一个方法法叫做trry()。但但是该死ddeletee()对与与Javasscriptt有着特殊意意义,而对JJava则不不是。 Javascrript方法法重载是不支支持的,所以以尽量不要再再Java中中使用。 3. 访问下面面的URLhttp:/locallhost:8080/YOURR-WEBAAPP/ddwr/你可以看见一个个页面,里面面有第二步中中的类。接着着往里点,你你会看到所有有可以调用的的方法列表。这这个页面是动动态生成用来来测试的例子子。自己动手试一下下!怎么在你的weeb
4、应用中使使用在文档中有很多多例子演示如如何动态更改改页面中的文文字、更新列列表、操作表表单,还有直直接更改taable中的的内容。每一一个都有如何何实现的介绍绍。另一种方式是看看刚才的页面面中提供的代代码:到 http:/loccalhosst:80880/YYOUR-WWEBAPPP/dwwr/ 页面面,点击你的的类。查看源源码,找到执执行方法的那那几行,把那那些文字粘贴贴到你的HTTML或JSSP中。要包括下面这些些能产生神奇奇效果的Jaavascrript文件件的链接。你也可以把其中中/YOUUR-WEBBAPP/替换成你的的web页面面的相对路径径。DWR根据dwwr.xmll生成和J
5、aava代码类类似的Javvascriipt代码。相对而言Javva同步调用用,创建与JJava代码码匹配的Ajjax远程调调用接口的最最大挑战来至至与实现Ajjax的异步步调用特性。DWR通过引入入回调函数来来解决这个问问题,当结果果被返回时,DDWR会调用用这个函数。有两种推荐的方方式来使用DDWR实现远远程方法调用用。可以通过过把回调函数数放在参数列列表里,也可可以把回调函函数放到元数数据对象里。当然也可以把回回调函数做为为第一个参数数,但是不建建议使用这种种方法。因为为这种方法在在处理自动处处理httpp对象时(查查看Altternattive MMethodd)上会有有问题。这个个方
6、法主要是是为向下兼容容而存在的。简单的回调函数数假设你有一个这这样的Javva方法:public classs Remoote pubblic Strinng gettData(int inndex) . 我们可以在Jaavascrript中这这样使用: .functioon hanndleGeetDataa(str) alertt(str);Remote.getDaata(422, hanndleGeetDataa);42是Javaa方法gettData()的一个参参数。此外你也可以使使用这种减缩缩格式:Remote.getDaata(422, funnctionn(str) allert(
7、sstr); );调用元数据对象象(Metaa-Dataa)另外一种语法时时使用调用用元数据对象象来指定回回调函数和其其他的选项。上上面的例子可可以写成这样样:Remote.getDaata(422, callbback:ffunctiion(sttr) alertt(str); );这种方法有很多多优点:易于于阅读,更重重要的指定额额外的调用选选项。超时和错误处理理在回调函数的元元数据中你可可以指定超时时和错误的处处理方式。例例如:Remote.getDaata(422, callbback:ffunctiion(sttr) alertt(str); , timeoout:50000, er
8、rorrHandller:fuunctioon(messsage) allert(Oops: + messaage); );查找回调函数有些情况下我们们很难区分各各种回调选项项(记住,JJavasccript是是不支持函数数重载的)。例例如:Remote.methood( ttimeouut:3 , eerrorHHandleer:sommefuncc );这两个参数之一一是beann的参数,另另一个是元数数据对象,但但是我们不能能清楚的告诉诉DWR哪个个是哪个。为为了可以跨浏浏览器,我们们假定nulll = undeffined。 所以当前的的情况,规则则是: 如果第一个或最最后一个是一一个
9、函数,那那么它就是回回调函数,没没有元数据对对象,并且其其他参数都是是Java的的方法参数。 另外,如果最后后一个参数是是一个对象,这这个对象中有有一个calllbackk成员,并且且它是个函数数,那么这个个对象就是元元数据对象,其其他的都是JJava方法法参数。 另外,如果第一一个参数是 null ,我我们就假设没没有回调函数数,并且其他他的都是Jaava方法参参数。尽管如如此,我们会会检查最后一一个参数是不不是nulll,如果是就就发出警告。 最后如果最后一一个参数是nnull,那那么就没有ccallbaack函数。 另外,发出错误误信号是个糟糟糕的请求格格式。 创造一个与Jaava对象匹
10、匹配的Javvascriipt对象假设你有这样的的Java方方法:public classs Remoote publiic voiid settPersoon(Perrson pp) thiis.perrson = p; Person对对象的结构是是这样的:public Persoon privaate Strinng namme; privaate int agge; privaate Daate appoiintmennts; / geetterss and setteers .那么你可以在JJavasccript中中这样写:var p = name:Fredd Blogggs, age
11、:442, appoiintmennts: new Daate(), new Daate(11 Jan 2008) ;Remote.setPeerson(p);在Javasccript没没有出现的字字段,在Jaava中就不不会被设置。因为setteer都是返回回voidd,我们就就不需要使用用callbback函数数了。如果你你想要一个返返回voidd的服务端方方法的完整版版,你也可以以加上calllbackk函数。很明明显DWR不不会向它传递递任何参数。TransfoormerFFactorryConffiguraationEError这个问题的现象象是在启动有有DWR的WWeb应用时时出现
12、如下sstack tracee:root caausejavax.xxml.trransfoorm.TrransfoormerFFactorryConffiguraationEError: Proviider oorg.appache.xalann.proccessorr.TrannsformmerFacctoryIImpl nnot foound javaxx.xml.transsform.TranssformeerFacttory.nnewInsstancee(Unknnown SSourcee)这个问题和DWWR没有什么么关系,那是是因为Tommcat没有有配置好。比比较简单的解解决办法
13、是下下载Xalaan替换掉$TOMCAAT-HOMME/commmon/llib目录下下的xalaan.jarr文件。DWWR2.0能能更好的处理理这个问题,但但是本质的问问题还是因为为DWR的XXML序列化化需要有XSSLT解析器器的支持。如果你用JDKK5还是有这这个问题的话话,你可以增增加以下VMM参数来使TTomcatt正常工作。-Djavaxx.xml.transsform.TranssformeerFacttory= com.sun.oorg.appache.xalann.inteernal.xsltcc.traxx.TrannsformmerFacctoryIImplXML解析错
14、误误在刚开始用DWWR的时候经经常遇到的一一个错误就是是XML解析析错误。其实实这和DWRR没有多大关关系,主要是是因为Tommcat里面面自带的Xeerces的的问题,要不不是该有的时时候没有,要要不是不该有有的时候有了了。 JDK 1.33自身没有XXML解析器器,所以你需需要xerccesImppl.jarr和xml-apis.jar. JDK 1.44.0 和 JDK 11.4.1 虽然有了XXML解析器器,但是有很很多bug,所所以你还是需需要把xerrcesImmpl.jaar放到toomcatcommoonenddorsedd目录下。 JDK 1.44.2和JDDK 5自带带的X
15、ML解解析器工作的的很好,你就就不需要再加加其他的了。另外要提的一点是,不同版本的Tomcat需要的XML解析器不一样。所以要注意检查它和JDK的版本兼容性。 用BEA Weeblogiic的Claasspatth问题Weblogiic 8.11(有可能其其他版本同样样)可能找不不到DWR的的类。这大多出现在ddwr.jaar放在APPP-INFF目录下(AAPP_INNF/libb)的情况。在在这种情况下下DWR依然然可以工作,例例如debuug页面可以以看见,但是是DWR找不不到你的类。解决办法是把ddwr.jaar放到WEEB-INFF/lib目目录下。没有cookiies的情况况下用D
16、WRR当不能用coookies时时,servvlet规范范通过URLL重写来支持持HttpSSessioon。DWRR 2.x通通过它生成的的URL来支支持这项功能能。但是DWWR 1.xx没有这个功功能。你可以以通过以下办办法让DWRR 1.x 也支持coookiess: 从dwr.jaar中提取eenginee.js,保保存到你的文文件系统中,就就像jsp文文件一样. 修改DWREEnginee._senndDataa = fuunctioon(battch) 方法, 加加入一行: statsInnfo += ;jssessioonid= + 这样就可以让DDWR 1.x支持urrl重写了
17、。DDWR 2+默认支持。传递额外的数据据到calllback函函数 通常我们需要传传递额外的数数据到calllbackk函数,但是是因为所有的的回调函数都都只有一个参参数(远程方方法的返回结结果),这就就需要一些小小技巧了。 解决方案就是使使用Javaascrippt的闭包特性。 例如,你的回调调函数原本需需要像这个样样子: functioon calllbackkFunc(dataFFromSeerver, dataaFromBBrowseer) / 用dattaFrommServeer和dattaFrommBrowsser做些事事情. 那么你可以像这这个组织你的的函数: var datt
18、aFrommBrowsser = .; / 定义一个个闭包函数来来存储dattaFrommBrowsser的引用用,并调用ddataFrromSerrver var calllbackkProxyy = fuunctioon(dattaFrommServeer) callbacckFuncc(dataaFromSServerr, dattaFrommBrowsser); ; var calllMetaaData = ccallbaack:caallbacckProxxy ; Remote.methood(parrams, callMMetaDaata);(调用元数据在在脚本介绍中有有解释) 换
19、句话说,现在在你作为caallbacck函数传递递过来的不是是一个真正的的callbback,他他只是一个做做为代理的闭闭包,用来传传递客户端的的数据。 你可以用更简介介的形式: var dattaFrommBrowsser = .; Remote.methood(parrams, callbacck:funnctionn(dataaFromSServerr) callbacckFuncc(dataaFromSServerr, dattaFrommBrowsser); );服务器性能优化化CPU瓶颈:经经过严格的测测试DWR的的性能没什么么问题。DWWR上性能消消耗同webb服务器和网网络比起
20、来可可以忽略不计计。如果你真真的需要提升升DWR的性性能的话,可可以把logg级别设置EERROR或或FATALL,但是主要要还是要看你你的编码情况况。Networkk瓶颈: DDWR没有管管理你的浏览览器缓存的功功能,所以它它会不断的重重复读取DWWR的javvascriipt文件。这这里有一个简简单的解决办办法,把jaavascrript文件件复制到你的的web-aapp中,这这样web服服务器就可以以更好的利用用它了。你也也可以考虑把把所有的jaavascrript文件件合并成一个个文件,然后后用DOJOO的压缩程序序处理一个来来节省流量。我们可以做一个个补丁,让DDWR在weeb-ap
21、pp启动的时候候用时间做为为javasscriptt文件的时间间戳,但是这这个并不十分分重要,因为为上面的补丁丁太简单了而而且可以压缩缩合并Javvascriipt文件。WEB-INFF/web.xml 参参考手册在web.xmml中最简单单的配置就是是简单加入DDWR的seervlett,没有这个个配置DWRR就不会起作作用: ddwr-innvokerr uk.lttd.gettaheadd.dwr.DWRSeervlett ddwr-innvokerr /ddwr/*此外还可以加入入一些重要和和有用的参数数。Loggingg DWR可以工作作在JDK11.3上,而而JDK1.3不支持jj
22、ava.uutil.llogginng,但是我我们想强迫任任何人使用ccommonns-loggging或或者log44j,所以当当没有loggging类类的时候DWWR就使用HHttpSeervlett.log()方法。尽尽管如此,如如果DWR发发现了commmons-loggiing,就是是使用它。 Commonss-Loggging 几乎每一个人都都在使用coommonss-loggging,因因为大多数的的servllet容器在在使用它。所所以如果你的的web应用用中没有明显显的加入coommonss-loggging包,它它也会默认的的配置好。 在这种情况下,llogginng是由j
23、aava.uttil.looggingg或者log44j配置文件件控制的。详详细配置查看看文档。 HttpSerrvlet.log() 如果你用HtttpServvlet.llog(), 下面的配置置控制loggging: logLeevel DEBUUG 可用的值有:FFATAL, ERROOR, WAARN (默默认), IINFO 和和 DEBUUG。 多个dwr.xxml文件 和 J2EEE安全 一般来说,你只只需要一个ddwr.xmml文件,并并且放置在默默认的位置:WEB-IINF/dwwr.xmll。 如果那那样的话,你你可以不用了了解下面的配配置。 有三个原因使你你希望指定不不
24、同位置的ddwr.xmml文件。 你希望让dwrr.xml文文件和它能访访问到的资源源在一起。在在这种情况下下你需要一个个这样的配置置: WEB-IINF/cllassess/com/yourcco/dwrr/dwr.xml 。 你有大量的远程程调用类,希希望把他们分分成多个文件件。在这种情情况下你需要要重复下面的的配置几次,每每一个中有不不同的 paaram-nname,并并且以 &aapos;cconfigg&aposs; 开头。DDWR会依次次把他们都读读进来。 DWR可以使用用Servllet规范的的J2EE的的URL安全全机制来给不不同的用户不不同的访问权权限。你只需需要简单的定定义
25、多个dwwr serrvlet,并并且制定不同同的名字,uurl和访问问权限。 如果你希望使用用这一功能,那那么语法是这这样的: confiig* WEB-INF/ddwr.xmml Whatt conffig fiile doo we uuse? 在这里conffig*意思是是paramm-namee要以字符串串confiig开头。这这个参数可以以根据需要使使用多次,但但是不能相同同。 一个使用J2EEE的安全机机制的例子: dwrr-userr-invooker ukk.ltd.getahhead.ddwr.DWWRServvlet confiig-useer WEB-INF/ddwr-u
26、sser.xmml dwrr-admiin-invvoker ukk.ltd.getahhead.ddwr.DWWRServvlet confiig-admmin WEB-INF/ddwr-addmin.xxml dwrr-admiin-invvoker /dwrradminn/* dwrr-userr-invooker /dwrruser/* dwrr-admiin dwrr-admiin-colllectiion /dwrradminn/* aadmin dwrr-userr dwrr-userr-colllectioon /dwrruser/* uuser 使用插件(Pllug-inn)
27、 DWR里的很多多部件都是可可插入的,所所以可以通过过替换掉DWWR的默认实实现类来改变变其功能。你你可以在 中的 paramm-namee 中指定你你要替换的接接口,并在 paramm-valuue 中指定定自己的接口口实现类。 可插入点是: uk.ltd.getahhead.ddwr.AcccessCControol uk.ltd.getahhead.ddwr.Coonfiguuratioon uk.ltd.getahhead.ddwr.CoonvertterMannager uk.ltd.getahhead.ddwr.CrreatorrManagger uk.ltd.getahhead.
28、ddwr.Prrocesssor uk.ltd.getahhead.ddwr.ExxecutiionConntext 这些可插入点默默认的实现都都在uk.lltd.geetaheaad.dwrr.impll中。 使用debugg/testt模式 你可以通过下面面的参数让DDWR进入ddebug/test模模式: debugg truee 在debug模模式里,DWWR会为每一一个远程调用用类生成一个个测试页面。这这对于检查DDWR是否工工作和工作的的怎么样是很很有用的。这这个模式还可可以警告你一一些存在的问问题:javvascriipt保留字字问题,或者者函数重载问问题。 尽管如此,这个个模式
29、不应该该使用在实际际部署环境里里面,因为它它可以为攻击击者提供你的的服务的大量量信息。如果果你的网站设设计的好的话话,这些信息息不会帮助攻攻击者窥视你你的网站内容容,但是还是是不要给任何何人一个找到到你错误的机机会好。 DWR就是照上上面的样子做做的,没有任任何保证,所所以你的网站站的安全是你你的责任。请请小心。配置DWR - dwr.xmldwr.xmll是DWR的的配置文件。默默认情况下,应应该把它放到到WEB-IINF目录(web.xxml的目录录)下。DTD这里还有一个ddwr.xmml对应的DDTD文档以以及一个用DDTDDocc生成的参考手手册。创建dwr.xxml文件dwr.xm
30、ll文件的结构构如下: . 术语这里是一些必须须理解的术语语 - 参数数会被connverteed,远程BBean会被被creatted。所以以如果你有一一个叫A的bbean,它它有一个方法法叫A.bllah(B) 那么你需需要一个A的的creattor和一个个B的connverteer。allow段落落里面定义的的试DWR可可以创建和转转换的类。Creatorrs我们要调用的每每个类都需要要一个定定义。creeator有有几种。比较较通用的是nnew关键字字和Spriing。更多多的信息可以以参见Crreaterrs文档。Convertters我们必须保证所所有的参数都都可以被转换换。JDK
31、中中的多数类型型已经有转换换器了,但是是你需要给DDWR转换你你的代码的权权利。一般来来说JavaaBean的的参数需要一一个定定义。默认情况下,如如下类型不需需要定义就可可以转换: 所有的原生类型型 boollean,iint,doouble, 等等 原生类型的对象象类型 Boooleann,Inteeger,等等等 java.laang.Sttring java.uttil.Daate 和SSQL中的DDate 以上类型组成的的数组 以上类型的集合合类型 (LLists, Setss, Mapps, Itteratoors, 等等) 从DOM, XXOM, JJDOM 和和 DOM44J中
32、的DOOM对象 (类似 Ellementt 和 Doocumennt) 要了解如何转换换你的JavvaBeann或者其他类类型的参数请请查看Connverteers文档。可选的initt部分用来声声明创造beean的类和和转换beaan的类。多多数情况下你你不需要用到到他们。如果果你需要定义义一个新的CCreatoor JaavaDocc 和 CConverrter JavaDDoc , 那么你就需需要在这里定定义他们。但但是建议你现现检查一下DDWR是不是是已经支持了了。在init部分分里有了定义义只是告诉DDWR这些扩扩展类的存在在,给出了如如何使用的信信息。这时他他们还没有被被使用。这中
33、中方式很像JJava中的的imporrt语句。多多数类需要在在使用前先iimportt一下,但是是只有impport语句句并不表明这这个类已经被被使用了。每每一个creeator和和conveerter都都用id属性性,以便后面面使用。DWR使用反射射来找出在转转换时应该用用那种类型。有有时类型信息息并不明确,这这时你可以在在这里写下方方法的签名来来明确类型。详详细信息查看看Signaaturess部分。多个dwr.xxml文件可以有多个dwwr.xmll文件(详细细信息见weeb.xmll文档)。每每个文件中的的定义会被加加在一起。DDWR用这个个功能来加载载基础配置文文件。我们可可以看看标
34、准准被配置文件件来了解dwwr.xmll的内容。转换器转换器在客户端端和服务器之之间转换数据据.下面这些转换器器有单独章节节介绍 Array CConverrter Bean annd Objject CConverrters Collecttion CConverrter Enum Coonvertter DOM Objjects Hibernaate整合 Servlett Objeects (HttpSServleetRequuest, HttpSSessioon, ettc) 基础的转换器原生类型,Sttring,像像BigDeecimall这样的简单单对象的转换换器已经有了了。你不需要要在dwr.xml中部分的中定定义。它们默默认支持。默认支持的类型型包括: bbooleaan, byyte, sshort, int, longg, flooat, ddoublee, chaar