用ajax有段時間了總結一下:
用xmlhttp去server取數據的時候,有如下二種方法
1:在server端通過response向流里寫數據

private void sendMsg2Stream(HttpServletResponse response,String message)
{

try
{
response.setHeader("charset", "gb2312");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setContentType("text/xml");
response.getOutputStream().write(StringUtil.getUTF8Bytes(message));

}catch(Exception e)
{
e.printStackTrace();
}
}
StringUtil.getUTF8Bytes是自寫的一個類,因為xmlhttp中傳數據的時候默認是UTF-8傳的。
這樣可以防止亂碼出現。
在客戶端JS中:

function finishedAction(originalRequest)
{
var res = originalRequest.responseText;//當然也可以返回xml
$('dbrglqx').innerHTML = res;
}

在server中假如返回一些字符串這樣很方便,但如何想動態組合成一些list的option時,可能不太方便了,
這時可以通過JS的eval方法直接取一個頁面內容。具體如下:
在server中返回的是一個頁面,如在spring MVC中可能如下:
return new ModelAndView("redirect:data.html");
在返回前主可以做一些別的手術,典型的如request.setAttribute(name,value);
然后在JSP中進行解剖,如JSP中(這種情況下,把它當時在js文件就OK了):
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
%>

var targetOrgObj=document.myForm.targetOrgId;
var optionsCount=targetOrgObj.options.length;

for (var i=optionsCount-1; i>0; i--)
{
targetOrgObj.options[i]=null;
}
<c:forEach var="varValue" items="${values}">
var oOption=document.createElement("option");

oOption.text="<c:out value="$
{varValue.orgName}" />";

oOption.value="<c:out value="$
{varValue.orgId}"/>";
<c:if test="${id==6}">
<c:if test="${varValue.departmentCode == currentMeterRd}">
oOption.selected=true;



myForm的定義要弄清楚,它應該在你所(發送)請求的頁面的document里的對象
JS中(沒什么好想的)

function showResponse(originalRequest)
{
eval(originalRequest.responseText);
}

其它:
以上都是通過xmlhttp來用AJAX的,這樣可以通過參數直接控制同步還是異步。
var dbgl = new Ajax.Request(
uri,

{
method: 'get',
parameters: 'method=getYearFhqx&userId='+userId+'&timeStamp='+new Date().getTime(),
asynchronous: true,
onComplete: showResponse
});

最近用DWR用感覺不錯,挺好的!它的util中還提供了不少的有用 & 常用的方法。不過一直不知道DWR中如何同步傳輸,今天找到了:
在DWR的engine.js文件,有setAsync方法,就是設置調用是否是同步的,還是異步的。
js 代碼
DWREngine.setAsync(false);

DWREngine.setAsync(true);