Java Web学习笔记(六)XMLHttpRequest

来源:互联网 发布:网络市场环境分析 编辑:程序博客网 时间:2024/05/21 04:16

最通用的定义为:XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。(这个功能正是AJAX的一大特点之一:))
来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。
这里说些题外话,其实这个东西很早就出现了,只是以前浏览器的支持不够,只有IE中才支持,所以大多数的WEB程序员都没有怎么用他,但是现在情况发生了很大地改变,Mozilla和Safari把它采用为事实上的标准,主流的浏览器都开始支持XMLHTTPRequest对象了。但是这里需要重点说明的是XMLHTTPRequest目前还不是一个W3C的标准,所以在不同的浏览器上表现也稍有些区别。

发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态,XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能。这类似于回调函数的做法。
onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如:
ajaxObj=createAjaxObject();
var url="/MyTodoes/FetchText?id="+id;
ajaxObj.open("Get",url,true);
ajaxObj.onreadyStateChange=changeTabCallBack;
ajaxObj.send(null);
onreadyStateChange事件是在readyState属性发生改变时触发的,readyState的值表示了当前请求的状态,在事件处理程序中可以根据这个值来进行不同的处理。
readyState有五种可取值0:尚未初始化,1:正在加载,2:加载完毕,3:正在处理;4:处理完毕。
属性:readyState
返回XMLHTTP请求的当前状态
语法:lValue = oXMLHttpRequest.readyState;
备注:变量,此属性只读,状态用长度为4的整型表示.定义如下:
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化) 对象已建立,尚未调用send方法
2 (发送数据) send方法已调用,但是当前的状态及http头未知
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据

一旦readyState属性的值变成了4,就可以从服务器返回的响应数据进行访问了。
通常在事件中判断readyState的值是在请求完毕时才做处理,如:
function changeTabCallBack(){
  if(ajaxObj.readyState==4){
     // 下一步验证
  }
}
Status存储了服务器端返回的Http请求响应代码,它表示请求的处理结果,常见响应代码的含义如右。
在Ajax开发中,最常用就是200这个响应码,代码如下:
function changeTabCallBack(){
  if(ajaxObj.readyState==4){
    if(ajaxObj.status==200){
       // 服务端返回了正确数据,开始响应处理
    }
  }
}
Http状态码 含义
200 请求成功
202 请求被接受但处理未完成
400 错误请求
404 请求资源未找到
500 内部服务器错误

<script>    var xmlhttp;        function createxmlhttp() {    if(window.ActiveXObject) {    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");    //xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");    //alert("IE");    }else if(window.XMLHttpRequest) {    xmlhttp = new XMLHttpRequest();    //alert("firefox");    }    }        function checkRp() {    var uname = document.myform.name.value;    var unameUTF = encodeURI(uname);    //var unameUTF = encodeURI(encodeURI(uname));    var url="/JavaWebTest/servlet/CheckRPServlet?name=" + unameUTF;    createxmlhttp();    // 属性:onreadystatechange    // onreadystatechange:指定当readyState属性改变时的事件处理句柄    // 语法:oXMLHttpRequest.onreadystatechange = funcMyHandler;    // 如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数,    // 当数据接收完毕后(readystate == 4)此页面上的一个按钮将被激活    // 备注:此属性只写,为W3C文档对象模型的扩展.    xmlhttp.onreadystatechange = back;    // 方法:open    // 创建一个新的http请求,并指定此请求的方法、URL以及验证信息    // 语法:oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);    // 参数    // bstrMethod    // http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。    // bstrUrl    // 请求的URL地址,可以为绝对地址也可以为相对地址。    // varAsync[可选]    // 布尔型,指定此请求是否为异步方式,默认为true。如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。    // bstrUser[可选]    // 如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。    // bstrPassword[可选]    // 验证信息中的密码部分,如果用户名为空,则此值将被忽略。    // 备注:调用此方法后,可以调用send方法向服务器发送数据。    xmlhttp.open("GET", url, true);    // 方法:send    // 发送请求到http服务器并接收回应    // 语法:oXMLHttpRequest.send(varBody);    // 参数:varBody (欲通过此请求发送的数据。)    // 备注:此方法的同步或异步方式取决于open方法中的bAsync参数,如果bAsync == False,此方法将会等待请求完成或者超时时才会返回,如果bAsync == True,此方法将立即返回。    // This method takes one optional parameter, which is the requestBody to use. The acceptable VARIANT input types are BSTR, SAFEARRAY of UI1 (unsigned bytes), IDispatch to an XML Document Object Model (DOM) object, and IStream *. You can use only chunked encoding (for sending) when sending IStream * input types. The component automatically sets the Content-Length header for all but IStream * input types.    // 如果发送的数据为BSTR,则回应被编码为utf-8, 必须在适当位置设置一个包含charset的文档类型头。    // If the input type is a SAFEARRAY of UI1, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.    // 如果发送的数据为XML DOM object,则回应将被编码为在xml文档中声明的编码,如果在xml文档中没有声明编码,则使用默认的UTF-8。    // If the input type is an IStream *, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.    xmlhttp.send(null);    }        function back() {    if(xmlhttp.readyState==4) {    if(xmlhttp.status==200) {    if(xmlhttp.responseText=="failure") {    alert("用户名已经存在!");    }else {    alert("可以使用此用户名!");    }    }    }    }</script>

 CheckRPServlet.java

PrintWriter out = response.getWriter();HttpSession session = request.getSession();String name = java.net.URLDecoder.decode(request.getParameter("name"),"utf-8");//System.out.println("name:" + name);User user = new User();user.setName(name);UserBiz userBiz = new UserBizImpl();if(userBiz.isExixst(user)) {out.print("failure");}else {out.print("sucess");}out.flush();out.close();

 AJAX搜索引擎输入框动态显示结果实例:
javascript完整代码:

<script>    var xmlhttp;    var input;        function createxmlhttp() {    if(window.ActiveXObject) {    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");    }else if(window.XMLHttpRequest) {    xmlhttp = new XMLHttpRequest();    }    }        function show() {    input = document.myform.input.value;    createxmlhttp();    var url="/JavaWebTest/servlet/AjaxServlet?aname=" + input;    xmlhttp.onreadystatechange = back;    xmlhttp.open("GET", url, true);    xmlhttp.send(null);    }        function back() {    if(xmlhttp.readyState==4) {    if(xmlhttp.status==200) {    var rt = xmlhttp.responseText;    //alert(rt);    var obj = rt.split("-");    var items = "";    var si = document.getElementById("info");    for(var i=0;i<obj.length-1;i++) {    items += "<div onmouseover=\"this.style.backgroundColor='#eee'\" onmouseout=\"this.style.backgroundColor='#fff'\" onclick=\"javascript:document.myform.input.value=this.innerHTML;document.getElementById('info').style.display='none'\">" + obj[i] + "</div>";    }    si.innerHTML =items;    }    }        var i = document.getElementById("info");    if(input=="") {    i.style.display="none";    }else {    i.style.display="block";    }    }</script>

AjaxServlet核心代码:

response.setContentType("text/html");PrintWriter out = response.getWriter();String name = request.getParameter("aname");AjaxTestBiz ajaxT = new AjaxTestBizImpl();String s = ajaxT.getN(name);out.print(s);//System.out.println("name:" + name + "   s:" + s);out.flush();out.close();


 

原创粉丝点击