DWR学习笔记(六)
七.engine.js的功能:engine.js对DWR非常重要,因为它是用来转换和动态生成javascript的接口供函数调用的js库文件,
??????所以只要用到DWR的地方就需要导入它。
??????<script?type="text/javascript"?src="/[YOUR-WEB-APP]/dwr/engine.js"></script>
??????
???**功能介绍:我们主要可以操作js对象DWREngine来操作一些API,可以设置一些DWR执行性能或着执行方式等。
??????主要针对DWR界面通过js调用java对象方法的时候可以使用DWREngine对象进行一些辅助的设置等!
???
??????(1)批量调用:可以使用batch来批量的执行远程调用(即DWR界面通过js调用java对象)。
??????????这样可以减少与服务器的交互次数,所以可以提交反应速度。
??????????就是说一个批量执行不管内部调用了几个java方法都将只与服务器交互一次。
??????????
??????????**原理规则:一个batch以DWREngine.beginBatch()开始?,并以DWREngine.endBatch()结束。
?????????????当DWREngine.endBatch()被调用,就结束了该次远程调用,
?????????????这样DWR就在一次与服务器的交互中执行batch中所有的调用。
?????????????
??????????**注意:DWR会小心的处理保证所有的回调函数都会被调用,所以你可以明显的打开和关闭批处理。
????????????只要别忘了调用endBatch(),否则所有的远程调用将永远的处于列队中,不会得到返回,更不会调用回调函数。
????????????
??????????例子:界面js调用java对象时的批量调用写法
??????????//批量调用开始
??????????DWREngine.beginBatch();
??????????Remote.methodInBatch1(params,?callback1);
??????????Remote.methodInBatch2(params,?callback2);
??????????//批量调用结束,结束endBatch()方法中可以传递一些参数,像超时和异常处理等
??????????DWREngine.endBatch(
????????????//超时时间3000毫秒,这属于局部超时属性的设置,
????????????//所以只在该batch中起作用,对batch之外的调用不起作用
????????????{?timeout:3000}
??????????);
??????????**说明:batch中的两个调用将只进行一次请求,并且回调函数会正常被调用,这样就提高了效率!
????????????如果同一个batch中设置了多个相同的选项的值,例如除了endBatch()设置了超时,
????????????两个调用中也设置了超时选项,那么对于该batch中只有最后一个设置会起作用,之前的设置DWR将会忽略
??????
??????(2)顺序调用:因为Ajax一般是异步调用,所以远程调用不会按照发送的顺序返回。
??????????DWREngine.setOrdered(boolean)?允许结果严格按照发送的顺序返回。
??????????如果设置true的话DWR将在旧的请求安全返回以后才去发送新的请求。
??????????默认为false,一般不会设置成true。
??????
??????(3)错误警告和超时:
????????
????????<1>处理错误和警告:当因为一些原因调用失败,
??????????????DWR就会调用错误和警告handler处理机制(根据错误的激烈程度),并传递错误消息。
??????????
??????????**分析:就是当出现错误后我们可以指定让DWR转去调用我们指定的js函数中去执行
??????????
??????????**方案:DWREngine.setErrorHandler(function)来改变错误处理方式,
????????????DWREngine.setWarningHandler(function)来改变警告处理方式,
????????????在作为参数传入的js函数中就可以进行alert()信息或其他处理。
????????
????????<2>设置超时:通过DWREngine.setTimeout()可以设置js调用java对象请求超时的时间,
????????????可以设置全局(任何js调用之前设定,类似全局变量的设定)超时时间,
????????????也可以设定局部超时时间,例如一个batch中有效的超时设定。
??????????
??????????**注意:如果调用超时发生(也就是超时了),错误处理器就会被调用,
????????????即DWREngine.setErrorHandler(function)指定的方法就会被调用。
????????????
??????????例子:??Remote.method(
?????????????params,
?????????????{?
??????????????callback:function(data){?alert("it?worked");?},
??????????????errorHandler:function(message){?alert("it?broke");?},
??????????????timeout:1000?
?????????????}
???????????????);
????????????**说明:如果Remote.method()调用超过了1秒钟还没有返回,
??????????????errorHandler指定的函数会被调用,即"it?broke"消息就会被显示
??????
??????(4)远程调Hooks?:如果你想在DWR调用之前出现一个提示,你可以设置pre-hook函数。
???????????它将会被调用,但是没有参数传递到这个函数。
???????????当你希望让一些按钮在调用期间变灰来防止被再次使用,这一功能将会很有用。
???????????post-hook用来和pre-hook一起使用来恢复pre-hook指定的函数所做的一些改变。
??????
??????????**使用方法:通过DWREngine.setPreHook(function)?和?DWREngine.setPostHook(function)来注册将被调用的js函数
??????
??????(5)远程调用选项(用到时再查看文档):DWR有一些选项用来控制远程调用的处理方式。
???????????method和verb对于用户应该是透明的,但是不同的浏览器效果可能不一样。
???????????一般来说DWR会选择正确方法来处理,但是这些选项对于在不同效果的浏览器之间开发很有用。
???????????
?????????<1>DWREngine.setAsync(flag)方法:
?????????????指定让XHR异步调用了吗??默认为true。
?????????????警告如果你使用的时IFrame或者ScriptTag这一选项被忽略。
?????????????一般来说把他变成false是个糟糕的做法。因为那样会使你的浏览器变慢。
?????????????
????????????参数值:
??????????????true???设置成异步交互,也是默认值
??????????????false??设置成同步交互,不推荐设置成false
?????????
?????????<2>DWREngine.setMethod(newmethod)方法:
?????????????setMethod()不能保证一定使用你选择的newmethod方法,
?????????????它只是保证首先尝试使用那个方法。
?????????????newmethod必须是DWREngine.XMLHttpRequest或者DWREngine.IFrame或者DWREngine.ScriptTag中之一。
?????????
?????????<3>DWREngine.setVerb(verb)方法:
?????????????这个选项允许你选择POST和GET,无论是用IFrame还是XMLHttpRequest方法。
?????????????一些浏览器(例如旧版的Safari)不支持XHR-POST所以DWR就自动切换到GET,
?????????????即使你设置的verb是POST。所以setVerb()应当被仅仅做为一个提示。
?????????????如果使用ScriptTag方法来远程调用,设置verb是没有用的
?????????????
???????????例子:
?????????????A.设置全局远程调用的verb?:DWREngine.setVerb("GET");
?????????????
?????????????B.设置单次调用局部verb?:?Remote.method(
????????????????????params,
????????????????????{?
?????????????????????callback:function(data)?{?...?},
?????????????????????verb:"GET"
????????????????????}
?????????????????????);
?????????????
?????????????C.设置batch级别的局部verb?:DWREngine.beginBatch();
???????????????????????Remote.method1(params,?callback1);
???????????????????????Remote.method2(params,?callback2);
???????????????????????DWREngine.endBatch({?verb:"GET"?});
?
来自http://seara520.blog.163.com/blog/static/1681276982010027259829/