只是小人物

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1. ajax是什么?
    1)异步的javascript和xml
    为了解决传统的web应用当中“等待-响应-等待”的弊端而创建的一种技术,其实质可以
    理解为:使用浏览器内置的一个对象(XmlHttpRequest)向服务器发送请求,服务器返
    回xml数据或者是文本数据,然后在浏览器端使用这些数据更新部分页面,整个过程,页
    面无任何的刷新。
    
    2)传统的“等待-响应-等待”:
        指的是,在传统的web应用当中,比如注册,用户填写完整个注册信息,然后提交,
        此时,浏览器会将整个注册页面抛弃,等待服务器返回一个新的完整的页面。在等待
        过程当中,用户不能够做其他操作。服务器生成新的页面发送给浏览器,浏览器需要
        重新解析整个页面生成相应的界面。
        
2.XmlHttpRequest对象
    1)如何获得该对象
        该对象并没有标准化,要区分浏览器。
        ie浏览器不指出XMLHttpRequest类型,其他浏览器支持。
         function getXmlHttpRequest(){
                 var xmlHttpRequest = null;
                 iif((typeof))
         }
    2)属性
        onreadystatechange:注册监听器(绑定事件处理代码)
        readyState:ajax对象与服务器间通讯的状态,该状态有0
        ,1,2,3,4,五个值,当值为4时,表示收到了服务器返回
        所有的数据。
        responseText:获取服务器返回的文本数据
        responseXML:获得服务器返回的xml数据
        statue:获得状态码
        
    3)编程
        step1  获得XmlHttpRequest对象
            var xhr = getXhr();
            
        step2 发请求
        1)发送get请求
        //open(请求方式,请求地址,同步还异步)
        //如果有请求参数,应该添加到请求地址后面
        //true表示异步,false表示同步
            xhr.open('get','check_username.do?username=zs',true);
            xhr.onreadystatechange=f1;
            xhr.send(null);
        2)发送post请求
            xhr.open(‘post','check_username.do',true);
            //为xhr生成的请求数据包添加一个content-type消息头
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            xhr.send("username=zs");
            
        step3 编写服务器端代码,来处理请求。
        step4 在监听器(时间处理代码当中)处理服务器返回的数据。
            function f1(){
                //只有状态等于4
                if(xhr.readyState==4){
                //获得服务器返回的数据    
                    var txt = xhr.responseText;
                //var xml = xhr.reqponseXML;
                //dom操作
                ...
                }
            }


例子:
JS部分

 1 function $(id){
 2     return document.getElementById(id);
 3 }
 4 function $F(id){
 5     return document.getElementById(id).value;
 6 }
 7 function getXhr() {
 8     var xhr = null;
 9     if (window.XMLHttpRequest) {
10                     //非ie浏览器
11         xhr = new XMLHttpRequest();
12     } else {
13                     //ie浏览器
14         xhr = new ActiveXObject("Microsoft.XMLHttp");
15     }
16     return xhr;
17 }

 




javascript部分
使用get

 1 function check_name(){
 2                 
 3                 //step1 得到XMLHttpRequest对象
 4                 var xhr = getXhr();
 5                 //step2 发送请求
 6                 xhr.open('get',
 7                 'check_name.do?username='
 8                 + $F('username'),true);
 9                 xhr.onreadystatechange=function(){
10                     if(xhr.readyState == 4){
11                         //只有状态等于4,才能够获得服务器返回的
12                         //数据。
13                         if(xhr.status==200){
14                             //说明服务器返回的数据正常
15                             var txt = xhr.responseText;
16                         //更新页面
17                             $('name_msg').innerHTML = txt;
18                         }else{
19                         $('name_msg').innerHTML = '稍后重试';
20                         }
21                         
22                     }else{
23                         //当readyState的值不等于4,表示xhr对象正在与服务器交互
24                         $('name_msg').innerHTML ='正在检查..';
25                     }
26                 };
27                 xhr.send(null);
28             }
29             
30         //使用post
31             function check_name2(){
32                 
33                 //step1 得到XMLHttpRequest对象
34                 var xhr = getXhr();
35                 //step2 发送请求
36                 xhr.open('post',
37                 'check_name.do',true);
38                 xhr.onreadystatechange=function(){
39                     if(xhr.readyState == 4){
40                         //只有状态等于4,才能够获得服务器返回的
41                         //数据。
42                         if(xhr.status==200){
43                             //说明服务器返回的数据正常
44                             var txt = xhr.responseText;
45                         //更新页面
46                             $('name_msg').innerHTML = txt;
47                         }else{
48                         $('name_msg').innerHTML = '稍后重试';
49                         }
50                         
51                     }else{
52                         //当readyState的值不等于4,表示xhr对象正在与服务器交互
53                         $('name_msg').innerHTML ='正在检查..';
54                     }
55                 };
56                 xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
57                 xhr.send('username=' + $F('username'));
58             }

 


            
            
jsp部分:
 

1  用户名:<input id="username"
2             name="username"
3             onblur="check_name();"/>
4             

 


            
Servlet部分

1 String username =
2                 request.getParameter("username");
3             if(username.equals("zs")){
4                 out.println("用户名已经存在");
5             }else{
6                 out.println("可以使用");
7             }

 


            
            
            
            
3.ajax需要注意的问题
1)缓存问题:
    当采用get方式向服务器发送请求时,ie浏览器会先查询缓存当中有没有
    结果,如果有,则不会向服务器发送请求。
    解决方案:
        a.在请求地址后面加上一个随机数
        b.或者使用post方式
2)编码问题
    a.连接地址当中有中文
        浏览器一定会使用utf-8对连接地址中的中文进行编码
        解决方式:
        对于tomcat,tomcat_home/config/server.xml,
       在 <Connector/> 中添加URLEncoding="utf-8"
        重新启动服务器。
    b.连接地址中包含了中文参数
        浏览器会对连接地址中的中文参数进行编码,会使用打开
        连接所在页面的编码格式来编码.
        解决方式:
            step1:
            对于tomcat,tomcat_home/config/server.xml,
           在 <Connector/> 中添加URLEncoding="utf-8"
            重新启动服务器。
            step2:要保证连接所在页面以utf-8编码格式打开
            如果页面中不以utf-8来编码,那就对中文参数手动
            转码:<%=URLEncoder.encoding("张三")%>
    c.ajax编程当中如何向服务器发送中文
        在ajax编程中,不是浏览器向服务器发送请求,是XMLHttpRequest对
        象向服务器发送请求,该对象也会对请求中的中文参数进行编码。
        
        使用get方法发送请求时
        ie浏览器内置的MLHttpRequest对象(其实是ActiveXObject)
        会采用gbk编码,而其他浏览器,采用utf-8编码。
            
        解决办法:

            step1:
            对于tomcat,tomcat_home/config/server.xml,
           在 <Connector/> 中添加URLEncoding="utf-8"
            重新启动服务器。
            step2:使用encodeURI(javascript内置的一个函数)
                encodeURI(url)
                
        使用post发送请求,此时,浏览器会对中文参数统一进行utf-8编码。
        解决方式:request.setCharacterEncoding("utf-8");

posted on 2012-07-10 10:52  只是小人物  阅读(212)  评论(0编辑  收藏  举报