engine.js对于DWR非常重要,engine.js和util.js相当于DWR的两个静态函数库,使用DWR时engine.js必须导入,util.js可以简化DOM操作选择导入,Ajax通常是异步调用,因此发送请求的顺序与返回的顺序并不一定一致,要想使其一致可以:
dwr.engine.setOrdered(true);
这样的话,在旧的请求返回之前,DWR不会发送新的请求,所以会导致性能降低
使用JSON回调时每次都要指定超时时长,会很繁琐,为了避免重复指定可以通过指定全局超时时长:
dwr.engine.setTimeout(5000);
也可以指定全局的Hook函数:
//设置全局的调用前Hook函数 dwr.engine.setPreHook(preFunction); //设置全局的调用后Hook函数 dwr.engine.setPostHook(postFunction);
也可设置全局处理函数:
//设置全局的错误处理函数 dwr.engine.setErrorHandler(errorFunction()); //设置全局的警告处理函数 dwr.engine.setWarningHandler(warnFunction()); //设置全局的异常处理函数 dwr.engine.setExceptionHandler(exceptFunction()); //设置全局的内容异常处理函数 dwr.engine.setTextHtmlHandler(textHtFunction());
也可以指定全局的是否采用异步方式:默认是true:
dwr.engine.setAsync(true|false);
指定全局的请求方法:
dwr.engine.setHttpMethod(POST|GET);
指定全局的远程调用的方式:
dwr.engine.setRpcType(XMLHttpRequest|Iframe|ScriptTag);
如果浏览器禁用ActiveX则不可用XMLHttpRequest,不过通常DWR会智能选择
如果既指定了全局又在单次调用指定了则全局会被覆盖
为了避免频繁多次调用服务器方法,DWR提供了批处理功能,当开启批处理功能时发送的请求不会立即发送到服务器,都会在等待队列中直到调用dwr.engine.endBatch()方法之后,DWR会通过一次交互来完成全部调用,不可在批处理时指定同步调用,也不能单独设置hook、timeouts等选项:
dwr.engine.beginBatch(); hello.sendMessage("wang",callb1); hello.hello("li",call2); dwr.engine.endBatch({ timeout:3000, errorHandler:function(msg){alert(msg);} });