一、Ajax简介
AJAX全称为“Asynchronous JavaScript and XML”(异步javascript和XML),是指一种创建交互式网页应用的网页开发技术。
传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。
二、Ajax使用场景
AJAX【适合】不用来传递大量数据,而只用来【传递少量数据】,在用户的【体验】上,【更加人性化】
AJAX是一个和服务器无关的技术,即服务器可使用:JavaEE,.NET,PHP,。。。这些技术都可
AJAX只管向服务器发送请求,同时只管接收服务器的HTML或XML或JSON载体响应
服务端不能使用转发或重定向到web页面,因为这样会起浏览器全面刷新
即只能以流的方式响应给浏览器。
1、数据验证:在文本框等输入表单中给予输入提示,或者自动完成,可以有效的改善用户体验,尤其是那些自动完成的数据可能来自于服务器端的场合,Ajax是很好的选择。
2、按需取数据:
我们以前的对级联菜单的处理多数是这样的:
为了避免每次对菜单的操作引起的重载页面,不采用每次调用后台的方式,而是一次性将级联菜单的所有数据全部读取出来并写入数组,然后根据用户的操作用 JavaScript来控制它的子集项目的呈现,这样虽然解决了操作响应速度、不重载页面以及避免向服务器频繁发送请求的问题,但是如果用户不对菜单进行 操作或只对菜单中的一部分进行操作的话,那读取的数据中的一部分就会成为冗余数据而浪费用户的资源,特别是在菜单结构复杂、数据量大的情况下(比如菜单有 很多级、每一级菜又有上百个项目),这种弊端就更为突出。
如果在此案中应用Ajax后,结果就会有所改观:
在初始化页面时我们只读出它的第一级的所有数据并显示,在用户操作一级菜单其中一项时,会通过Ajax向后台请求当前一级项目所属的二级子菜单的所有数据,如 果再继续请求已经呈现的二级菜单中的一项时,再向后面请求所操作二级菜单项对应的所有三级菜单的所有数据,以此类推……这样,用什么就取什么、用多少就取 多少,就不会有数据的冗余和浪费,减少了数据下载总量,而且更新页面时不用重载全部内容,只更新需要更新的那部分即可,相对于后台处理并重载的方式缩短了 用户等待时间,也把对资源的浪费降到最低。
三、Ajax编码
3.1 编码步骤
1、创建AJAX异步对象,例如:createAJAX()
2、准备发送异步请求,例如:ajax.open(method,url)
3、如果是POST请求的话,一定要设置AJAX请求头,例如:ajax.setRequestHeader()
如果是GET请求的话,无需设置设置AJAX请求头
4、真正发送请求体中的数据到服务器,例如:ajax.send()
5、AJAX不断的监听服务端响应的状态变化,例如:ajax.onreadystatechange,后面写一个无名处理函数
6、在无名处理函数中,获取AJAX的数据后,按照DOM规则,用JS语言来操作Web页面
3.2 ajax状态码
- 0:ajax异步对象创建好了,但暂时没有准备发送请求
- 1:ajax已经调用了open方法,但暂时没有真正发送请求
- 2:ajax已调用了seng()方法,但暂时没有到达服务器
- 3:请求已经到达服务器,正在处理中,服务器正在将响应返回的过程中
- 4:ajax异步对象已经完全接收到了服务端的响应信息,但这个时候的响应状态码不一定是正确的,可能是404/500或者200等
- 0-4都是ajax的状态码,每个浏览器的0-3这4种状态显示不一样,但是4这个状态码每个浏览器都有,所以只需要知道4就可以了。
- 一定要状态触发之后才可以出发function(){}函数,如果状态保持4-4-4不变,就不会触发function函数。
1、Ajax应用场景:
Asynchronous JavaScript and XML(异步的 javascript 和 XML)
(1)搜索框
(2)用户注册时校验用户名是否被注册
(3)分页
2、Ajax优缺点:
(1)优点:①异步交互,增强用户体验
②服务器部分响应,减轻服务器压力,提高性能
(2)缺点:① 不能应用在全部场景
②增多了对服务器的访问次数,给服务器带来压力
3、一次完整的HTTP请求,一般有七个步骤:
①建立TCP连接
②Web浏览器向Web服务器发送请求命令
③Web浏览器发送请求头信息
④Web服务器响应
⑤Web服务器发送响应头信息
⑥Web服务器向浏览器发送数据
⑦Web服务器关闭TCP连接
4、什么叫Document对象?
每个载入浏览器的HTML文档都会成为Document对象,Document对象使我们可以从脚本中对HTML页面的所有元素进行访问。
5、Ajax发送异步请求步骤:
(1)得到XMLHttpRequest
①大多数浏览器支持:var request = new XMLHttpRequest();
②IE 6.0:var request = new ActiveXObject(“Msxml2.XMLHTTP”);
③IE 5.5以及更早版本:var request = new ActiveXObject(“Microsoft.XMLHTTP”);
(2)打开与服务器的连接
XMLHttpRequest.open(method,url,async):
三个参数:
①请求方式:GET、POST
②请求URL:指定服务器的资源
③请求是否为异步:true发送异步请求,false发送同步请求
request.open(“GET”, “/Learn201705/Servlet1”, “true”);
(3)发送请求:
XMLHttpRequest.send(string):
参数:
请求体内容,
①当为GET请求时,其实是没有请求体的,所有参数都拼接在url当中,但必须给出request.send(null),如果不给null可能会造成火狐浏览器无法发送。
②当为POST请求时,在open和send之间加入以下句子:
request.open(“POST”, “/Learn201705/Servlet1”, “true”);
request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
request.send(“name=remoa&sex=male”);//发送请求时指定请求体
(4)给异步对象的onreadystatechange事件注册监听器:
①XMLHttpRequest对象有一个onreadystatechange事件,它会在XMLHttpRequest对象的状态readyState属性的值发生变化时被调用。其五种状态分别是:
0:初始化未完成状态,只是创建了XMLHttpRequest对象,还未调用open()方法。
1:请求已开始,open()方法已调用,但还没有调用send()方法。
2:请求发送完成状态,send()方法已调用,也就是接收到头信息了。
3:开始读取服务器响应,也就是接收到响应主体了,但不表示响应结束了。
4:读取服务器响应结束,响应完成。
onreadystatechange事件会在readyState属性状态为1、2、3、4时引发。
②得到XMLHttpRequest对象的状态:
var state = request.readyState;//可能是0、1、2、3、4
我们一般对状态为200且readyState属性值为4时进行处理,即
request.onreadystatechange = function(){
if(request.readyState == 4 && request.status == 200){
request.responseText //开始做一些事情
}
};
③得到服务器响应的状态码:
var status = request.status;//以数字形式返回HTTP状态码,例如404、500、302
var status = request.statusText;//以文本形式返回HTTP状态码
④得到服务器响应的内容
var content = request.responseText; //获得字符串形式的响应数据
var content = request.responseXML;//获得XML形式的响应数据
⑤getAllResponseHeader():获取所有的响应报头
⑥getResponseHeader():查询响应中的某个字段的值
6、响应内容为xml数据:
①服务器端:
设置响应内容类型:Content-Type,值为text/xml;charset=utf-8
response.setContentType("text/xml;charset=utf-8");
②客户端:
var doc = request.responseXML;//得到的是document对象
7、测试代码:
- <span style="font-family:Times New Roman;font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Get请求</title>
- <script type="text/javascript">
- //创建异步对象
- function createXMLHttpRequest(){
- try{
- return new XMLHttpRequest();
- }catch(e){
- try{
- //IE6.0
- return new ActiveXObject("Msxml2.XMLHTTP");
- }catch(e){
- try{
- //IE5.5及更早版本
- return new ActiveObject("Microsoft.XMLHTTP");
- }catch(e){
- throw e;
- }
- }
- }
- };
- //在文档加载完毕后马上执行
- window.onload = function(){
- //获取按钮
- var btn = document.getElementById("btn");
- //给按钮的点击事件注册监听
- btn.onclick = function(){
- //使用ajax的四步操作
- //1、得到异步对象
- var request = createXMLHttpRequest();
- //2、打开与服务器的连接
- request.open("GET", "/Learn201705/LoginServlet", true);
- //3、发送请求
- request.send(null);//不给null值FireFox可能无法发送
- //4、给异步对象的onreadystatechange事件注册监听器
- request.onreadystatechange = function(){
- //双重判断,request的状态为4(服务器响应结束),以及服务器的状态码为200(响应成功)
- if(request.status = 200 && request.readyState == 4){
- //获取服务器的响应结果
- var content = request.responseText;
- var h1Content = document.getElementById("show");
- h1Content.innerHTML = content;
- }
- };
- };
- };
- </script>
- </head>
- <body>
- <button id="btn">点击这里</button>
- <h1 id="show"></h1>
- </body>
- </html></span>
- <span style="font-family:Times New Roman;font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Post请求</title>
- <script type="text/javascript">
- //创建异步对象
- function createXMLHttpRequest(){
- try{
- return new XMLHttpRequest();
- }catch(e){
- try{
- //IE6.0
- return new ActiveXObject("Msxml2.XMLHTTP");
- }catch(e){
- try{
- //IE5.5及更早版本
- return new ActiveObject("Microsoft.XMLHTTP");
- }catch(e){
- throw e;
- }
- }
- }
- };
- //在文档加载完毕后马上执行
- window.onload = function(){
- //获取按钮
- var btn = document.getElementById("btn");
- //给按钮的点击事件注册监听
- btn.onclick = function(){
- //使用ajax的四步操作
- //1、得到异步对象
- var request = createXMLHttpRequest();
- //2、打开与服务器的连接
- request.open("POST", "/Learn201705/LoginServlet", true);
- request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
- //3、发送请求
- request.send("account=小邓&password=123456");//不给null值FireFox可能无法发送
- //4、给异步对象的onreadystatechange事件注册监听器
- request.onreadystatechange = function(){
- //双重判断,request的状态为4(服务器响应结束),以及服务器的状态码为200(响应成功)
- if(request.status = 200 && request.readyState == 4){
- //获取服务器的响应结果
- var content = request.responseText;
- var h1Content = document.getElementById("show");
- h1Content.innerHTML = content;
- }
- };
- };
- };
- </script>
- </head>
- <body>
- <button id="btn">点击这里</button>
- <h1 id="show"></h1>
- </body>
- </html></span>
- <span style="font-family:Times New Roman;font-size:14px;">package com.remoa;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet(value="/LoginServlet")
- public class LoginServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- System.out.println("------------doGet------------");
- response.getWriter().print("Hello Remoa");
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");//将响应编码设置为utf-8
- request.setCharacterEncoding("utf-8");//将请求编码设置为utf-8
- String account = request.getParameter("account");
- String password = request.getParameter("password");
- System.out.println("login");
- response.getWriter().print("用户" + account + "已登录,密码为" + password);
- }
- }
- </span>
①注册页面代码:
- <span style="font-family:Times New Roman;font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script type="text/javascript" src="<%=request.getContextPath() %>/bootstrap/js/jquery.min.js" ></script>
- <script type="text/javascript" src="<%=request.getContextPath() %>/bootstrap/js/bootstrap.min.js" ></script>
- <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/bootstrap/css/bootstrap.min.css" >
- <title>用户注册</title>
- <script type="text/javascript">
- function createXMLHttpRequest(){
- try{
- return new XMLHttpRequest();
- }catch(e){
- try{
- //IE6.0
- return new ActiveXObject("Msxml2.XMLHTTP");
- }catch(e){
- try{
- //IE5.5及更早版本
- return new ActiveObject("Microsoft.XMLHTTP");
- }catch(e){
- throw e;
- }
- }
- }
- };
- window.onload = function(){
- var account = document.getElementById("account");
- account.onblur = function(){
- var request = createXMLHttpRequest();
- request.open("POST", "/Learn201705/ValidateLogin", true);
- request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
- request.send("account=" + account.value);
- request.onreadystatechange = function(){
- if(request.status == 200 && request.readyState == 4){
- //获取服务器的响应,判断是否为1,如果为1,则表示已注册,添加内容,如果为0,则表示该账户名未注册,什么都不做
- var text = request.responseText;
- var spanContent = document.getElementById("accountError");
- if(text == 1){
- spanContent.innerHTML = "<img src='img/false.png' class='wrong' />用户名已注册!";
- }else{
- if(account.value.length == 0 || account.value.substring(0,account.value.length) == 0){
- spanContent.innerHTML = "<img src='img/false.png' class='wrong'/>输入不能为空或纯空格";
- }else{
- spanContent.innerHTML = "<img src='img/true.png' />输入正确";
- }
- }
- }
- };
- };
- };
- function CheckStrength(pwd){
- var leftColor, middleColor, rightColor, colorHtml;
- var m = 0;
- var Modes = 0;
- for(i = 0; i < pwd.length; i++){
- var charType = 0;
- var t = pwd.charCodeAt(i);
- //当字符为数字时,
- if(t >= 48 && t <= 57){
- charType = 1;
- }
- //当字符为小写字母时
- else if(t >= 97 && t <= 122){
- charType = 2;
- }
- //当字符为大写字母时
- else if(t >= 65 && t <= 90){
- charType = 4;
- }
- //为其他字符时
- else{
- charType = 4;
- }
- Modes |= charType;//按位或
- }
- //当密码只由一种元素组成或小于六位,判定为弱
- //当密码由两种元素组成且大于等于六位时,判定为中
- //当密码由三种元素组成且大于等于六位时,判定为强
- //&的用法:两个操作数中的位都为1,结果才为1,否则为0
- for(i = 0; i < 4; i++){
- if(Modes & 1){
- m++;//m为0为无密码,m为1为弱密码,m为2为中密码,m为3为强密码
- }
- Modes>>>=1;//无符号右移,空位用0补齐
- }
- //六位以下,都为弱密码
- if(0 < pwd.length && pwd.length < 6){
- m = 1;
- }
- switch(m){
- //弱密码
- case 1:
- leftColor="pwd pwd_weak";
- middleColor="pwd";
- rightColor="pwd";
- colorHtml="弱";
- break;
- //中密码
- case 2:
- leftColor="pwd pwd_medium";
- middleColor="pwd pwd_medium";
- rightColor="pwd";
- colorHtml="中";
- break;
- //强密码
- case 3:
- leftColor="pwd pwd_strong";
- middleColor="pwd pwd_strong";
- rightColor="pwd pwd_strong";
- colorHtml="强";
- break;
- default:
- leftColor="pwd";
- middleColor="pwd";
- rightColor="pwd";
- colorHtml="无";
- break;
- }
- document.getElementById("pwd_weak").className = leftColor;
- document.getElementById("pwd_medium").className = middleColor;
- document.getElementById("pwd_strong").className = rightColor;
- document.getElementById("pwd_medium").innerHTML = colorHtml;
- };
- $(document).ready(function(){
- $("#account").focus(function(){
- $(this).parents(".form-group").find("#accountError").html("请输入用户名");
- });
- $("#password").focus(function(){
- $(this).parents(".form-group").find("#passwordError").html("请输入6-16位密码");
- });
- $("#password").blur(function(){
- //密码为空或长度小于6
- if($(this).val().length < 6){
- if($(this).val() == ""){
- $(this).parents(".form-group").find("#passwordError").html("<img src='img/false.png' class='wrong' />密码不能为空");
- }else{
- $(this).parents(".form-group").find("#passwordError").html("<img src='img/false.png' class='wrong' />密码长度不能少于六位");
- }
- }
- //密码长度大于16
- else if($(this).val().length > 16){
- $(this).parents(".form-group").find("#passwordError").html("<img src='img/false.png' class='wrong' />密码长度不能大于16位");
- }
- //正确情况
- else{
- $(this).parents(".form-group").find("#passwordError").html("<img src='img/true.png' />输入正确");
- }
- });
- $("#checkpassword").focus(function(){
- $(this).parents(".form-group").find("#checkError").html("请再次输入以确认密码");
- });
- $("#checkpassword").blur(function(){
- var pwd1 = $("#password").val();
- var pwd2 = $(this).val();
- //两次密码输入一致
- if(pwd1 == pwd2){
- $(this).parents(".form-group").find("#checkError").html("<img src='img/true.png' />输入正确");
- }
- //两次密码输入不一致
- else{
- $(this).parents(".form-group").find("#checkError").html("<img src='img/false.png' class='wrong' />两次密码输入不一致");
- }
- });
- //检测出错则不能提交
- $("#submitBtn").click(function(){
- if($(this).parents().find("#account").val()=="" || $(this).parents().find("#password").val()=="" || $(this).parents().find("#checkpassword").val()==""){
- alert("请正确填写");
- return false;
- }
- else if($(this).parents().find("img").hasClass("wrong")){
- alert("请正确填写");
- return false;
- }else{
- return true;
- }
- });
- });
- </script>
- <style>
- .pwd{
- background-color:#F3F3F3;
- border:1px solid #D0D0D0;
- }
- .pwd_font{
- color:#BBBBBB;
- }
- .pwd_weak{
- background-color:red;
- border:1px solid #BB2B2B;
- }
- .pwd_medium{
- background-color:#FFD35E;
- border:1px solid #E9AE10;
- }
- .pwd_strong{
- background-color:#3ABB1C;
- border:1px solid #267A12;
- }
- </style>
- </head>
- <body>
- <div class="container" style="margin-top:2rem">
- <div class="row">
- <div class="col-md-3"></div>
- <div class="col-md-6">
- <form class="form-horizontal" method="post" action="RegisterServlet">
- <div class="form-group">
- <label for="account" class="control-label col-md-3">
- 账户名:
- </label>
- <div class="col-md-5">
- <input type="text" class="form-control" name="account" id="account" placeholder="请输入账户名"/>
- </div>
- <div class="col-md-4">
- <span id="accountError"></span>
- </div>
- </div>
- <div class="form-group">
- <label for="password" class="control-label col-md-3">
- 密码:
- </label>
- <div class="col-md-5">
- <input type="password" class="form-control" name="password" id="password" placeholder="请输入密码" onKeyUp="CheckStrength(this.value)"/>
- <table class="col-md-3 table table-condensed" cellpadding="0" border="0" cellspacing="0" style="margin-bottom:0;margin-top:5px">
- <tr align="center">
- <td id="pwd_weak" class="pwd"> </td>
- <td id="pwd_medium" class="pwd pwd_font">无</td>
- <td id="pwd_strong" class="pwd"> </td>
- </tr>
- </table>
- </div>
- <div class="col-md-4">
- <span id="passwordError"></span>
- </div>
- </div>
- <div class="form-group">
- <label for="checkpassword" class="control-label col-md-3">
- 确认密码:
- </label>
- <div class="col-md-5">
- <input type="password" class="form-control" name="checkpassword" id="checkpassword" placeholder="请再次输入密码" />
- </div>
- <div class="col-md-4">
- <span id="checkError"></span>
- </div>
- </div>
- <input type="submit" id="submitBtn" class="btn btn-primary col-md-offset-3" style="width:10rem" value="注册"/>
- </form>
- </div>
- </div>
- </div>
- </body>
- </html></span>
- <span style="font-family:Times New Roman;font-size:14px;">package com.remoa;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/ValidateLogin")
- public class ValidateLogin extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.getWriter().append("Served at: ").append(request.getContextPath());
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- String account = request.getParameter("account");
- List<String> accountList = new ArrayList<String>();
- accountList.add("remoa1");
- accountList.add("remoa2");
- accountList.add("remoa3");
- accountList.add("remoa4");
- for(Iterator<String> iter = accountList.iterator(); iter.hasNext();){
- if(account.equals(iter.next())){
- response.getWriter().print("1");
- return;
- }
- }
- response.getWriter().println("0");
- }
- }
- </span>
- <span style="font-family:Times New Roman;font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/bootstrap/css/bootstrap.min.css" >
- <title>获取xml数据</title>
- <script type="text/javascript">
- //创建异步对象
- function createXMLHttpRequest(){
- try{
- return new XMLHttpRequest();
- }catch(e){
- try{
- //IE6.0
- return new ActiveXObject("Msxml2.XMLHTTP");
- }catch(e){
- try{
- //IE5.5及更早版本
- return new ActiveObject("Microsoft.XMLHTTP");
- }catch(e){
- throw e;
- }
- }
- }
- };
- //在文档加载完毕后马上执行
- window.onload = function(){
- //获取按钮
- var btn = document.getElementById("btn");
- //给按钮的点击事件注册监听
- btn.onclick = function(){
- //使用ajax的四步操作
- //1、得到异步对象
- var request = createXMLHttpRequest();
- //2、打开与服务器的连接
- request.open("GET", "/Learn201705/XMLServlet", true);
- //3、发送请求
- request.send(null);//不给null值FireFox可能无法发送
- //4、给异步对象的onreadystatechange事件注册监听器
- request.onreadystatechange = function(){
- //双重判断,request的状态为4(服务器响应结束),以及服务器的状态码为200(响应成功)
- if(request.status = 200 && request.readyState == 4){
- //获取服务器的响应结果
- var doc = request.responseXML.documentElement;
- var stuArr = doc.getElementsByTagName("student");
- var number, name, sex, age;
- var text = "<table class='table table-condensed table-bordered table-striped'><tr><th>学号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>";
- for(i = 0; i < stuArr.length; i++){
- text = text + "<tr>";
- number = stuArr[i].getAttribute("number");
- try{
- text = text + "<td>" + number + "</td>";
- }catch(e){
- text = text + "<td>/</td>";
- }
- name = stuArr[i].getElementsByTagName("name");
- try{
- text = text + "<td>" + name[0].firstChild.nodeValue + "</td>";
- }catch(e){
- text = text + "<td>/</td>";
- }
- sex = stuArr[i].getElementsByTagName("sex");
- try{
- text = text + "<td>" + sex[0].firstChild.nodeValue + "</td>";
- }catch(e){
- text = text + "<td>/</td>";
- }
- age = stuArr[i].getElementsByTagName("age");
- try{
- text = text + "<td>" + age[0].firstChild.nodeValue + "</td>";
- }catch(e){
- text = text + "<td>/</td>";
- }
- text = text + "</tr>";
- }
- text = text + "</table>";
- document.getElementById("show").innerHTML = text;
- }
- };
- };
- };
- </script>
- </head>
- <body>
- <div class="container">
- <button id="btn" class="btn btn-primary">点击这里</button>
- <h1 id="show"></h1>
- </div>
- </body>
- </html></span>
- <span style="font-family:Times New Roman;font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/bootstrap/css/bootstrap.min.css" >
- <title>获取xml数据</title>
- <script type="text/javascript">
- //创建异步对象
- function createXMLHttpRequest(){
- try{
- return new XMLHttpRequest();
- }catch(e){
- try{
- //IE6.0
- return new ActiveXObject("Msxml2.XMLHTTP");
- }catch(e){
- try{
- //IE5.5及更早版本
- return new ActiveObject("Microsoft.XMLHTTP");
- }catch(e){
- throw e;
- }
- }
- }
- };
- //在文档加载完毕后马上执行
- window.onload = function(){
- //获取按钮
- var btn = document.getElementById("btn");
- //给按钮的点击事件注册监听
- btn.onclick = function(){
- //使用ajax的四步操作
- //1、得到异步对象
- var request = createXMLHttpRequest();
- //2、打开与服务器的连接
- request.open("GET", "/Learn201705/XMLServlet", true);
- //3、发送请求
- request.send(null);//不给null值FireFox可能无法发送
- //4、给异步对象的onreadystatechange事件注册监听器
- request.onreadystatechange = function(){
- //双重判断,request的状态为4(服务器响应结束),以及服务器的状态码为200(响应成功)
- if(request.status = 200 && request.readyState == 4){
- //获取服务器的响应结果
- var doc = request.responseXML.documentElement;
- var stuArr = doc.getElementsByTagName("student");
- var text = "<table class='table table-condensed table-bordered table-striped'><tr><th>学号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>";
- var name, sex, number, age;
- for(i = 0; i < stuArr.length; i++){
- text = text + "<tr>";
- var arr = stuArr[i];
- number = arr.getAttribute("number");
- if(number == null){
- number = "/";
- }
- try{
- name = arr.getElementsByTagName("name")[0].textContent;
- }catch(e){
- name = "/";
- }
- try{
- sex = arr.getElementsByTagName("sex")[0].textContent;
- }catch(e){
- name = "/";
- }
- try{
- age = arr.getElementsByTagName("age")[0].textContent;
- }catch(e){
- age = "/";
- }
- text = text + "<td>" + number + "</td><td>" + name + "</td><td>" + sex + "</td><td>" + age + "</td></tr>";
- }
- text = text + "</table>";
- document.getElementById("show").innerHTML = text;
- }
- };
- };
- };
- </script>
- </head>
- <body>
- <div class="container">
- <button id="btn" class="btn btn-primary">点击这里</button>
- <h1 id="show"></h1>
- </div>
- </body>
- </html></span>
- <span style="font-family:Times New Roman;font-size:14px;">package com.remoa;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/XMLServlet")
- public class XMLServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- System.out.println("进来------------XMLServlet");
- String xml = "<students>"
- + "<student number='3114005847'>"
- + "<name>张三</name>"
- + "<sex>male</sex>"
- + "<age>18</age>"
- + "</student>"
- + "<student number='3114005848'>"
- + "<name>李四</name>"
- + "<sex>male</sex>"
- + "</student>"
- + "<student number='3114005849'>"
- + "<name>王五</name>"
- + "<age>18</age>"
- + "<tel>13334445556</tel>"
- + "</student>"
- + "</students>";
- response.setContentType("text/xml;charset=utf-8");
- response.getWriter().print(xml);
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }</span>
四、Ajax案例一:用户名自动检测
4.1 GET方式
这里的自动提示是以文字提示为例:
我们可以在myeclipse中新建一个web工程,然后写一个注册的jsp文件,这里命名为register.jsp。
在这个jsp中的html中的body下把这个表单先写好,并给其id,这里的作用主要是为了给后面的内容通过getElementById进行元素查找。
- <form >
- 用户名:<input id="usernameID" type="text" name="username" maxlength="10" /> <span id="resID"></span>
- </form>
因为有的浏览器可能会不支持ajax,所以我们需要来判断一个浏览器是否兼容。这里也就是先创建一个ajax对象。
- function createAJAX(){
- var ajax=null;
- try{
- ajax=new ActiveXObject("microsoft.xmlhttp");
- }catch(e1){
- try{
- ajax=new XMLHttpRequest();
- }catch(e2){
- alert("您的浏览器不支持ajax,请更换浏览器试试!");
- }
- }
- return ajax;
- }
然后就是按照前面分享的编码步骤进行:
- //定位文本框,同时提供焦点事件
- document.getElementById("usernameID").οnblur=function(){
- //获取文本框中输入的值
- var username=this.value.trim();
- //如果内容为空
- if(username.length==0){
- document.getElementById("resID").innerHTML="用户名不能为空";
- }else{
- //对网址中的汉字进行utf-8编码
- username=encodeURI(username);
- var ajax=createAJAX();
- var method="GET";
- var url="${pageContext.request.contextPath}/servlet/UserServlet?time="+new Date().getTime()+"&username="+username;
- ajax.open(method,url);
- ajax.send(null);
- ajax.onreadystatechange=function(){
- if(ajax.readyState==4){
- if(ajax.status==200){
- var tip=ajax.responseText;
- document.getElementById("resID").innerHTML=tip;
- }
- }
- }
- }
- }
这里我们需要用到servlet来做服务器的接收和验证操作。这里是通过get方法来实现的。
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String username=request.getParameter("username");
- byte[] buf = username.getBytes("ISO-8859-1");
- username = new String(buf,"UTF-8");
- //System.out.println(username);
- String tip="<font color='green'>可注册</font>";
- if("朱培".equals(username)){
- tip="<font color='red'>该用户已存在</font>";
- }
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter pw=response.getWriter();
- pw.write(tip);
- pw.flush();
- pw.close();
- }
运行Tomcat服务器。通过地址进行访问。
效果如下:当鼠标移开的时候,如果库中有则会提示用户已存在。
若用户不存在,则可以进行注册。
4.2 POST方式
post方式很多都与get方法类似,但是还是有区别的,例如post方法需要设置ajax请求头为post,它会将请求的汉字自动进行utf-8的编码。这里用图片提示为例:
- //定位文本框,同时提供焦点事件
- document.getElementById("usernameID").οnblur=function(){
- //获取文本框中输入的值
- var username=this.value.trim();
- //如果内容为空
- if(username.length==0){
- document.getElementById("resID").innerHTML="用户名不能为空";
- }else{
- var ajax=createAJAX();
- var method="POST";
- var url="${pageContext.request.contextPath}/servlet/UserServlet?time="+new Date().getTime();
- ajax.open(method,url);
- //设置ajax请求头为post,它会将请求的汉字自动进行utf-8的编码
- ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
- var content="username="+username;
- ajax.send(content);
- ajax.onreadystatechange=function(){
- if(ajax.readyState==4){
- if(ajax.status==200){
- var tip=ajax.responseText;
- var imgElement = document.createElement("img");
- //设置img标签的src/width/height的属性值
- imgElement.src = tip;
- imgElement.style.width = "15px";
- imgElement.style.height = "15px";
- //定位span标签
- var spanElement = document.getElementById("resID");
- //清空span标签中的内容
- spanElement.innerHTML = "";
- //将img标签加入到span标签中
- spanElement.appendChild(imgElement);
- }
- }
- }
- }else{ var spanElement = document.getElementById("resID");
- spanElement.innerHTML = "";
- }
- }
对于selvet,使用post方法:
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- String username=request.getParameter("username");
- String tip="images/b.jpg";
- if("朱培".equals(username)){
- tip="images/a.jpg";
- }
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter pw=response.getWriter();
- pw.write(tip);
- pw.flush();
- pw.close();
- }
效果如下:
五、Ajax案例二:省市级联
关于省市级联的案例非常非常多,这里主要是通过客户端使用ajax进行无刷新拿到服务器中的数据。
首先要把html文件写好,
- <select id="provinceID" style="width:120px">
- <option>选择省份</option>
- <option>湖南省</option>
- <option>广东省</option>
- </select>
- <select id="cityID">
- <option>选择城市</option>
- </select>
- <script type="text/javascript" src="js/ajax.js"></script>
然后就继续在这个script脚本中进行编写了。
- //定位省份下拉框,同时添加内容改变事件
- document.getElementById("provinceID").οnchange=function(){
- //清空
- var cityElement=document.getElementById("cityID");
- cityElement.options.length=1; //只保留第一个
- //获取选中省份的名字
- var index=this.selectedIndex;
- var optionElement=this[index];
- //获取选中的option标签中的内容
- var province=optionElement.innerHTML;
- if("选择省份"!=province){
- var ajax=createAJAX();
- var method="POST";
- var url="${pageContext.request.contextPath}/servlet/Province?time="+new Date().getTime();
- ajax.open(method,url);
- //设置ajax请求头为post,它会将请求体重的汉子自动进行utf-8的编码
- ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
- var content="province="+province;
- ajax.send(content);
- ajax.onreadystatechange=function(){
- <span style="white-space:pre"> </span>
- if(ajax.readyState==4){
- if(ajax.status==200){
- var xmlDocument=ajax.responseXML;
- //按照dom去解析xml文档
- var cityElementArray=xmlDocument.getElementsByTagName("city");
- var size=cityElementArray.length;
- for(var i=0;i<size;i++){
- //innerHTML只能在html/jsp中使用,不能再xml中使用
- var city=cityElementArray[i].firstChild.nodeValue;
- var optionElement=document.createElement("option");
- optionElement.innerHTML=city;
- cityElement.appendChild(optionElement);
- }
- }
- }
- }
- }
- }
对于服务端,采用的是post方法:
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- String province=request.getParameter("province");
- //xml格式的数据
- response.setContentType("text/xml;charset=UTF-8");
- PrintWriter pw = response.getWriter();
- pw.write("<?xml version='1.0' encoding='UTF-8' ?>");
- pw.write("<root>");
- if("广东省".equals(province)){
- pw.write("<city>广州</city>");
- pw.write("<city>深圳</city>");
- pw.write("<city>佛山</city>");
- }else if("湖南省".equals(province)){
- pw.write("<city>长沙</city>");
- pw.write("<city>衡阳</city>");
- pw.write("<city>永州</city>");
- pw.write("<city>株洲</city>");
- }
- pw.write("</root>");
- pw.flush();
- pw.close();
- }
效果如下:
这里是会无刷新操作,可以给用户发出好的交互体验。