ajax (asynchronous javascript and xml -- 基于javascript和xml的异同步通讯技术)
特征: 异步通讯 异步的请求-响应模式
1.传统的web模式:同步的请求-响应模式
1) 客户端浏览器通过当前页面的表单,向服务器发送请求;
发送请求之后,当web服务器反馈新的页面到达时,浏览器废弃当前页面;
2) 这导致客户端在等待响应页面到来之前将不能进行下一步操作,这种等待服务响应到来之后,
客户端才能执行进一步操作的请求-响应模式,是同步的请求-响应模式
2.ajax模式:异步请求-响应模式
1) 什么是ajax?
asynchronous javascript and xml的首字母提取,形成了ajax:基于javascript和xml的异步通讯技术.
2) ajax对象
是利用XMLHttpRequest构造函数创建的javascript对象。
① 现代浏览器都会定义一个名称为XMLHttpRequest的function,并允许用户利用这个function创建对象.
该对象可以向web服务器单独发送请求,并实施响应处理.因此XMLHttpRequest类型的对象
又叫ajax对象或称为xhr对象.
② ajax对象与服务器交互时,使用的还是http协议.通讯数据可以是:
普通文本数据、xml格式数据 或 json格式的数据。
3.异步请求-响应模式的特点:
1) html页面可以通过ajax对象,单独完成和web服务器的通讯工作,同时自身与服务器的通讯能力仍然保持。
2) 依靠ajax对象和web服务器通讯,不必废弃当前页面,
ajax对象获得服务器的响应之后,可以对当前页面实施局部更新。
#tips:
① 传统的servlet jsp是同步的请求-响应模式;而ajax是异步的请求响应模式。
② 先有同步请求响应模式 后有异步请求响应模式。
③ 当请求到达tomcat时 服务器会给每个请求开一个线程。
④ javascript执行单位是函数,java执行单位是类和对象
⑤ 事件
onclick: 点击触发;
onblur : 失去焦点时触发 -- 光标离开文本框;
⑥ <span>在span后面开辟一片区域</span>
4.同步的请求响应模式:
1> 表单提交
2> 超链接
3> 地址栏输入
同步请求响应模式的弊端:
只要服务器的反馈 没有到达浏览器 ,浏览器就停止在提交页面静止不动。
不做特殊处理情况下(请求转发优化处理) 当响应到达浏览器,浏览器会呈现一个新的页面来加载反馈信息。
需要等待响应信息到达之后才可以进行下一步。
用户体验度不高,等待服务器反馈回路的信息到达浏览器,才能进入下一步。
5.异步请求响应模式:
优点:不需要等待服务器响应到达就可以进行下一步。
6.ajax对象
1> ajax对象不是java对象,是javascript对象
2> 通过构造函数XMLHttpRequest()创建XMLHttpRequest对象,也就是ajax对象。
XMLHttpRequest是已经定义了的 内置的构造函数
XMLHttpRequest 是javascript的内置函数,用来创建对象 ,
XMLHttpRequest 功能函数 一般浏览器都会提供该构造方法
如果浏览器很老 譬如ie6之前的浏览器 可以通过借助操作平台,调用windows提供的方法ActiveXObject()来创建ajax构造
7.ajax对象包含的方法
1>建立连接方法
open("请求方式", "请求地址"+value, true);
① 参数一:请求方式 get/post
② 参数二:请求地址,如果是get请求方式传参需要在后面再加一个参数值 例:"path?username="+uservalue,明码提交。
如果是post请求就不需要。私密提交。
post请求步骤:
①> 设置请求报头,向服务器汇报所提交的是普通文本字符串还是文件。
ajaxObj.setRequestHeader("Content-Type", "...");
<①>文本字符串:application/x-www-form-urlencoded
<②>文件:multipart/form-data
②> send(参数);
ajaxObj.send("username="+uservalue);
③ 参数三:true 表示是异步请求响应模式;
false表示不是异步请求响应模式。
该方法的作用是:通过ajax对象建立和web服务器的连接并准备请求(ajax会单起一个线程)
可以在浏览器中单起一个链接 对服务器发起一个新的线程请求,
2>发送请求方法
send();
① 如果是get请求 :send(null);
② 如果是post请求 :send(参数);
3>当服务器给浏览器反馈响应时,由ajax对象接收反馈
8.ajax的属性
1> status属性 : 服务器反馈回来的响应头信息,是反馈回的状态码; (正常状态码200 异常时500)
2> responseText属性 :服务器反馈回来的响应信息,具体的响应数据结果,存储反馈回来的信息的属性;
3> readyState属性 :就绪状态
readyState属性是ajax对象的就绪状态.在ajax对象的生命周期中,ajax对象的就绪状态有5种情形:
① readyState=0,表示ajax对象刚刚诞生但还未初始化,还没有建立连接;
② readyState=1,表示ajax对象与web服务器建立了连接;
③ readyState=2,表示请求发送之后接收到响应数据(接收了整个完整的响应信息,status属性已经得到设置);
④ readyState=3,表示ajax对象开始解析响应数据(表明ajax对象开始把指针指向响应正文,还没有解析完数据);
⑤ readyState=4,表示ajax对象解析响应数据完毕! (此时就可以对ajax进行下一步操作)
(当ajax就绪状态readyState的数值发生改变时,就说是发生了一个事件,就可以执行其绑定的函数)
9.ajax的事件
1> onreadystatechange
该事件发生时,它所绑定的方法会执行。
当ajax对象的就绪状态(readyState)发生变化时,表明readystatechange事件发生,会触发匿名函数的执行;
10.Ajax对象即能提交异步请求和又能实施响应处理:
1)Ajax对象可以在一个独立的线程中,单独和web服
务器建立连接,并发送请求;
2)ajax对象利用自己的属性存储响应结果,通过
javascript编程处理响应结果,并针对当前页面实施
局部更新.
---------------------------------------------------------------------------------------------------------------------------------
#在javascript中创建对象的方法示例
//创建构造函数,通过构造函数可以创建一个对象,然后可以调用其属性及方法
<script type="text/javascript">
//定义一个构造函数 为了创建js的对象
function Person(name, age){
this.name = name;
this.age = age; //定义javascript的属性
this.show = function(){ //定义javascript的方法, 变量引用函数的首地址 就可以用show代表该方法
alert(this.name + "\t" + this.age);
}
}
//定义功能函数
function fn(){
//创建js对象 js对象的属性不分公有私有,都是私有
var person = new Person("wangda",18); //调用上方定义的构造函数
//输出属性
alert(person.name + "\t" + person.age);
//调用方法
person.show();
}
</script>
-----------------------------------------------------------------------------------------------------------------
#ajax对象的获得示例
<script type="text/javascript">
//创建ajax对象
function getXMLHttpRequest(){
var xhr;
if(typeof XMLHttpRequest != "undefined"){ // 表明浏览器中定义了XMLHttpRequest构造函数
//创建ajax对象
xhr = new XMLHttpRequest();
}else{
//如果当前浏览器没有定义 创建ajax对象的构造函数 就借助于windows平台
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
return xhr;
}
//测试函数
function fn(){
var ajaxObj = getXMLHttpRequest();
alert(ajaxObj); // [object XMLHttpRequest] javascript对对象的表现[object 对象类型]
}
</script>
----------------------------------------------------------------------------------------------------------------
#ajax对象创建以及使用方法示例
<script type="text/javascript">
//创建ajax对象
function getXMLHttpRequest(){
var xhr;
if(typeof XMLHttpRequest != "undefined"){ // 表明浏览器中定义了XMLHttpRequest构造函数
//创建ajax对象
xhr = new XMLHttpRequest();
}else{
//如果当前浏览器没有定义 创建ajax对象的构造函数 就借助于windows平台
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
return xhr;
}
//创建失去焦点函数, 失去焦点时执行的函数
function check_username(){
// 第一步: 获得ajax对象(创建了ajax对象)
var ajaxObj = getXMLHttpRequest();
// 第二步:通过ajax对象建立和web服务器的连接并准备请求(ajax会单起一个线程)
//获得用户名表单项的dom对象
var unameObj = document.getElementById("uname");
var unameValue = unameObj.value;
ajaxObj.open("get", "servlet/ActionServlet?username="+unameValue, true);
// 第三步: 发送请求
ajaxObj.send(null);
// 第四步:实施响应数据的处理
var spanObj = document.getElementById("unameMsg");// 当想把一个标签变成对象时,给它一个id,然后通过该语句将其封装为对象
ajaxObj.onreadystatechange = function(){ //给onreadystatechange事件绑定匿名函数
alert("readyState= "+ajaxObj.readyState+"\n"+
"status= "+ajaxObj.status+"\n"+
"responseText= "+ajaxObj.responseText);
if(ajaxObj.readyState == 4){
if(ajaxObj.status == 200){
spanObj.innerHTML = ajaxObj.responseText; //spanObj.innnerHTML代表span标签体 ,动态显示span标签内容
}else{
spanObj.innerHTML = "服务器端异常...";
}
}else{
spanObj.innerHTML = "ajax对象正在处理响应数据...";
}
}
}
</script>
-----------------------------------------------------------------------------------------
# 动态生成下拉框
function change(v){
alert("1");
// 1>创建ajax对象
var xhr = getXMLHttpRequest();
// 2>建立连接
xhr.open("post", "SelectCity.do", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 3>发送请求
xhr.send("selectname=" + v);
// 4>处理响应数据
xhr.onreadystatechange = function(){
alert("1");
var errorMsgObj = document.getElementById("errorMsg");
errorMsgObj.innerHTML="";//清空原有列表
if(xhr.readyState == 4){
if(xhr.status == 200){
var txt = xhr.responseText;
var jsObj = JSON.parse(txt);
var s2Obj = document.getElementById("s2");
s2Obj.innerHTML = "";//清空原有列表项
for(var index in jsObj){
var op = new Option(jsObj[index].cityName, jsObj[index].cityValue);
s2Obj.options[index] = op;
}
}else{
errorMsgObj.innerHTML="服务器错误";
}
}else{
errorMsgObj.innerHTML="正在读取数据。。。";
}
}
}
-------------------------------------------------------------------------------
servlet通配符配置
'*.do'
' /* '
requestURI : /项目名/资源名
URL : http://localhost:8888/项目名/资源名
ajax应用功能:
页面的局部刷新,ajax功能的校验
jpg格式图片 可伸缩
jQuery
jQuery框架是javascript技术的封装,js的框架之一。
其他的部分的框架:
1>客户对页面有特殊要求使用ExtJS框架(专业的重型的)。
2>dojo框架
3>prototype框架(轻型)
1.jQuery框架原理:
#利用css选择器,通过选择器定位到具体位置,将该位置dom对象封装成jquery对象
1) 将DOM对象封装为jQuery对象。存到自己内部的Array数组中。
封装:
$("参数") -- 代表jquery对象
html标签->dom对象->$对象
var domObj = document.getElementById("#id");
var $Obj = $(domObj); // $的核心函数
如何封装:
2.jQuery函数
1> 核心函数:
$(function(){
});
jQuery("选择器"); --别名: $("选择器"); (别名:jQuery = $)
3.jQuery的方法
1> get();
取得其中一个匹配的元素。 num表示取得第几个匹配的元素。这能够让你选择一个实际的DOM 元素并且对他直接操作,而不是通过 jQuery 函数。
2> html();
无参html(),输出标签体的内容。
有参html(参数),用参数内容替换标签体内容。
3> text();
只输出文本,不输出标签(忽略标签)
设置样式:
4> css();
设置样式方法。专门添加style样式(行样式)。
设置符合样式时使用JSON格式。
例:$("#id").css("font-size", "20px");
5> attr(参数);
属性方法。
① 显示属性值,
② 对元素动态的添加新的属性。
6> addClass(参数);
动态的添加属性。
7> removeClass();
动态的删除属性。
8> toggleClass(参数);
切换样式方法。第一次点击添加样式,第二次点击删除。
9> boolean | hasClass(参数);
判断是否有该样式属性
1> $ | children();
获得一组子元素封装成一个$对象
2> next();
紧邻的下一个元素。
3> siblings();
同级别元素,兄弟姐妹。
4> find(参数);
元素查找。
1> append();
内部追加,添加到后面。参数可以是jQuery对象也可以是html标签
2> prepend();
内部添加,前加。
3> after();
元素外部添加,在元素之后添加。
4> before();
元素外部添加,在元素之前添加。
$参数是多变的: dom对象 标签元素 标签选择器。。。。。
4.jQuery的事件方法
5.jQuery框架的执行结构(*****):
$(function(){
});
jquery不使用事件触发机制,定义了事件方法。事件方法是必须有事件发生才执行。
匿名函数或者命名函数作为事件方法的参数。
事件方法的参数是函数:
① 匿名函数,需要传整个函数,包括函数主体。
② 命名函数,将函数名传递进去。
1>ready()方法是jquery的执行结构。
ready事件方法: (代替了onload事件,当浏览器加载完html页面后自动执行)
$(document).ready(function(){
.....
});
ready()方法的简化方法:
$(function(){
.....
});
2>jquery事件执行方法示例:
// jquery执行结构,当浏览器加载完html页面后自动执行
$(function(){
$().click(function(){
// click事件方法代码,当click事件发生执行
....
});
});
#tips:
//第一次点击执行第一个匿名函数,第二次点击执行第二个匿名函数。
$("a").toggle(function(){...}, function(){...});
优势:代码和标签分离。
6.对无序列表的操作:
效果:
1> empty();
把标签体置空。
2> remove();
把标签删除。
3> mouseover: 鼠标覆盖 mouseout:鼠标离开
$(function(){
$("ul li").mouseover(function(){ //父子选择器 这样指每一个<li>列表; mouseover: 鼠标覆盖事件
$(this).addClass("") // this是当前dom对象; addClass添加类选择器
})
});
7.无序列表的遍历
(只有each方法有index参数)
$obj.each(function(index){
if(index == 0){
//this指当前dom对象
$(this).next().val();
}
});
#tips:
① $("input:text:eq(0)").val()
解释:下标是0; 类型是text的元素,input也可以不写; .val()获得用户输入值
② $(":text")
解释:类型是text的所有元素封装成的jquery对象
自动填写表单
$("需要填写的dom").val("需要填写的字符");
例: $(":text").val("name");
获取列表项的值
$(":text").val();
2)自定义的动画效果
$().animate(运动的终点位置 终点坐标是JSON格式, 用时数值);
eg: $().animate({}, 3000); // 设置position:relative;之后 指:相对于初始位置
$().animate();
8.简化ajax技术(*****) (jquery函数可以直接用,方法必须需要别人来调用它)
1)核心函数:$.ajax() (其他函数方法最终底层调用该核心方法)
1> XMLHttpRequest | jQuery.ajax([options]);
options代表选项对象,是设置具体请求和响应的参数,用json格式定义。
2)函数:$.get()
1> XMLHttpRequest | jQuery.get(url, [data], [callback], [type]);
① url:请求地址
② data:请求参数
③ callback:回调,即响应到达才会调用该方法。
④ type:返回响应的类型
url,[data],[callback],[type] : String,Map,Function,String
3)函数:$.post()
1> XMLHttpRequest | jQuery.post(url, [data], [callback], [type]);
参数 同上。
4)方法:load() jQuery对象的load方法
1> jQuery | load(url, [data], [callback]);
① url:请求地址
② data:请求参数,发送至服务器的 key/value 数据。在jQuery 1.3 中也可以接受一个字符串了。
③ callback:载入成功时回调函数。回调,即响应到达才会调用该方法。
load方法要求的返回响应的类型是普通文本。
url, [data], [callback] : String,Map/String,Callback
# tips:
①dom、java、jQuery区别:
dom对象可以直接使用属性。s.name;
java从来不使用属性,通过调用方法。s.getName();
jQuery对象也是通过使用方法。jQuery对象更加接近java对象。
② css 三大选择器:
1>id选择器: #id
2>类选择器: .class
3>元素选择器 (*代表页面的所有元素)
>复合选择器 (三大选择器组合使用)
③ xml标签体包含空白
④ <b></b>加重加粗标签
⑤ #u1 li:eq(1) : 父子选择器 #u1标签下的下标为1的<li>标签
<ul id="u1">
<li></li> :下标为0
<li></li> :下标为1
</ul>
⑥ css样式属性:
display:none; css样式属性,初始时不显示
opacity:0.2; 不透明度,1/5不透明,4/5透明
position:relative; 相对定位,即以后可能会运动,以后的运动相对于初始的位置。如果该元素有子元素,子元素的位置是相对于该元素
jQuery的重点:
1>jQuery的四个核心方法
2>动画效果
3>执行结构
4>选择器
JSON
定义javabean对象的作用是封装数据,定义了一个数据传输的规范。
JSON对象定义格式:{"属性名称":属性值, "属性名称":属性值, "属性名称":属性值}
1 JSON对象的类型:
1> 单个对象
{"属性名称":属性值, "属性名称":属性值, "属性名称":属性值}
2> 数组对象(集合对象)
格式: [{}, {}, {}]
[{"属性名称":属性值, "属性名称":属性值, "属性名称":属性值},
{"属性名称":属性值, "属性名称":属性值, "属性名称":属性值},
{"属性名称":属性值, "属性名称":属性值, "属性名称":属性值}]
2 http协议下
1)在服务器端:
1>获得大量复杂数据,封装到一组java对象中。
2>把一组java对象转化成JSON对象是的字符串格式,发给浏览器。
即: 一组java对象 --> JSON对象
2)在浏览器端:
1>把JSON字符串对象首先转成javascript对象
即: JSON对象 --> JavaScript对象
3. 一组java对象 --> JSON对象 第三方工具类
1> 针对单个对象(class JSONObject)
2> 针对一组对象(class JSONArray)
4 JSON对象--> JavaScript对象
JSON.parse(json格式字符串); -- 新浏览器
js调试工具插件:firebug
-------------------------------------------------------------------------------------------------------
# java对象 --> JSON对象
// 1> 单个java对象的JSON格式
private static void singleObjectTran() {
// ①定义一个选项对象
Option op = new Option("海淀", "hd");
// ②转换
JSONObject jsonObj = JSONObject.fromObject(op);
// ③输出
System.out.println(jsonObj.toString()); // {"cityName":"海淀","cityValue":"hd"}
}
// 2> 一组java对象的JSON格式
private static void arrayObjectTran() {
// ①定义一组选项对象
Option op1 = new Option("海淀","hd");
Option op2 = new Option("东城","dc");
Option op3 = new Option("西城","xc");
// ②添加到list集合中
List<Option> olist = new ArrayList<Option>();
olist.add(op1);
olist.add(op2);
olist.add(op3);
// ③转换
JSONArray jsonArray = JSONArray.fromObject(olist);
// ④输出
System.out.println(jsonArray.toString());
-------------------------------------------------------------------------------------------------------
# JSON对象--> JavaScript对象
<script type="text/javascript">
function fn1(){
var str='{"cityName":"岳阳", "cityValue":"yy", "cityAge":800}';
//转换: 单个对象的json格式字符串 --> javascript对象
var jsObj = JSON.parse(str);
alert(jsObj.cityName+"--"+jsObj.cityValue+"--"+jsObj.cityAge);
}
function fn2(){
var str2='[{"cityName":"海淀", "cityValue":"hd"}, {"cityName":"东城", "cityValue":"dc"}, {"cityName":"西城", "cityValue":"xc"}]';
//转换:一组对象的json格式字符串 --> javascript对象(数组对象)
var jsObj2 = JSON.parse(str2);
alert("jsObj2 is Array? " + (jsObj2 instanceof Array)); //true
// 动态生成下拉框
var selectObj = document.getElementById("select");
selectObj.innerHTML = "";
for(var index in jsObj2){ //for循环的增强结构
//alert(jsObj2[index].cityName +"--"+jsObj2[index].cityValue);
//形成下拉框选项
var op = new Option(jsObj2[index].cityName, jsObj2[index].cityValue);
// 把下拉框选项添加到下拉框中
selectObj.options[index] = op;
}
}
</script>
--------------------------------------------------------------------------------------------------
Q;web服务器给浏览器发送数据?
首选:JSON
次选:XML 、
--------------------------------------------------------------------------------------------------
异步jquery<例>:
$.ajax({
type: "POST", //请求方式
async:true, // 异步
cache:false, //缓存
url: basePath + 'pc/queryOutTimeCount.do', //请求地址
dataType : "json", //数据类型
success:function(data){ //如果请求成功响应,得到返回的数据,data封装queryOutTimeCount.do return的数据 <此处为int>
if(data != 0){
$("#pcExprieControl").html("");
$("#pcExprieControl").html("存在"+data+"个已过期主机,请及时处理!");
$("#pcExprieControl").show();
}else{
$("pcExprieControl").hide();
}
},
error : function(xhr, status, errMsg) {
com.message("error","主机监控失败!");
}
});