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

探讨Ajax获取表单值向Servlet传递的设计方案

?现在JavaWeb领域,MVC框架越来越多,比较出名的有StrutsStruts2SpringMVCWebWork等。而Ajax,作为一种与特定的动态Web编程语言(如JavaC#PHP)无关的技术,也已经被引入到了Java MVC框架的各家各户。而这些MVC框架,归根到底,都是对Servlet技术的封装。同时,支持Ajax的JavaScript框架(or类库)也越来越多,出名的如JqueryExtPrototypeDWR等,而它们实现异步传输功能还是离不开JavaScript中的XMLHttpRequest这个对象。好,转入正题吧。

Ajax通过XMLHttpRequest对象实现异步传输,那我们首先要获取这个对象。由于浏览器的差异,为了兼容各种常用的浏览器,先写一个初始化XMLHttpRequest对象的方法,代码如下:

?

?

?

/**  
* Get方式向服务器端异步发送数据  
* @param url 服务器端的路径,数据发送的目的地  
* @param data 发送的数据,格式如: "key1=value1&key2=value2"  
* @param callback 回调函数,  
*/   
function doGet(url, data, callback) {   
    var url = url;   
    if(url.indexOf("?") == -1) {   
        url = url + "?" + data;   
    } else {   
        url = url + "&" + data;   
    }   
    initXmlHttp();   
    xmlHttp.onreadystatechange = callback;    //注册回调函数   
    xmlHttp.open("GET", url, true);        //设置连接信息   
    xmlHttp.send(null);   
}    
  
/**  
* Post方式向服务器端异步发送数据  
* @param url 服务器端的路径,数据发送的目的地  
* @param data 发送的数据,格式如: "key1=value1&key2=value2"  
* @param callback 回调函数  
* @return  
*/   
function doPost(url, data, callback) {   
    initXmlHttp();        //初始化   
    xmlHttp.onreadystatechange = callback;    //注册回调函数   
    xmlHttp.open("POST", url, true);   
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");   
    xmlHttp.send(data);   
}    
  
/**  
* 默认回调函数  
* 只在测试时使用,在doGet和doPost函数中的第三个参数callback,可由用户自定义回调函数,  
* 若不设定,则调用默认的回调函数  
*/   
function callback() {   
    //判断对象的状态是否交互完成   
    if(xmlHttp.readyState == 4) {   
        //判断http的交互是否成功   
        if(xmlHttp.status == 200) {   
            //获取服务器返回的纯文本数据   
            var responseText = xmlHttp.responseText;   
            //获取服务器返回的XML格式数据   
            //var responseXml = xmlHttp.responseXML;   
            //Alert从服务器端返回的信息   
            window.alert(responseText);   
        }   
    }   
}   

??

?

对上面的代码,在这里解析一下:XMLHttpRequest对象的请求状态(readyState)有01234,其中,0表示未初始化,1表示open方法成功调用,2表示服务器应答客户端请求,3表示交互中,HTTP头信息已经收到,但响应数据还没有接收,