Ajax之JavaScript实现
Posted Paradise Lost Hair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax之JavaScript实现相关的知识,希望对你有一定的参考价值。
Ajax
Ajax(Asynchronous JavaScript and XML)异步JavaScript和XML
Ajax实际上是下面这几种技术的融合:
•Xhtml和CSS的基于标准的表示技术•DOM进行动态显示和交互•XML和XSLT进行数据交换和处理•XMLHttpRequest进行异步数据检索•javascript将以上技术融合在一起
客户端与服务器,可以在不必刷新整个浏览器的情况下,与服务器进行异步通讯的技术
Ajax作用
每当用户向服务器发送请求,哪怕只是需要更新一点点的局部内容,服务器都会将整个页面进行刷新。
•性能会有所降低(一点内容,刷新整个页面!)•用户的操作页面会中断(整个页面被刷新了)
Ajax就是能够做到局部刷新!
XMLHttpRequest
XMLHttpRequest对象是Ajax中最重要的一个对象。使用Ajax更多的是编写客户端代码,而不是服务端的代码。
XMLHttpRequest 工作原理
传统的web前端与后端的交互中,浏览器直接访问Tomcat的Servlet来获取数据。Servlet通过转发把数据发送给浏览器。
当我们使用AJAX之后,浏览器是先把请求发送到XMLHttpRequest异步对象之中,异步对象对请求进行封装,然后再发送给服务器。服务器并不是以转发的方式响应,而是以流的方式把数据返回给浏览器
XMLHttpRequest异步对象会不停监听服务器状态的变化,得到服务器返回的数据,就写到浏览器上因为不是转发的方式,所以是无刷新就能够获取服务器端的数据。
创建XMLHttpRequest对象
要创建XMLHttpRequest对象是要分两种情况考虑的:
•在IE6以下的版本•在IE6以上的版本以及其他内核的浏览器(Mozilla)等
<script type="text/javascript">
var httpRequest;
if(window.XMLHttpRequest) {
//在IE6以上的版本以及其他内核的浏览器(Mozilla)等
httpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject) {
//在IE6以下的版本
httpRequest = new ActiveXObject();
}
</script>
XMLHttpRequest对象的属性和方法
方法
open()(String method,String url,boolean asynch,String username,String password)
send(content)
setRequestHeader(String header,String value)
getAllResponseHeaders()
getResponseHeader(String header)
abort()
常用的方法就是前三个
open():该方法创建http请求
setRequestHeader(String header,String value) 设置消息头 (使用post方式才会使用到,get方法并不需要调用该方法)
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
send(content):发送请求给服务器
•如果是get方式,并不需要填写参数,或填写null•如果是post方式,把要提交的参数写上去
属性
•onreadystatechange:请求状态改变的事件触发器(readyState变化时会调用此方法),一般用于指定回调函数•readyState:请求状态readyState一改变,回调函数被调用,它有5个状态
0:未初始化 1:open方法成功调用以后 2:服务器已经应答客户端的请求 3:交互中。Http头信息已经接收,响应数据尚未接收。4:完成。数据接收完成
•responseText:服务器返回的文本内容•responseXML:服务器返回的兼容DOM的XML内容•status:服务器返回的状态码•statusText:服务器返回状态码的文本信息
编写第一个Ajax程序
检测用户输入的用户名是否为"xiongxiong",只要不是xiongxiong,就可以使用!
html代码
•创建的div只要用于显示服务器返回的数据•当用户点击按钮的时候,就触发事件。
<input type="text" id="username">
<input type="button" onclick="checkUsername()" value="检测用户名是否合法">
<div id="result">
</div>
javaScript代码
创建流程
•创建XMLHttpRequest对象•创建http请求•把文本框的数据发送给http请求的目标•指定回调函数•编写回调函数•发送http请求•回调函数得到http返回的内容,把内容写在div上
<script type="text/javascript">
var httpRequest;
function checkUsername() {
if(window.XMLHttpRequest) {
//在IE6以上的版本以及其他内核的浏览器(Mozilla)等
httpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject) {
//在IE6以下的版本
httpRequest = new ActiveXObject();
}
//创建http请求
httpRequest.open("POST", "Servlet1", true);
//因为我使用的是post方式,所以需要设置消息头 消息类型无文件上传
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//指定回调函数
httpRequest.onreadystatechange = callback;
//得到文本框的数据
var name = document.getElementById("username").value;
//发送http请求,把要检测的用户名传递进去
httpRequest.send("username=" + name);
}
function callback() {
//判断请求状态码是否是 4数据接收完成
if(httpRequest.readyState==4) {
//再判断状态码是否为200 200是成功的
if(httpRequest.status==200) {
//得到服务端返回的文本数据
var text = httpRequest.responseText;
//把服务端返回的数据写在div上
var div = document.getElementById("result");
div.innerText = text;
}
}
}
</script>
Ajax二级下拉联动案例(xml)
前台分析
当用户选择了某个省份之后,就使用AJAX与服务器进行交互,那么在选择城市的时候就出现对应的城市信息。
•监听下拉框值变化事件•只要下拉框值变化了,就与服务器进行交互•得到服务器返回的值,解析XML•使用DOM把数据写到城市下拉框列表中
后台分析
•得到前台带过来的数据•判断该数据是什么,返回对应的的XML文件
Jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>多级联动</title>
<script type="text/javascript" src="js/ajax.js"></script>
</head>
<body>
<%--############前台页面###################--%>
<select name="province" id="provinceId">
<option value="-1">请选择省份</option>
<option>广东</option>
<option>湖南</option>
</select>
<select name="city" id="cityId">
<option>请选择城市</option>
</select>
<%--############AJAX###################--%>
<script type="text/javascript">
//定义函数
document.getElementById("provinceId").onchange = function () {
/**********定位到下拉框,获取下拉框的值***************/
// 获取选中的下拉框索引值
var index = this.selectedIndex;
// 得到下拉框的值
var province = this.options[index].innerHTML;
//下拉框的值要是“请选择”,那么我们是不会访问服务器的
if ("请选择省份" != province) {
/********由于每次都会自动添加,因此每次在调用的时候清除***********/
var citySelect = document.getElementById("cityId");
//每次都将option变成长度只有1的
citySelect.options.length = 1;
/*************ajax代码*********************/
//创建AJAX对象
var ajax = createAJAX();
//准备发送请求
var method = "post";
var url = "${pageContext.request.contextPath}/ProvinceServlet?time=" + new Date().getTime();
ajax.open(method, url);
//由于是POST方式,因此要设置头
ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
ajax.send("province=" + province);
/************ajax回调函数*********************/
ajax.onreadystatechange = function () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
//得到服务器端带过来的XML
var XMLDocument = ajax.responseXML;
/**********解析XML文档,使用DOM写到下拉框中****************/
var cities = XMLDocument.getElementsByTagName("city");
//得到每一个cities节点的值,动态生成下拉框,添加到下拉框中
for (var i = 0; i < cities.length; i++) {
var value = cities[i].firstChild.nodeValue;
//动态生成下拉框
var optionElement = document.createElement("option");
optionElement.innerHTML = value;
//添加到下拉框中
citySelect.appendChild(optionElement);
}
}
}
};
}
};
</script>
</body>
</html>
Servlet
import java.io.IOException;
import java.io.PrintWriter;
@javax.servlet.annotation.WebServlet(name = "ProvinceServlet",urlPatterns = "/ProvinceServlet")
public class ProvinceServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//设置中文编码
request.setCharacterEncoding("UTF-8");
String province = request.getParameter("province");
//这里是返回的是XML,因此指定XML数据!
response.setContentType("text/xml;charset=UTF-8");
//输出流
PrintWriter printWriter = response.getWriter();
/****************返回XML文件给前台**************/
printWriter.write("<?xml version='1.0' encoding='UTF-8'?>");
printWriter.write("<root>");
if("广东".equals(province)){
printWriter.write("<city>广州</city>");
printWriter.write("<city>深圳</city>");
printWriter.write("<city>中山</city>");
}else if("湖南".equals(province)){
printWriter.write("<city>长沙</city>");
printWriter.write("<city>株洲</city>");
printWriter.write("<city>湘潭</city>");
printWriter.write("<city>岳阳</city>");
}
printWriter.write("</root>");
System.out.println("1111");
/*******事后操作 关闭输出流*******/
printWriter.flush();
printWriter.close();
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request, response);
}
}
XML方式总结
•监听下拉框的变化,如果变化了,那么就使用异步操作去访问服务器,得到对应的数据返回给异步对象•异步对象解析服务器带过来的数据,使用DOM编程把数据动态添加到页面上
1.在Servlet上记得要指定返回的是XML的数据!2.在前台解析XML文档的时候,不能直接使用innerHtml来得到节点的值,只能通过firstChild.nodeValue的方式获取。3.由于每次append到下拉框都会连续append,因此在响应事件的时候,把下拉框清零4.把下拉框options的长度赋值为1,那么就是清零的操作了。
总结
References
以上是关于Ajax之JavaScript实现的主要内容,如果未能解决你的问题,请参考以下文章