`
sswh
  • 浏览: 163943 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

DWR同步调用的一点改进

阅读更多
DWR提供的JS方法调用默认是异步的,为了得到同步的运行结果,一般类似以下方式处理:

 DWREngine.setAsync(false); //设置成同步
 var _data = null;
 test1Ajax.sayHello('hello', function(data){_data = data;}); //dwr调用服务端的函数
 DWREngine.setAsync(true); //重新设置成异步
 alert(_data); //对返回值进行处理


很简单的需求,为什么代码要如此繁琐呢?
可以对DWR简单改动后,以下面的方式调用同步方法:

 var result = test1Ajax.sayHello('hello'); //调用同步方法
 alert(result); //对返回值进行处理


如果需要异步调用的话,和以前的写法一样:

 test1Ajax.sayHello('hello', function(data){
   alert(data);//在对返回值进行处理
 });


改动主要是将设置同步的操作放到DWR动态生成的JS代码中,如下:

package org.directwebremoting;

import java.lang.reflect.Method;

import org.directwebremoting.extend.EnginePrivate;
import org.directwebremoting.impl.DefaultRemoter;
import org.directwebremoting.util.LocalUtil;

/**
 * 支持DWR同步方法调用 支持DWR3.0.0.116.rc1<br>
 * 
 * JS代码 异步调用:<br>
 * test1.sayHello("hello", function(data){ alert(data); } );
 * 
 * JS代码 同步调用:<br>
 * var result = test1.sayHello("hello"); <br>
 * alert(result);
 * 
 * @author sswh
 * @createDate 2010-5-12
 */
public class SyncRemoter extends DefaultRemoter {

	@Override
	protected String getMethodJS(String scriptName, Method method) {
		StringBuffer buffer = new StringBuffer();

		String methodName = method.getName();
		Class<?>[] paramTypes = method.getParameterTypes();

		// Create the sdoc comment
		buffer.append("/**\n");
		for (int j = 0; j < paramTypes.length; j++) {
			if (!LocalUtil.isServletClass(paramTypes[j])) {
				buffer.append(" * @param {");
				buffer.append(paramTypes[j]);
				buffer.append("} p");
				buffer.append(j);
				buffer.append(" a param\n");
			}
		}
		buffer.append(" * @param {function|Object} callback callback function or options object\n");
		buffer.append(" */\n");

		// Create the function definition
		buffer.append(scriptName);
		buffer.append('.');
		buffer.append(methodName);
		buffer.append(" = function(");
		for (int j = 0; j < paramTypes.length; j++) {
			if (!LocalUtil.isServletClass(paramTypes[j])) {
				buffer.append("p");
				buffer.append(j);
				buffer.append(", ");
			}
		}
		buffer.append("callback) {\n");

		buffer.append("  if(callback != null){\n");
		// The method body calls into engine.js
		buffer.append("    return ");
		buffer.append(EnginePrivate.getExecuteFunctionName());
		buffer.append("(");
		buffer.append(scriptName);
		buffer.append("._path, '");
		buffer.append(scriptName);
		buffer.append("', '");
		buffer.append(methodName);
		buffer.append("\', arguments);\n");
		buffer.append("  }\n\n");

		buffer.append("  //synchronized\n");
		buffer.append("  var dwr_result = null;\n");
		buffer.append("  var dwr_async = dwr.engine._async;\n");
		buffer.append("  dwr.engine._async = false;\n");
		buffer.append("  var dwr_callback = function(data){dwr_result = data;};\n");
		buffer.append("  var dwr_arguments = [];\n");
		buffer.append("  for(var i=0; i<arguments.length; i++) dwr_arguments[i] = arguments[i];\n");
		buffer.append("  dwr_arguments[arguments.length] = dwr_callback;\n  ");
		buffer.append(EnginePrivate.getExecuteFunctionName());
		buffer.append("(");
		buffer.append(scriptName);
		buffer.append("._path, '");
		buffer.append(scriptName);
		buffer.append("', '");
		buffer.append(methodName);
		buffer.append("\', dwr_arguments);\n");
		buffer.append("  dwr.engine._async = dwr_async;\n");
		buffer.append("  return dwr_result;\n");
		buffer.append("};\n\n");

		return buffer.toString();

	}
}


另外重新提供一个defaults.properties文件,将其中的
org.directwebremoting.extend.Remoter修改为:org.directwebremoting.SyncRemoter即可。
分享到:
评论

相关推荐

    DWR+dwr入门手册

    同步调用会阻塞浏览器直到服务器返回结果,而异步调用则在后台执行,允许用户在等待结果的同时继续操作页面。 5. **DWR的Batching机制**:DWR允许批量执行多个远程调用,这样可以减少网络往返次数,提高性能。 6. ...

    dwr dwr包 dwr3.0文档 dwr3.0.jar

    DWR3.0是该框架的一个版本,提供了许多增强的功能和改进,使得开发人员可以更加便捷地构建富互联网应用程序(RIA)。 在DWR3.0中,有几个核心概念和技术点值得深入探讨: 1. **AJAX 支持**: DWR通过AJAX技术使...

    DWR3.rar

    4. **异步和同步调用**:开发者可以选择同步或异步方式调用服务器端方法,根据具体场景选择最适合的方式。 5. **JSON和XML支持**:DWR3支持多种数据交换格式,包括JSON(JavaScript Object Notation)和XML,方便...

    DWR3.0官方中文入门教程以及dwr3.0jar

    - **异步调用**:除了同步调用,DWR还支持异步调用,提高用户体验。 - **Batching**:将多个请求打包成一个批次发送,优化网络效率。 通过学习这个DWR3.0官方中文入门教程,开发者不仅可以了解如何在项目中集成...

    DWR两个依赖包

    - **异步与同步调用**:支持JavaScript对Java方法的同步和异步调用,提供更好的用户体验。 - **批量调用**:允许一次发送多个请求,减少网络开销。 - **自定义序列化与反序列化**:用户可以自定义对象的序列化和...

    dwr2 资料

    在DWR 2版本中,有一些关键的改进和特性: 1. **安全增强**: DWR 2增强了安全性,提供了更严格的白名单配置,确保只有预定义的Java方法可以被远程调用,避免了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等安全风险。...

    dwr3.0文档和jar包

    DWR 3.0是该技术的一个版本,提供了许多增强的功能和改进,旨在简化开发过程并提高性能。 在DWR 3.0中,有几个核心概念和技术点值得深入探讨: 1. **AJAX通信**:DWR的核心功能是通过AJAX(Asynchronous ...

    dwr3.x demo 实例 例子

    DWR3.x是DWR的一个版本,提供了许多增强的功能和改进,使得开发人员能够更方便地构建动态、交互式的Web应用。 在这个"Dwr3.x demo 实例 例子"中,我们可以学习到以下几个关键知识点: 1. **反转Ajax**:DWR的核心...

    DWR学习资料汇总(PDF)

    5. **异步与同步调用:**理解DWR的异步和同步调用模式,知道何时使用哪种模式,以及如何处理回调函数。 6. **错误处理与调试:**学习如何在客户端和服务器端处理DWR调用中出现的错误,并熟悉DWR的调试工具和日志...

    DWR 3.0例子程序原码

    5. **异步与同步调用**:DWR支持异步和同步调用,使得开发者可以根据需求选择合适的方式。通过查看`dwr0.1`中的代码,我们可以学习如何处理这两种模式。 6. **批量调用与缓存**:DWR 3.0引入了批量调用功能,允许一...

    DWR3.0 jar +实例

    3. **异步与同步调用**:DWR支持同步和异步调用,这使得开发者可以根据应用需求选择合适的方式。同步调用等待服务器响应后继续执行,而异步调用则允许前端代码在等待服务器响应时继续运行。 4. **缓存管理**:DWR...

    Practical.DWR.2.Projects

    2. **异步与同步调用**: 支持异步和同步调用模式,开发者可以根据需求选择最适合的调用方式。 3. **批量调用**: DWR 2 支持批量调用多个服务器方法,提高了网络通信效率。 4. **Caching**: DWR 2 提供缓存机制,...

    dwr2推送Demo

    DWR2是DWR的第二个主要版本,提供了许多改进和新特性,使得开发人员能够更轻松地实现Ajax(Asynchronous JavaScript and XML)功能。 在"Dwr2推送Demo"中,我们主要关注的是DWR的实时推送功能。在传统的Web应用中,...

    dwr2.0示例

    4. **异步与同步调用**:DWR支持JavaScript进行异步和同步两种方式调用服务器端的方法。异步调用在不阻塞用户界面的情况下发送请求,提高了用户体验;同步调用则在等待服务器响应后才继续执行后续代码。 5. **...

    一份比较全的SSH面试和数据库面试题

    4. **DWR的含义和功能**:Direct Web Remoting(DWR)是一个允许在客户端JavaScript和服务器端Java之间进行直接调用的Web框架。它动态生成JavaScript代码,支持DOM Trees、Spring框架和commons-logging。 5. **Ajax...

Global site tag (gtag.js) - Google Analytics