详解javascript传统方法实现异步校验


Posted in Javascript onJanuary 22, 2016

学习JavaScript异步校验时往往是从最传统的XMLHttpRequest学起,本文来谈一下对传统校验的认识:
代码1index.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<% 
  String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>如何使用传统方法异步验证用户名的唯一性</title> 
    <script type="text/javascript"> 
      function goDemo(pageName){ 
        window.location.href='<%=basePath%>'+pageName; 
      } 
    </script> 
  </head> 
  
  <body> 
    <center style="margin-top: 10%"><font style="color: red;font-size: 18pt;font-weight: bold;">如何使用传统方法异步验证用户名的唯一性</font></center><br> 
    例子一:<input type="button" value="例子一" onclick="goDemo('demo1.jsp');"/><br><br> 
    例子二:<input type="button" value="例子二" onclick="goDemo('demo2.jsp');"/><br><br> 
    例子一与例子二的区别:两者都实现了使用传统方法异步验证用户名的唯一性的功能,区别在于使用的servlet中的的方法不同:"例子一"使用的servlet中的doGet方法;"例子二"使用的servlet中的doPost方法。 
  </body> 
</html>

代码2demo1.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<% 
  String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>使用的servlet中的doGet方法</title> 
    <script type="text/javascript"> 
      function checkUserName(){ 
        var value=document.getElementById("userName").value; 
        if(value==""){ 
          document.getElementById("showUserName").innerHTML="<font size=\"2\" color=red>用户名不能为空!!!</font>"; 
        }else{ 
          var xmlHttpRequest = null; 
          if(window.XMLHttpRequest){/*适用于IE7以上(包括IE7)的IE浏览器、火狐浏览器、谷歌浏览器和Opera浏览器*/ 
            xmlHttpRequest = new XMLHttpRequest();//创建XMLHttpRequest 
          }else if(window.ActiveXObject){/*适用于IE6.0以下(包括IE6.0)的IE浏览器*/ 
            xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
          }//第一步:创建XMLHttpRequest对象,请求未初始化 
   
          xmlHttpRequest.onreadystatechange = function (){//readyState值发生改变时XMLHttpRequest对象激发一个readystatechange事件,进而调用后面的函数 
            if(xmlHttpRequest.readyState==1){ 
              xmlHttpRequest.send();//第三步:发送请求,也可以为xmlHttpRequest.send(null) 
            } 
            if(xmlHttpRequest.readyState==2){ 
              console.log("send()方法已执行,请求已发送到服务器端,但是客户端还没有收到服务器端的响应。"); 
            } 
            if(xmlHttpRequest.readyState==3){ 
              console.log("已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。"); 
            } 
            if(xmlHttpRequest.readyState==4){//客户端接收服务器端信息完毕。第四步:处理服务器端发回来的响应信息 
              if(xmlHttpRequest.status==200){//与Servlet成功交互 
                console.log("客户端已完全接收服务器端的处理响应。"); 
                var responseValue=xmlHttpRequest.responseText; 
                if(responseValue==1){ 
                  document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"red\"> 用户名已被使用!</font>"; 
                }else if(responseValue==2){ 
                  document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"green\"> 用户名有效!!!</font>"; 
                } 
              }else{//与Servlet交互出现问题 
                document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"red\">请求发送失败!</font>"; 
              } 
            } 
          }; 
           
          if(xmlHttpRequest.readyState==0){ 
            xmlHttpRequest.open("get","<%=basePath%>AjaxCheckUserNameServlet?userName="+value,true);//第二步:完成请求初始化,提出请求。open方法中的三个参数分别是:请求方式、路径、是否异步(true表示异步,false表示同步) 
          } 
        } 
      } 
    </script> 
  </head> 
 
  <body> 
    <center style="margin-top: 10%"><font style="color: red;font-size: 18pt;font-weight: bold;">使用的servlet中的doGet方法</font><br><br> 
         用户名:<input type="text" id="userName" name="userName" size="27" onblur="checkUserName();"> 
      <font size="2" id="showUserName"> *用户名必填,具有唯一性。</font> 
    </center> 
  </body> 
</html>

代码3demo2.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<% 
  String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>使用的servlet中的doPost方法</title> 
    <script type="text/javascript"> 
      function checkUserName(){ 
        var value=document.getElementById("userName").value; 
        if(value==""){ 
          document.getElementById("showUserName").innerHTML="<font size=\"2\" color=red>用户名不能为空!!!</font>"; 
        }else{ 
          var xmlHttpRequest = null; 
          if(window.XMLHttpRequest){/*适用于IE7以上(包括IE7)的IE浏览器、火狐浏览器、谷歌浏览器和Opera浏览器*/ 
            xmlHttpRequest = new XMLHttpRequest();//创建XMLHttpRequest 
          }else if(window.ActiveXObject){/*适用于IE6.0以下(包括IE6.0)的IE浏览器*/ 
            xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
          }//第一步:创建XMLHttpRequest对象,请求未初始化 
   
          xmlHttpRequest.onreadystatechange = function (){//readyState值发生改变时XMLHttpRequest对象激发一个readystatechange事件,进而调用后面的函数 
            if(xmlHttpRequest.readyState==1){ 
              xmlHttpRequest.send();//第三步:发送请求,也可以为xmlHttpRequest.send(null) 
            } 
            if(xmlHttpRequest.readyState==2){ 
              console.log("send()方法已执行,请求已发送到服务器端,但是客户端还没有收到服务器端的响应。"); 
            } 
            if(xmlHttpRequest.readyState==3){ 
              console.log("已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。"); 
            } 
            if(xmlHttpRequest.readyState==4){//客户端接收服务器端信息完毕。第四步:处理服务器端发回来的响应信息 
              if(xmlHttpRequest.status==200){//与Servlet成功交互 
                console.log("客户端已完全接收服务器端的处理响应。"); 
                var responseValue=xmlHttpRequest.responseText; 
                if(responseValue==1){ 
                  document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"red\"> 用户名已被使用!</font>"; 
                }else if(responseValue==2){ 
                  document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"green\"> 用户名有效!!!</font>"; 
                } 
              }else{//与Servlet交互出现问题 
                document.getElementById("showUserName").innerHTML="<font size=\"2\" color=\"red\">请求发送失败!</font>"; 
              } 
            } 
          }; 
           
          if(xmlHttpRequest.readyState==0){ 
            xmlHttpRequest.open("post","<%=basePath%>AjaxCheckUserNameServlet?userName="+value,true);//第二步:完成请求初始化,提出请求。open方法中的三个参数分别是:请求方式、路径、是否异步(true表示异步,false表示同步) 
          } 
        } 
      } 
    </script> 
  </head> 
  
  <body> 
    <center style="margin-top: 10%"><font color="red" size="5"><strong>使用的servlet中的doPost方法</strong></font><br><br> 
         用户名:<input type="text" id="userName" name="userName" size="27" onblur="checkUserName()"> 
      <font size=2 id="showUserName"> *用户名必填,具有唯一性。</font> 
    </center> 
  </body> 
</html>

代码4AjaxCheckUserNameServlet.java文件:

package com.ghj.packagofserlet; 
 
import java.io.IOException; 
import java.io.PrintWriter; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class AjaxCheckUserNameServlet extends HttpServlet { 
 
  private static final long serialVersionUID = 6387744976765210524L; 
 
  /** 
   * 处理demo1.jsp中异步验证 
   * 
   * @author GaoHuanjie 
   */ 
  public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 
    try{ 
      response.setCharacterEncoding("UTF-8"); 
      request.setCharacterEncoding("UTF-8"); 
      PrintWriter out = response.getWriter(); 
      //System.out.println(1/0);//故意出现异常,以检查demo1.jsp中xmlHttpRequest.status!=200的分支语句是否可用 
      String userName=request.getParameter("userName");//获取“用户名” 
      System.out.println("处理demo1.jsp中异步验证,用户名为:"+userName); 
      if ("admin".equals(userName)) { 
        out.print("1");//“1”表示用户名不可用。  
      } else { 
        out.print("2");//“2”表示用户名可用。 
      } 
      out.flush(); 
      out.close(); 
    }catch (Exception e) { 
      e.printStackTrace(); 
      response.setStatus(405); 
    } 
  } 
   
  /** 
   * 处理demo2.jsp中异步验证 
   * 
   * @author GaoHuanjie 
   */ 
  public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 
    try{ 
      response.setCharacterEncoding("UTF-8"); 
      request.setCharacterEncoding("UTF-8"); 
      PrintWriter out = response.getWriter(); 
      //System.out.println(1/0);//故意出现异常,以检查demo2.jsp中xmlHttpRequest.status!=200的分支语句是否可用 
      String userName=request.getParameter("userName");//获取“用户名” 
      System.out.println("处理demo2.jsp中异步验证,用户名为:"+userName); 
      if ("admin".equals(userName)) { 
        out.print("1");//“1”表示用户名不可用。 
      } else { 
        out.print("2");//“2”表示用户名可用。 
      } 
      out.flush(); 
      out.close(); 
    }catch (Exception e) { 
      e.printStackTrace(); 
      response.setStatus(405); 
    } 
  } 
}

代码5web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xmlns="http://java.sun.com/xml/ns/javaee"  
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
 
  <servlet> 
    <servlet-name>AjaxCheckUserNameServlet</servlet-name> 
    <servlet-class>com.ghj.packagofserlet.AjaxCheckUserNameServlet</servlet-class> 
  </servlet> 
 
  <servlet-mapping> 
    <servlet-name>AjaxCheckUserNameServlet</servlet-name> 
    <url-pattern>/AjaxCheckUserNameServlet</url-pattern> 
  </servlet-mapping> 
  
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
  </welcome-file-list> 
</web-app>

以上就是使用传统方法实现异步校验的详细代码,希望对大家的学习有所帮助。

Javascript 相关文章推荐
为javascript添加String.Format方法
Aug 11 Javascript
JQuery小知识
Oct 15 Javascript
js判断IE浏览器版本过低示例代码
Nov 22 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
May 31 Javascript
elementUI Tree 树形控件的官方使用文档
Apr 25 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 Javascript
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
jquery.validate提示错误信息位置方法
Jan 22 #Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 #Javascript
jQuery简单获取键盘事件的方法
Jan 22 #Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
Jan 22 #Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 #Javascript
鼠标悬停小图标显示大图标
Jan 22 #Javascript
在JavaScript中call()与apply()区别
Jan 22 #Javascript
You might like
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
php数据库抽象层 PDO
2011/05/07 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
Python如何访问字符串中的值
2020/02/09 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
请解释在new与override的区别
2012/10/29 面试题
大学生的网上创业计划书
2013/12/31 职场文书
歌唱比赛主持词
2014/03/18 职场文书
表彰会主持词
2014/03/26 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
团队激励口号
2014/06/06 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android