构建ajax-02页面,首先,在文本框中注册焦点事件,基于焦点事件判断输入内容是否存在.其次点击save按钮时,将用户内容异步提交到服务器端.
在服务端AjaxConotroller中添加如下代码,处理客户端请求:
private List<String> names=new ArrayList<String>();//假设这是存储数据的表
@RequestMapping("doAjax02UI")
public String doAjax02UI() {
return "ajax-02";
}
/**通过此方法校验名字是否存在*/
@RequestMapping("doCheck")
@ResponseBody
public String doCheck(String name) {
if(names.contains(name))
return "名字"+name+"已经存在,请选择其它名字";
return "名字"+name+"不存在,可以注册";
}
/**将客户端请求数据写入到names对应的集合*/
@RequestMapping("doSave")
@ResponseBody
public String doSave(String name) {
System.out.println("name="+name);
names.add(name);
return "save ok";
}
<h1>The Ajax 02 Page</h1>
<fieldset>
<legend>Ajax 表单请求</legend>
<form>
<input type="text" name="name" id="nameId" onblur="doCheck()" onfocus="doClear()">
<input type="button" onclick="doSave()" value="Save">
</form>
<span id="result"></span>
</fieldset>
<script type="text/javascript">
function doClear(){
document.forms[0].name.value="";
document.getElementById("resultId").innerHTML="";
}
//检测名字是否已存在
function doCheck(){
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.定义XHR对象的状态监听函数
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
document.getElementById("resultId").innerHTML=
`${xhr.responseText}`;
}
}
//3.建立连接
let name=document.forms[0].name.value;
xhr.open("GET",`doCheck?name=${name}`,true);
//4.发送请求
xhr.send(null);
}
//保存表单中名字的值
function doSave(){//debugger,log,排除法
// debugger
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.定义XHR对象的状态监听函数
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
document.getElementById("resultId").innerHTML=xhr.responseText;
}
}
//3.建立连接(Post)
xhr.open("POST","doSave",true);
//post请求传参需要设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//4.发送请求
let name=document.forms[0].name.value;//获取输入的name属性值
//构建参数对象
var params={"name":name};//JavaScript中的对象(原生ajax方式不可以直接传递这样的对象)
xhr.send(params);//post请求的参数需要写到此位置
}
</script>
构建参数对象
name=${name}
;抽取共性,封装到 js 文件中
<script type="text/javascript" src="/js/ajax.js"></script>
<script type="text/javascript" src="/js/ajax.js"></script>
<script type="text/javascript">
//检测名字是否已存在
function doCheck(){
//1.定义请求的url
var url="http://localhost/doCheck";
//2.定义请求参数
var name=document.forms[0].name.value;
var params=`name=${name}`;
//3.发送ajax get请求
doAjaxGet(url,params,(result)=>{
document.getElementById("resultId").innerHTML=
`${result}`;
});
}
//保存表单中名字的值
function doSave(){//debugger,log,排除法
//1.请求url
const url="http://localhost/doSave";
//2.请求参数
let name=document.forms[0].name.value;
let params=`name=${name}`;
//3.发送ajax post请求
doAjaxPost(url,params,(result)=>{
alert(result);
})
}
</script>
//封装共性,提取特性
function doAjaxGet(url,params,callback){//定义函数(函数声明方式)
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.定义XHR对象的状态监听函数
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
callback(xhr.responseText);//回调函数
}
}
//3.建立连接
xhr.open("GET",`${url}?${params}`,true);
//4.发送请求
xhr.send(null);
}
function doAjaxPost(url,params,callback){
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.定义XHR对象的状态监听函数
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
callback(xhr.responseText);//回调函数
}
}
//3.建立连接
xhr.open("POST",url,true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//4.发送请求
xhr.send(params);
}
构建一个原生ajax框架
<script type="text/javascript" src="/js/ajaxfk.js"></script>
<script type="text/javascript">
//检测名字是否已存在
function doCheck(){
//1.定义请求的url
var url="http://localhost/doCheck";
//2.定义请求参数
var name=document.forms[0].name.value;
var params=`name=${name}`;
//3.发送ajax get请求
$$.doAjaxGet(url,params,(result)=>{
document.getElementById("resultId").innerHTML=
`${result}`;
});
}
//保存表单中名字的值
function doSave(){//debugger,log,排除法
//1.请求url
const url="http://localhost/doSave";
//2.请求参数
let name=document.forms[0].name.value;
let params=`name=${name}`;
//3.发送ajax post请求
$$.doAjaxPost(url,params,(result)=>{
alert(result);
})
}
</script>
(()=>{
//1.定义一个构造函数
var ajax=function(){}//函数表达式(可以将其理解为构造函数)
//2.在构造函数内部的原型对象(Prototype)上添加ajax函数
ajax.prototype={
doAjaxGet:function(url,params,callback){
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.设置状态监听
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//服务端响应结束,客户端接收完成
if(xhr.status==200){//200表示正常响应结束
callback(xhr.responseText);//回调函数
}else{//表示出现了异常
callback(xhr.status);
}
}
}
//3.建立连接
xhr.open("GET",`${url}?${params}`,true)
//4.发送请求
xhr.send(null);
},
doAjaxPost:function(url,params,callback){
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.设置状态监听
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//服务端响应结束,客户端接收完成
if(xhr.status==200){//200表示正常响应结束
callback(xhr.responseText);//回调函数
}else{//表示出现了异常
callback(xhr.status);
}
}
}
//3.建立连接
xhr.open("POST",url,true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//4.发送请求
xhr.send(params);
}
}
//3.基于ajax构造函数构建ajax对象,并将对象赋值给全局变量Ajax
window.$$=new ajax();
})()
优化原生ajax框架
<script type="text/javascript" src="/js/ajaxfk02.js"></script>
<script type="text/javascript">
//检测名字是否已存在
function doCheck(){
//1.定义请求的url
var url="http://localhost/doCheck";
//2.定义请求参数
var name=document.forms[0].name.value;
var params=`name=${name}`;
//3.发送ajax get请求
$$.doAjaxGet(url,params,(result)=>{
document.getElementById("resultId").innerHTML=
`${result}`;
});
}
//保存表单中名字的值
function doSave(){//debugger,log,排除法
//1.请求url
const url="http://localhost/doSave";
//2.请求参数
let name=document.forms[0].name.value;
let params=`name=${name}`;
//3.发送ajax post请求
$$.doAjaxPost(url,params,(result)=>{
alert(result);
})
}
</script>
(()=>{
//1.定义一个构造函数
var ajax=function(){}//函数表达式(可以将其理解为构造函数)
var JsonObj=function(type,url,data,contentType="application/x-www-form-urlencoded",async=true){//es6 中允许参数有默认值
this.type=type;
this.url=url;
this.data=data;
this.contentType=contentType;
this.async=async;
}
//2.在构造函数内部的原型对象(Prototype)上添加ajax函数
ajax.prototype={
doAjax:function(obj){
//1.创建XHR对象
const xhr=new XMLHttpRequest();
//2.设置状态监听
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//服务端响应结束,客户端接收完成
if(xhr.status==200){//200表示正常响应结束
obj.success(xhr.responseText);//回调函数
}else{//表示出现了异常
obj.error(xhr.status);
}
}
}
//3.建立连接
let type=obj.type?obj.type:"GET";
xhr.open(type,type=="GET"?`${obj.url}?${obj.data}`:obj.url,obj.async)
//4.发送请求
if(type!="GET"){
xhr.setRequestHeader("Content-Type",obj.contentType);
}
xhr.send(type=="GET"?null:obj.data);
},
doAjaxGet:function(url,params,callback){
var jsonObj=new JsonObj("GET",url,params);
jsonObj.success=callback;
jsonObj.error=callback;
this.doAjax(jsonObj);
},
doAjaxPost:function(url,params,callback){
var jsonObj=new JsonObj("POST",url,params);
jsonObj.success=callback;
jsonObj.error=callback;
this.doAjax(jsonObj);
}
}
//3.基于ajax构造函数构建ajax对象,并将对象赋值给全局变量Ajax
window.$$=new ajax();
})()