您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 【软件工程】DWR入门教程
如何开始用DWR有两种方法开始DWR,简单的方式是下载WAR文件然后看看。但是这不能帮你知道如何轻松的把DWR整合到你的web应用中,所以还是推荐你按照下面的3个步骤做:1.安装DWR的Jar包下载dwr.jar文件。把它放到你的webapp的WEB-INF/lib目录下。那里可能已经有很多其他的jar文件了。2.编辑配置文件需要把下面的代码加到WEB-INF/web.xml文件中。servlet那部分需要和其他的servlet在一起,servlet-mapping部分也一样。servletservlet-namedwr-invoker/servlet-namedisplay-nameDWRServlet/display-nameservlet-classuk.ltd.getahead.dwr.DWRServlet/servlet-classinit-paramparam-namedebug/param-nameparam-valuetrue/param-value/init-param/servletservlet-mappingservlet-namedwr-invoker/servlet-nameurl-pattern/dwr/*/url-pattern/servlet-mapping在WEB-INF目录下的web.xml旁边创建一个dwr.xml文件。可以从最简单的配置开始:!DOCTYPEdwrPUBLIC-//GetAheadLimited//DTDDirectWebRemoting1.0//EN=newjavascript=JDateparamname=classvalue=java.util.Date//createcreatecreator=newjavascript=Demoparamname=classvalue=your.java.Bean//create/allow/dwrDWR配置文件定义了那些DWR会创建提供远程调用的Javascript类。在上面的例子中我们定义了两个类来提供远程调用,并为其提供的Javascript类的名字。在上面我们使用了new创建器,它会调用没有参数的构造函数来创建实例,但是所有JavaBean必须有这一构造函数。还要注意DWR有一些限制:不要出现Javascript保留关键字;和保留关键字同名的函数指定被排除。多数Javascript的关键字和Java是相同的。所以你不可能有一个方法叫做try()。但是该死delete()对与Javascript有着特殊意义,而对Java则不是。Javascript方法重载是不支持的,所以尽量不要再Java中使用。3.访问下面的URL[YOUR-WEBAPP]/dwr/你可以看见一个页面,里面有第二步中的类。接着往里点,你会看到所有可以调用的方法列表。这个页面是动态生成用来测试的例子。自己动手试一下!怎么在你的web应用中使用在文档中有很多例子演示如何动态更改页面中的文字、更新列表、操作表单,还有直接更改table中的内容。每一个都有如何实现的介绍。另一种方式是看刚才的页面中提供的代码:到[YOUR-WEBAPP\]/dwr/页面,点击你的类。查看源码,找到执行方法的那几行,把那些文字粘贴到你的HTML或JSP中。要包括下面这些能产生神奇效果的Javascript文件的链接。scriptsrc='/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js'/scriptscriptsrc='/[YOUR-WEBAPP]/dwr/engine.js'/script你也可以把其中/[YOUR-WEBAPP]/替换成你的web页面的相对路径。DWR根据dwr.xml生成和Java代码类似的Javascript代码。相对而言Java同步调用,创建与Java代码匹配的Ajax远程调用接口的最大挑战来至与实现Ajax的异步调用特性。DWR通过引入回调函数来解决这个问题,当结果被返回时,DWR会调用这个函数。有两种推荐的方式来使用DWR实现远程方法调用。可以通过把回调函数放在参数列表里,也可以把回调函数放到元数据对象里。当然也可以把回调函数做为第一个参数,但是不建议使用这种方法。因为这种方法在处理自动处理http对象时(查看AlternativeMethod)上会有问题。这个方法主要是为向下兼容而存在的。简单的回调函数假设你有一个这样的Java方法:publicclassRemote{publicStringgetData(intindex){...}}我们可以在Javascript中这样使用:scripttype=text/javascriptsrc=[WEBAPP]/dwr/interface/Remote.js/scriptscripttype=text/javascriptsrc=[WEBAPP]/dwr/engine.js/script...functionhandleGetData(str){alert(str);}Remote.getData(42,handleGetData);42是Java方法getData()的一个参数。此外你也可以使用这种减缩格式:Remote.getData(42,function(str){alert(str);});调用元数据对象(Meta-Data)另外一种语法时使用调用元数据对象来指定回调函数和其他的选项。上面的例子可以写成这样:Remote.getData(42,{callback:function(str){alert(str);}});这种方法有很多优点:易于阅读,更重要的指定额外的调用选项。超时和错误处理在回调函数的元数据中你可以指定超时和错误的处理方式。例如:Remote.getData(42,{callback:function(str){alert(str);},timeout:5000,errorHandler:function(message){alert(Oops:+message);}});查找回调函数有些情况下我们很难区分各种回调选项(记住,Javascript是不支持函数重载的)。例如:Remote.method({timeout:3},{errorHandler:somefunc});这两个参数之一是bean的参数,另一个是元数据对象,但是我们不能清楚的告诉DWR哪个是哪个。为了可以跨浏览器,我们假定null==undefined。所以当前的情况,规则是:如果第一个或最后一个是一个函数,那么它就是回调函数,没有元数据对象,并且其他参数都是Java的方法参数。另外,如果最后一个参数是一个对象,这个对象中有一个callback成员,并且它是个函数,那么这个对象就是元数据对象,其他的都是Java方法参数。另外,如果第一个参数是null,我们就假设没有回调函数,并且其他的都是Java方法参数。尽管如此,我们会检查最后一个参数是不是null,如果是就发出警告。最后如果最后一个参数是null,那么就没有callback函数。另外,发出错误信号是个糟糕的请求格式。创造一个与Java对象匹配的Javascript对象假设你有这样的Java方法:publicclassRemote{publicvoidsetPerson(Personp){this.person=p;}}Person对象的结构是这样的:publicPerson{privateStringname;privateintage;privateDate[]appointments;//gettersandsetters...}那么你可以在Javascript中这样写:varp={name:FredBloggs,age:42,appointments:[newDate(),newDate(1Jan2008)]};Remote.setPerson(p);在Javascript没有出现的字段,在Java中就不会被设置。因为setter都是返回'void',我们就不需要使用callback函数了。如果你想要一个返回void的服务端方法的完整版,你也可以加上callback函数。很明显DWR不会向它传递任何参数。TransformerFactoryConfigurationError这个问题的现象是在启动有DWR的Web应用时出现如下stacktrace:rootcausejavax.xml.transform.TransformerFactoryConfigurationError:Providerorg.apache.xalan.processor.TransformerFactoryImplnotfoundjavax.xml.transform.TransformerFactory.newInstance(UnknownSource)这个问题和DWR没有什么关系,那是因为Tomcat没有配置好。比较简单的解决办法是下载Xalan替换掉$TOMCAT-HOME/common/lib目录下的xalan.jar文件。DWR2.0能更好的处理这个问题,但是本质的问题还是因为DWR的XML序列化需要有XSLT解析器的支持。如果你用JDK5还是有这个问题的话,你可以增加以下VM参数来使Tomcat正常工作。-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImplXML解析错误在刚开始用DWR的时候经常遇到的一个错误就是XML解析错误。其实这和DWR没有多大关系,主要是因为Tomcat里面自带的Xerces的问题,要不是该有的时候没有,要不是不该有的时候有了。JDK1.3自身没有XML解析器,所以你需要xercesImpl.jar和xml-apis.jar.JDK1.4.0和JDK1.4.1虽然有了XML解析器,但是有很多bug,所以你还是需要把xercesImpl.jar放到tomcat\common\endorsed目录下。JDK1.4.2和JDK5自带的XML解析器工作的很好,你就不需要再加其他的了。另外要提的一点是,不同版本的Tomcat需要的XML解析器不一样。所以要注意检查它和JDK的版本兼容性。用BEAWeblogic的Classpath问题Weblogic8.1(有可能其他版本同样)可能找不到DWR的类。这大多出现在dwr.jar放在APP-INF目录下(APP_INF/lib)的情况。在这种情况下DWR依然可以工作,例如debug页面可以看见,但是DWR找不到你的类。解决办法是把dwr.jar放到WEB-INF/lib目录下。没有cookies的情况下用DWR当不能用cookies时,servlet规范通过URL重写来支持HttpSession。DWR2.x通过它生成的URL来支持这项功能。但是DWR1.x没有这个功能。你可以通过以下办法让DWR1.x也支持cookies:从dwr.jar中提取engine.js,保存到你的文件系统中,就像jsp文件一样.修改DWREngine._sendData=function(batch)方法,加入一行:statsInfo+=;jsessionid=+%='+session.getId()+'%这样就可以让DWR1.x支持url重写了。DWR2+默认支持。传递额外的数据到callback函数
本文标题:【软件工程】DWR入门教程
链接地址:https://www.777doc.com/doc-166813 .html