之前一直都是用封装好的Ajax,所以一直很好奇它是如何使用和实现的。这里正好就进行一下学习,下面是Ajax的一个时间图。

设置触发条件

  这里模拟一个使用场景,就是在用户登陆时,异步的对用户名以及密码进行验证。所以使用onBlur()触发,onBlur函数在输入框焦点遗失时,就会触发。

     <form name="loginForm">
<table>
<tr>
<td>用戶名:<input type="text" name="username" onBlur="checkUsername()"></td>
</tr>
<tr>
<td><div id="usernameDiv"></div></td>
</tr>
<tr>
<td>密 码:<input type="password" name="password" onBlur="checkPassword()"></td>
</tr>
<tr>
<td><div id="passwordDiv"></div></td>
</tr>
</table>
</form>

创建Ajax的对象

  由于Ajax并不是一个统一的标准,因此各个浏览器有自己的创建方式,因此在创建时,需要进行浏览器的验证,使用如下的验证方法即可。

 if(window.XMLHttpRequest){
req = new XMLHttpRequest();
}else if(window.ActiveXObject){
req = new ActiveXObject("Microsoft.XMLHTTP");
}

open() onreadystatechante() send()

3.1 open(),这个函数有三个参数,第一个是http的发送方式,常见的有GET和POST,我们这里使用GET,来传送参数;第二个参数是一个url,这个url第一个作用是与后台的servlet进行匹配,第二个作用是传送前台的数据到后台;第三个参数是个bool值,如果为true标识用异步的方式发送请求。

req.open("GET",url+"?username="+document.loginForm.username.value,true);

3.2 onreadystatechange 指定回调函数,当数据返回时,使用该函数进行处理。我们的处理函数是自己定义的usernameCallback

req.onreadystatechange = usernameCallback;

3.3 send函数用来发送创建好的请求。由于前面的参数已经添加到url后面,因此这里直接使用null作为参数就行了。

req.send(null);

  自己定义的usernameCallback函数,用于把返回的字符串使用DOM方式写入指定的div中。

  在函数返回时,可以使用之前创建好的req对象,调用它的readystate 以及 status属性,4表示XMLHttpRequest对象响应正常结束。200表示HTTP请求获得正确的响应。

  只有这两个条件都满足,才表明异步请求请求成功。

function usernameCallback(){
if(req.readyState == 4){
if(req.status == 200){
var str = req.responseText;
if(str.split("!")[0] == "Success"){
document.getElementById("usernameDiv").className = "black";
}else{
document.getElementById("usernameDiv").className = "red";
}
document.getElementById("usernameDiv").innerHTML = str;
}else{
alert("username failed!");
}
}else{ }
}

通过url与后台的servlet关联

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>checkUsername</servlet-name>
<servlet-class>usernameServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkUsername</servlet-name>
<url-pattern>/checkUsername</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>checkPassword</servlet-name>
<servlet-class>passwordServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkPassword</servlet-name>
<url-pattern>/checkPassword</url-pattern>
</servlet-mapping>
</web-app>

简单反馈

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/xml;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache"); String username = request.getParameter("username");
// System.out.println("username"+username);
String str = ""; if("xingoo".equals(username)){
str += "Success!" + username;
}else{
str += "failed!" + username;
} response.getWriter().write(str);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }

另一个验证的servlet采用同样的方式,这里就不再赘述了。下面会贴出所有的代码。

源码暴露

Login.html

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
.red {
color:red;
font-size: 20;
}
.black {
color: black;
font-size: 20;
}
</style>
<script language="javascript">
function checkUsername(){
var url = "checkUsername";
if(window.XMLHttpRequest){
req = new XMLHttpRequest();
}else if(window.ActiveXObject){
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req){
req.open("GET",url+"?username="+document.loginForm.username.value,true);
req.onreadystatechange = usernameCallback;
req.send(null);
}
}
function checkPassword(){
var url = "checkPassword";
if(window.XMLHttpRequest){
req = new XMLHttpRequest();
}else if(window.ActiveXObject){
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req){
req.open("GET",url+"?password="+document.loginForm.password.value,true);
req.onreadystatechange = passwordCallback;
req.send(null);
}
}
function usernameCallback(){
if(req.readyState == 4){
if(req.status == 200){
var str = req.responseText;
if(str.split("!")[0] == "Success"){
document.getElementById("usernameDiv").className = "black";
}else{
document.getElementById("usernameDiv").className = "red";
}
document.getElementById("usernameDiv").innerHTML = str;
}else{
alert("username failed!");
}
}else{ }
}
function passwordCallback(){
if(req.readyState == 4){
if(req.status == 200){
var str = req.responseText;
if(str.split("!")[0] == "Success"){
document.getElementById("passwordDiv").className = "black";
}else{
document.getElementById("passwordDiv").className = "red";
}
document.getElementById("passwordDiv").innerHTML = str;
}else{
alert("password failed!");
}
}else{ }
}
</script>
</head>
<body>
<form name="loginForm">
<table>
<tr>
<td>用戶名:<input type="text" name="username" onBlur="checkUsername()"></td>
</tr>
<tr>
<td><div id="usernameDiv"></div></td>
</tr>
<tr>
<td>密 码:<input type="password" name="password" onBlur="checkPassword()"></td>
</tr>
<tr>
<td><div id="passwordDiv"></div></td>
</tr>
</table>
</form>
</body>
</html>

web.xml

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>checkUsername</servlet-name>
<servlet-class>usernameServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkUsername</servlet-name>
<url-pattern>/checkUsername</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>checkPassword</servlet-name>
<servlet-class>passwordServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkPassword</servlet-name>
<url-pattern>/checkPassword</url-pattern>
</servlet-mapping>
</web-app>

usernameServlet.java

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class usernameServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/xml;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache"); String username = request.getParameter("username");
// System.out.println("username"+username);
String str = ""; if("xingoo".equals(username)){
str += "Success!" + username;
}else{
str += "failed!" + username;
} response.getWriter().write(str);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }
}

passwordServlet.java

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class passwordServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/xml;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache"); String password = request.getParameter("password");
// System.out.println("password"+password);
String str = ""; if("123".equals(password)){
str += "Success!" + password;
}else{
str += "failed!" + password;
} response.getWriter().write(str);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }
}

运行效果

这里直接判断返回状态,进行样式的改变

成功时的效果!

失败时的效果!

【前端开发系列】—— 别说你不会Ajax的更多相关文章

  1. 【前端开发系列】—— CSS3属性选择器总结

    想想自己为什么要学CSS,作为一个开发过前端的人员来说,调试一个图片花了半天的时间,最后发现分隔符用错了,实在是一件很丢人的事情.因此,痛下决心来学习CSS,最近一周也会更新下相关的学习笔记. CSS ...

  2. vue 开发系列(二) vue ajax 拦截

    概要说明 在开发的过程中,我们需要通过AJAX请求,访问后台获取数据,这个获取数据的时候,当然需要后台需要时登录状态才能访问数据,当没有登录的情况,这个时候我们需要跳转到登录界面进行登录. 如果每次请 ...

  3. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  4. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十七】

    <Web 前端开发精华文章推荐>2013年第五期(总第十七期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  5. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  6. 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 前一篇文章 ...

  7. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  8. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  9. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. 命令行子shell 括号 ()

    子shell 控制变量 ansible-direc:~ # (export hello=world;echo $hello)worldansible-direc:~ # echo $hello ans ...

  2. (转载)移动WEB前端开发资源整合

    收藏起来,感谢原文大大:Bon~~~ 原文链接:http://www.ccwebsite.com/development-of-resource-integration-in-mobile-termi ...

  3. 游戏制作之路:一个对我来说可实现的High-end的Mac/iOS游戏制作大概计划

    对于学习一些东西,我比较习惯任务驱动式的学习,也就是说,要事先订好一个目标,要做什么东西,达到什么效果,然后根据自己了解的知识作一个可以实现这个目标的计划. 现在要学的是游戏制作,而且是High-en ...

  4. 不错的开源FTP类库

    socket开源ftp类库代码:http://netftp.codeplex.com/ 需要注意事项,如果以下代码出现乱码问题,可以设置其中的Encoding属性就可以. 用法示例: using Sy ...

  5. Scala 环境搭建

    下载安装包 1,)下载java jdk,推荐jdk1.8; 2,)下载scala安装包:http://www.scala-lang.org/; 3,)下载IDE:ide可以选择两种: 3.1,)Sca ...

  6. leetcode105:Construct Binary Tree from Preorder and Inorder Traversal

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume t ...

  7. Java条件编译

    学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译.Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件 ...

  8. 你值得拥有:25个Linux性能监控工具

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  9. 如何拥有一个自己的Vagrant box

    这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...

  10. MVC过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...