⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classloader.js

📁 JSVM核心类库,收集了JAVA进行JSVM开发必用技术进行归纳,在实际项目应用中直接引用相关类库即可现实JSVM相关功能!
💻 JS
字号:
// Description:	js.lang.ClassLoader 类加载器,实现客户端的高速缓存
// Author:	Changhua.Wan
// Version:	2004.03.06.01

_package("js.lang");

_import("js.lang.Object");
_import("js.io.UserData");
_import("js.net.Encoder");

function js.lang.ClassLoader() {

	var cache = new function() {

		// 在内存中创建2.1级Cache
		var _memoryCache = new function() {
			var _dict = new ActiveXObject("Scripting.Dictionary");
			this.get = function(_name) {
				if (!_dict.Exists(_name))
					return null;
				else
					return _dict.Item(_name);
			};
			this.put = function(_name, _value) {
				if (_dict.Exists(_name))
					_dict.Item(_name) = _value;
				else
					_dict.Add(_name, _value);
			};
			this.remove = function(_name) {
				if (_dict.Exists(_name)) _dict.Remove(_name);
			};
		};
		// 在UserData中创建2.2级Cache
		var _UserData = js.io.UserData; // 定义 js.io.UserData 类的引用
		this.lastModified = null;
		// UserData Cache 列表
		var _dict = new ActiveXObject("Scripting.Dictionary");
		this.getDataContext = function(_name) {
			var _name = String(_name);
			var userdata = null;
			if (_dict.Exists(_name)) {
				var userdata = _dict.Item(_name);
			} else {
				var userdata = _UserData.getInstance(_name);
				if (userdata == null) {
					_throw(0x0511, "JSVM/js.lang.ClassLoader.getDataContext(string): 执行异常{不能获得'"
							+ _name
							+ "' DataContext接口}"
						);
				}
				_dict.Add(_name, userdata);
			}
			if (userdata != null) userdata.open();
			return userdata;
		};
		this.removeDataContext = function(_name) {
			_memoryCache.remove(_name);
			if (_dict.Exists(_name)) _dict.Remove(_name);
		};
		this.getClassCode = function(_classname) {
			var datacontext_name = "JSVM_ClassCache__" + _classname;
			var code=_memoryCache.get(datacontext_name);
			if (code != null)return code;
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.load();
			var lastmdate = _dtct.getStringValue("last-modified");
			if (this.lastModified == null || lastmdate == null || this.lastModified > lastmdate) return null;
			code = _dtct.getStringValue("code");
			_dtct.close();
			_memoryCache.put(datacontext_name, code);
			return code;
		};
		this.putClassCode = function(_classname, _code, _over) {
			var datacontext_name = "JSVM_ClassCache__" + _classname;
			if (_over == false && _memoryCache.get(datacontext_name) != null) return;
			_memoryCache.put(datacontext_name, _code);
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.setStringValue("name", _classname);
			_dtct.setStringValue("code", _code);
			_dtct.setStringValue("last-modified", this.lastModified);
			_dtct.save();
			_dtct.close();
		};
		this.getPackageInfo = function(_packagename) {
			var datacontext_name = "JSVM_PackageCache__" + _packagename;
			var info = _memoryCache.get(datacontext_name);
			if (info != null) return info;
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.load();
			var lastmdate = _dtct.getStringValue("last-modified");
			if (this.lastModified == null || lastmdate == null || this.lastModified > lastmdate) return null;
			info = _dtct.getStringValue("class-list");
			_memoryCache.put(datacontext_name, info);
			_dtct.close();
			return info;
		};
		this.putPackageInfo = function(_packagename, _info) {
			var datacontext_name = "JSVM_PackageCache__" + _packagename;
			_memoryCache.put(datacontext_name, _info);
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.setStringValue("name", _packagename);
			_dtct.setStringValue("class-list", _info);
			_dtct.setStringValue("last-modified", this.lastModified);
			_dtct.save();
			_dtct.close();
		};
		this.getLibInfo = function(_libname) {
			var datacontext_name = "JSVM_LibCache__Info";
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.load();
			var _ver = _dtct.getStringValue(_libname + "_ver");
			_dtct.close();
			return _ver;
		};
		this.putLibInfo = function(_libname, _ver) {
			var datacontext_name = "JSVM_LibCache__Info";
			var _dtct = this.getDataContext(datacontext_name);
			_dtct.load();
			_dtct.setStringValue(_libname + "_ver", _ver);
			_dtct.save();
			_dtct.close();
		};
	};

	// 初始化方法
	this.initialize = function() {
		var configurl = $js_classpath + "class-inf.xml";
		var xmldom = new ActiveXObject("Microsoft.XMLDOM");
		xmldom.async = false;
		if (xmldom.load(configurl)) {
			var root = xmldom.documentElement;
			var ldnode = root.selectSingleNode("//last-modified");
			if (ldnode != null) cache.lastModified = ldnode.getAttribute("date");
			var alnodes = root.selectNodes("//auto-load/class[@name]");
			for (var i = 0; i < alnodes.length; i++) {
				var cls = alnodes.item(i).getAttribute("name");
				if (cls != null && /^(\w)+(\.(\w)+)*$/.test(cls)) {
					_import(cls);
				} else {
					_throw(0x0512,
						"js.lang.ClassLoader/initialize(): 执行异常{auto-load:["
						+ cls
						+ "]非法}"
					);
				}
			}
		} else {
			_throw(0x0513, "js.lang.ClassLoader/initialize(): 执行异常{class-info配置文件损坏}");
		}
		// -- 加载 lib-inf 配置
		if (xmldom.load($js_libpath + "lib-inf.xml")) {
			var root = xmldom.documentElement;
			var refnodes = root.selectNodes("libRef");
			for (var i = 0; i < refnodes.length; i++) {
				var _node = refnodes.item(i);
				var _name = _node.getAttribute("name");
				var _async = _node.getAttribute("async");
				var _ver = _node.getAttribute("version");
				var _oldVer = cache.getLibInfo(_name);
				if (_oldVer == null || _oldVer < _ver) {
					cache.putLibInfo(_name, _ver);
					this.loadLib(_name, _async);
				}
			}
		}
	};

	var _getPackageName = function(_classname) {
		var _packagename = "-";
		var lidx = _classname.lastIndexOf(".");
		if (lidx != -1) {
			_packagename = _classname.substring(0, lidx);
		}
		return _packagename;
	}

	this.loadClass = function(_classname) {
		if ($js_runMode == "debug")
			return this.loadClassFormServer(_classname);
		var code = cache.getClassCode(_classname);
		if (code == null) {
			code = this.loadClassFormServer(_classname);
			if (code != null) cache.putClassCode(_classname, code);
		}
		return code;
	};
	this.loadPackage = function(_packagename) {
		if ($js_runMode == "debug")
			return this.loadPackageFormServer(_packagename);
		var classlist = cache.getPackageInfo(_packagename);
		if (classlist == null) {
			classlist = this.loadPackageFormServer(_packagename);
			if (classlist != null) cache.putPackageInfo(_packagename, classlist.toString());
		}
		return classlist;
	};

	var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

	this.loadClassFormServer = function(_classname) {
		var _classpath = _classname.replace(/\./gi,"/");
		_classpath = $js_classpath + _classpath + ".js";
		xmlHttp.open("GET", _classpath, false);
		xmlHttp.send();
		if (xmlHttp.status == 200 || xmlHttp.status == 0) {
			// 如果编码类型是 ASCII ,且含有中文必须进行编码
			// 如果编码类型是 UNICODE,UTF-8 直接 return(xmlHttp.responseText) 即可
			var _charset = js.net.Encoder.getCharset(xmlHttp.responseBody);
			if (_charset == "ASCII")
				return js.net.Encoder.ascToStr(xmlHttp.responseBody);
			else
				return xmlHttp.responseText;
		} else {
			_throw(0x0514,
				"js.lang.ClassLoader/loadClass():不能加载 "
				+ _classname
				+ " 类资源 {HTTP-STATUS:"
				+ xmlHttp.status
				+ "}"
			);
		}
		return null;
	};

	this.loadPackageFormServer = function(_packagename) {
		var _packagepath = _packagename.replace(/\./gi, "/");
		var _packagepath = $js_classpath + _packagepath + "/package.xml";
		var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
		xmlDom.async = false;
		if (xmlDom.load(_packagepath)) {
			var classlist = new Array();
			var root = xmlDom.documentElement;
			var clsNodes = root.selectNodes("class");
			for (var i = 0; i < clsNodes.length; i++) {
				var clsName = clsNodes.item(i).getAttribute("name");
				classlist[i] = clsName;
			}
			return classlist;
		} else {
			_throw(0x0515,
				"js.lang.ClassLoader/loadPackageFormServer():"
				+ _packagename
				+ " 包时出错{package.xml 配置文件无法加载}"
			);
		}
	};
	this.loadLib = function(_name, _async) {
		var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
		xmlDom.async = (_async == "true" && @_jscript_version >= 5.5)? true : false;
		if (!xmlDom.async) {
		 	if (xmlDom.load($js_libpath+_name)) {
				this.loadClassFromPackageNode(null, xmlDom.documentElement);
			} else {
				_throw(0x0516,
					"js.lang.ClassLoader/loadLib():"
					+ _name
					+ " 类库时解析出错{同步}"
				);
			}
		} else {
			var _self = this;
			var _xmlDom = xmlDom;
			xmlDom.onreadystatechange = function() {
				if (_xmlDom.readyState != 4) return;
				var root = _xmlDom.documentElement;
				if (root != null) {
					_self.loadClassFromPackageNode(null, root);
				} else {
					_throw(0x0517,
						"js.lang.ClassLoader/loadLib():"
						+ _name
						+ " 类库时解析出错{异步}"
					);
				}
			};
			xmlDom.load($js_libpath + _name);
		}
	};
	this.loadClassFromPackageNode = function(_parentname, _node) {
		var _pname = (_parentname==null)? "" : (
			((_parentname == "")? "" : (_parentname + ".")) + _node.getAttribute("name")
		);
		var _cnodes = _node.selectNodes("Class");
		for (var i = 0; i < _cnodes.length; i++) {
			var _cnode = _cnodes.item(i);
			var _classname = (_pname == "") ? "" : (_pname + "." ) + _cnode.getAttribute("name");
			var _code = _cnode.text;
			cache.putClassCode(_classname, _code, false);
		}
		var _pnodes = _node.selectNodes("Package");
		for (var i = 0; i < _pnodes.length; i++) {
			var _pnode = _pnodes.item(i);
			this.loadClassFromPackageNode(_pname, _pnode);
		}
	};
	this.clearCache = function() {
		// TODO
	}
	this.initialize();
}

var _p = js.lang.ClassLoader._extends("js.lang.Object");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -