用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);