日期:2014-05-16  浏览次数:20735 次

使用Ajax与后台Servlet同步通信
function createXmlHttpRequest(){
	var oXmlHttp;
	if(window.XMLHttpRequest){
		//非IE浏览器
		oXmlHttp = new XMLHttpRequest();
		if(oXmlHttp.overrideMimeType){
			//针对于FireFox浏览器,传参数出现的问题,设置MimeType
			oXmlHttp.overrideMimeType('text/xml');
		}
		
		return oXmlHttp;
	}
	else if(window.ActiveXObject){
		var aVersions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0",
		"MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
		
		for(var i in aVersions){
			try{
				oXmlHttp = new ActiveXObject(aVersions[i]);
				return oXmlHttp;
			}
			catch(oError){
			}
		}
	}
	return null;
}

/*
 * Function:向服务器发出同步请求
 * @param:url 服务器地址(包括用post方法提交的参数)
 * @param:param 向服务器提交的内容
 * 当header值为null时,设置了application/x-www-form-urlencoded后,
 * 可以通过Form进行Post提交,在后台用getParameter方法接收参数
 * 当header值不为null时,采用字符流传递参数,使用getReader方法获得参数,
 * 此方式扩展后可以用来文件上传,使用getInputStream方法获得文件流
 */
function SendHttpSync(url,param,header){

	var strRtn="";

	if (navigator.onLine == false){
		return "Off Line!"
	}
	
	var xmlhttp = createXmlHttpRequest();

	//同步调用,open方法的第三个参数为false
	xmlhttp.open("post", url, false);

	if(header == null){
		// 设置了application/x-www-form-urlencoded后,可以通过form进行post提交,
		// 在后台使用getParameter方法获得参数,否则需要使用getReader方法获得参数
		// 可以扩展后进行文件上传,使用getInputStream方法获得文件流
		xmlhttp.setRequestHeader("Content-Type",
		                         "application/x-www-form-urlencoded");
	}
	
	try{
		//向服务器发送数据
		xmlhttp.send(param);
	}
	catch (exception){
		alert(xmlhttp.parseError.reason);
	}

	try{
		//从服务器端接收反馈回来的数据,用responseText方法,
		//数据格式必须是字符串,在服务器端setContentType为text/html
		//从服务器端接收反馈回来的数据,用responseXML 方法,
		//数据格式必须是xml,  在服务器端setContentType为text/xml
		var strRtn = xmlhttp.responseText;
	}
	catch (exception){
		if (exception.description == '系统错误: -1072896748。'){
			alert(xmlhttp.parseError.reason);
			strRtn = "";
		}
	}

	return strRtn;
}

function SendSyncByJson(){
	var param = "{\"hreflist\":[{\"maxpage\":7,\"pageid\":1}]}";
	var myData = JSON.parse(param);
	
	//另一种解析JSON的方法
	//var myData = eval("("+param+")");
	
	var url = "http://" + location.host + "/ajaxapp/initAction.do?pageid=1";
	
	//同步调用
	var strRtn = SendHttpSync(url,JSON.stringify(myData),"");
	
	if(strRtn == ""){
		return;
	}
	alert(strRtn);
}

?在后台Servlet中:

response.setContentType("text/html;charset=UTF-8");

// strKey为URL地址?后的参数
String strKey = new String(request.getQueryString());

//获得URL传递的参数,
//如果在客户端设置了contentType为application/x-www-form-urlencoded
//那么send方法的参数param以键值形式传递的参数也可以用这种方法获得
String strParam = (String) request.getParameter("pageid");

// 计算前台Send方法传来的param参数(可以是XML串)存入strXml中
BufferedReader in = request.getReader();
String line = null;
strXml = "";
while ((line = in.readLine()) != null) {
	strXml = strXml + line;
}

??最后使用write方法来返回字符串给客户端

response.getWriter().write(json.toString());

?以上方法实现跨浏览器,IE和FireFox已经测试通过