www.gusucode.com > 带进度条的JSP文件上传程序源码程序 > 带进度条的JSP文件上传程序/uploadsample/uploadsample/javascript/AjaxWrapper.js

    //类工具
var ClassUtils=Class.create();
ClassUtils.prototype={
	_ClassUtilsName:'ClassUtils',
	initialize:function(){
	},
	/**
	 * 给类的每个方法注册一个对类对象的自我引用
	 * @param reference 对类对象的引用
	 */
	registerFuncSelfLink:function(reference){
		for (var n in reference) {
        	var item = reference[n];                        
        	if (item instanceof Function) 
				item.$ = reference;
    	}
	}
}
//Ajax操作封装类:
//由于调用AjaxRequest类进行XMLHTTPRequest操作时,this引用(指向当前的对象)会出现了call stack问题,从而指向当前的对象。
//所以,对putRequest、callBackHandler、以及callback方法都要使用arguments.callee.$来获得正确的类对象引用
var AjaxWrapper=Class.create();
AjaxWrapper.prototype={
	debug_flag:false,
	xml_source:'',
	/**
	 * 初始化
	 * @param isDebug 是否显示调试信息
	 */
	initialize:function(isDebug){
		new ClassUtils().registerFuncSelfLink(this);
		this.debug_flag=isDebug;
		
	},
	/**
	 * 以get的方式向server发送request
	 * @param url
	 * @param params
	 * @param callBackFunction 发送成功后回调的函数或者函数名
	 */
	putRequest:function(url,params,callBackFunction){
		var funcHolder=arguments.callee.$;
	    var xmlHttp = new Ajax.Request(url,
			{
				method: 'get', 
	    		parameters: params, 
				requestHeaders:['my-header-encoding','utf-8'],
	    		onFailure: function(){
					alert('对不起,网络通讯失败,请重新刷新!');
				},
				onSuccess: function(transport){
				},
				onComplete: function(transport){
					funcHolder.callBackHandler.apply(funcHolder,[transport,callBackFunction]);
				}
			});
	},
	/**
	 * 以post的方式向server发送xml请求
	 * @param url
	 * @param postDataBody
	 * @param callBackFunction 发送成功后回调的函数或者函数名
	 */
	pushRequest:function(url,postDataBody,callBackFunction){
		var funcHolder=arguments.callee.$;
		var options={
				method: 'post', 
		    	parameters:'',
		    	requestHeaders:['my-header-encoding','utf-8'],
		    	postBody: postDataBody,
				onFailure: function(transport){
					alert('对不起,网络通讯失败,请重新发送!');
				},
				onComplete: function(transport){
					funcHolder.callBackHandler.apply(funcHolder,[transport,callBackFunction]);
				}
			};
		var xmlHttp = new Ajax.Request(url,options);
	},
	/**
	 * 远程调用的回调处理
	 * @param transport xmlhttp的transport
	 * @param callBackFunction 回调时call的方法,可以是函数也可以是函数名
	 */
	callBackHandler:function(transport,callBackFunction){
		var funcHolder=arguments.callee.$;
		if(transport.status!=200){
			alert("获得回应失败,请求状态:"+transport.status);
		}
		else{
			funcHolder.xml_source=transport.responseText;
			if (funcHolder.debug_flag)
				alert('call callback function');
			if (typeof(callBackFunction)=='function'){
				if (funcHolder.debug_flag){
					alert('invoke callbackFunc');
				}
				callBackFunction(transport.responseText);
			}
			else{
				if (funcHolder.debug_flag){
					alert('evalFunc callbackFunc');
				}
				new execute().evalFunc(callBackFunction,transport.responseText);
			}
			if (funcHolder.debug_flag)
				alert('end callback function');
		}
	},
	//显示xml信息
	showXMLResponse:function(){
		var funcHolder=arguments.callee.$;
		alert(funcHolder.xml_source);
	}
}

var XMLDomForAjax=Class.create();
XMLDomForAjax.prototype={
	isDebug:false,
	//dom节点类型常量
	ELEMENT_NODE:1,
	ATTRIBUTE_NODE:2,
    TEXT_NODE:3,
    CDATA_SECTION_NODE:4,
    ENTITY_REFERENCE_NODE:5,
    ENTITY_NODE:6,
    PROCESSING_INSTRUCTION_NODE:7,
    COMMENT_NODE:8,
    DOCUMENT_NODE:9,
    DOCUMENT_TYPE_NODE:10,
    DOCUMENT_FRAGMENT_NODE:11,
    NOTATION_NODE:12,
    
	initialize:function(isDebug){
		new ClassUtils().registerFuncSelfLink(this);
		this.isDebug=isDebug;
	},
	/**
	 * 建立跨平台的dom解析器
	 * @param xml xml字符串
	 * @return dom解析器
	 */
	createDomParser:function(xml){
		// code for IE
		if (window.ActiveXObject){
		  var doc=new ActiveXObject("Microsoft.XMLDOM");
		  doc.async="false";
		  doc.loadXML(xml);
		}
		// code for Mozilla, Firefox, Opera, etc.
		else{
		  var parser=new DOMParser();
		  var doc=parser.parseFromString(xml,"text/xml");
		}
		return doc;
	},
	/**
	 * 反向序列化xml到javascript Bean
	 * @param xml xml字符串
	 * @return javascript Bean
	 */
	deserializedBeanFromXML:function (xml){
		var funcHolder=arguments.callee.$;
		var doc=funcHolder.createDomParser(xml);
		// documentElement总表示文档的root
		var objDomTree=doc.documentElement;
		var obj=new Object();
	    for (var i=0; i<objDomTree.childNodes.length; i++) {
	    	//获得节点
	    	var node=objDomTree.childNodes[i];
	    	//取出其中的field元素进行处理
	        if ((node.nodeType==funcHolder.ELEMENT_NODE) && (node.tagName == 'field')) {
	        	var nodeText=funcHolder.getNodeText(node);
	        	if (funcHolder.isDebug){
		            alert(node.getAttribute('name')+' type:'+node.getAttribute('type')+' text:'+nodeText);
	        	}
	            var objFieldValue=null;
	            //如果为列表
	            if (node.getAttribute('type')=='java.util.List'){
	            	if (objFieldValue && typeof(objFieldValue)=='Array'){
		            	if (nodeText.length>0){
							objFieldValue[objFieldValue.length]=nodeText;
						}
					}
					else{
						objFieldValue=new Array();
					}
				}
				else if (node.getAttribute('type')=='long' 
					|| node.getAttribute('type')=='java.lang.Long'
					|| node.getAttribute('type')=='int'
					|| node.getAttribute('type')=='java.lang.Integer'){
					
					objFieldValue=parseInt(nodeText);
				}
				else if (node.getAttribute('type')=='double' 
					|| node.getAttribute('type')=='float'
					|| node.getAttribute('type')=='java.lang.Double'
					|| node.getAttribute('type')=='java.lang.Float'){
					
					objFieldValue=parseFloat(nodeText);
				}
				else if (node.getAttribute('type')=='java.lang.String'){
					objFieldValue=nodeText;
				}
				else{
					objFieldValue=nodeText;
				}
				//赋值给对象
				obj[node.getAttribute('name')]=objFieldValue;
				if (funcHolder.isDebug){
					alert(eval('obj.'+node.getAttribute('name')));
				}
	        }
	        else if (node.nodeType == funcHolder.TEXT_NODE){
	        	if (funcHolder.isDebug){
			        //alert('TEXT_NODE');
	        	}
		        
	        }
	        else if (node.nodeType == funcHolder.CDATA_SECTION_NODE){
	        	if (funcHolder.isDebug){
		        	//alert('CDATA_SECTION_NODE');
	        	}
	        }
	    }
	    return obj;
	},
	/**
	 * 获得dom节点的text
	 */
	getNodeText:function (node) {
		var funcHolder=arguments.callee.$;
	    // is this a text or CDATA node?
	    if (node.nodeType == funcHolder.TEXT_NODE || node.nodeType == funcHolder.CDATA_SECTION_NODE) {
	        return node.data;
	    }
	    var i;
	    var returnValue = [];
	    for (i = 0; i < node.childNodes.length; i++) {
	    	//采用递归算法
	        returnValue.push(funcHolder.getNodeText(node.childNodes[i]));
	    }
	    return returnValue.join('');
	}
}

//委托者类
var Dispatcher=Class.create();
Dispatcher.prototype={
	name:'Dispatcher',
	//对class中的每个function都赋值一个值为this的$属性
	initialize:function(){
		new ClassUtils().registerFuncSelfLink(this);
	},
	/**
	 * 委托调用
	 * @param caller 调用者,func的拥有者
	 * @param func 如果是function对象,则使用Dispatcher对象自己的name作为参数;否则直接调用func
	 */
	dispatch:function(caller,func){
		if (func instanceof Function){
			var funcArguments=new Array();
			funcArguments[0]=arguments.callee.$.name;
			func.apply(caller,funcArguments);
		}
		else{
			eval(func);
		}
	}
}
//祈祷者类
var Invoker=Class.create();
Invoker.prototype={
	name:'Invoker',
	initialize:function(){
	},
	invoke:function(showMsg){
		alert(showMsg+"——this.name="+this.name);
	}
}