关于Ajax的概念不再做解释了,我想通过三个小例子来让大家对Ajax有个清晰的认识。要学习它,必须从最基础最原始的方式开始认识,然后通过使用框架来提升效率,逐步认识它。

一.原生js版(注册的用户名是否重复的校验)

前端js代码:

<script type="text/javascript">
var xmlHttpRequest;
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
function request(){
var uname = document.getElementById("username").value;
if(uname==""){//用户名为空则不作判断是否存在
return;
}
//请求字符串
var url = " CheckUserServlet"; //1创建XMLHttpRequest组件
xmlHttpRequest = createXmlHttpRequest();
//2设置回调函数
xmlHttpRequest.onreadystatechange = handle;
//3初始化XMLHttpRequest组件
xmlHttpRequest.open("POST",url,true);
//4.设置请求头(post类型需要)
xmlHttpRequest.send(null);
xmlHttpReq.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
//5.发送请求
xmlHttpReq.send("username=" + uname);
}
function handle(){
if(xmlHttpRequest.readyState==4
&&xmlHttpRequest.status==200 ){
var b = xmlHttpRequest.responseText;
//alert(b);
if(b=="true"){
document.getElementById("result").innerHTML="用户名已存在";
}else{
document.getElementById("result").innerHTML="用户名可以使用";
}
} } </script>

后台servlet查找用户表

public class CheckUserServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

       response.setCharacterEncoding("UTF-8");

       String username = request.getParameter("username");

       PrintWriter out = response.getWriter();

       try {

           Class.forName("com.mysql.jdbc.Driver");

           Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/wp","root","root");

           PreparedStatement ps = con.prepareStatement("select * from user where u_name='"+username+"'");

           ResultSet rs = ps.executeQuery();

           if(rs.next()){

              out.println("true");

           }else{

              out.println("false");

           }

           con.close();

           out.close();

       } catch (ClassNotFoundException e) {

           e.printStackTrace();

       } catch (SQLException e) {

           e.printStackTrace();

       }

    }

}

二.JQuery框架版(一个搜索框的自动补全)

前端js代码(使用了jQuery框架,封装了对Ajax的操作,是不是简单了许多)

<scripttype="text/javascript">

$(document).ready(function() {

    $('#query').keyup(function() {

            reg=/^[a-z|A-Z|0-9]/;//以字母或者数字开头的不予响应

           if(reg.test($('#query').val()))return;

        $.ajax({ 

            url: 'AutoServlet?body='+$('#query')[0].value, 

            type: 'GET', 

            dataType: 'json',  //以json形式返回

            timeout: 2000, 

            cache: false, 

            error: erryFunction,  //错误执行方法   

            success: succFunction //成功执行方法   

        }) 

        function erryFunction() { 

            alert("error"); 

        } 

        function succFunction(data) { 

               $.each(data, function (index, value) {  //遍历

                      $("#auto").append("<br>"+value); 

               });

        } 

    });

 }); 

</script>

后台可以使用Servlet处理,将得到的结果使用Gson转换为json形式返回给客户端:

public class AutoServlet extendsHttpServlet {

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throwsServletException, IOException {

              List<String> names = new ArrayList<String>();

              String body = request.getParameter("body");

              body = new String(body.getBytes("ISO-8859-1"),"UTF-8");

              response.setCharacterEncoding("UTF-8");

              PrintWriterout = response.getWriter();

              try{

                     Class.forName("com.mysql.jdbc.Driver");

                     Connection con =DriverManager.getConnection("jdbc:mysql://localhost:3306/wp","root","root");

                     PreparedStatement ps = con.prepareStatement("select distinct (name) from book where namelike '%"+body+"%'");

                     ResultSet rs = ps.executeQuery();

                     while(rs.next()){

                            names.add(rs.getString("name"));

                     }

                     con.close();

              }catch (ClassNotFoundException e) {

                     e.printStackTrace();

              }catch (SQLException e) {

                     e.printStackTrace();

              } 

       //使用谷歌的gson转换成json

              Gson gson = new Gson();

              String jsonString = gson.toJson(names);

              out.println(jsonString);

              out.close();

       }

}

三.快捷式DWR版(省市二级联动)

前端js和html代码

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert titlehere</title>

  <script type='text/javascript'src='/TestDWR/dwr/interface/MyDemo.js'></script>

  <script type='text/javascript'src='/TestDWR/dwr/engine.js'></script>

  <script type='text/javascript'src='/TestDWR/dwr/util.js'></script>

<script type="text/javascript">

function change(pro){

     MyDemo.findCity(pro,callback);

}

function callback(data){

    DWRUtil.removeAllOptions("city");

    DWRUtil.addOptions("city",data,"id","name");

}

</script>

</head>

<body>

<select id="pro"onchange="change(this.value)">

<option value="1">湖北省</option>

<option value="2">湖南省</option>

<option value="3">山东省</option>

</select>

<select id="city"></select>

</body>

</html>

服务器端Java代码:

public class Demo1 {

    List<City> citys1 = new ArrayList<City>();

    List<City> citys2 = new ArrayList<City>();

    List<City> citys3 = new ArrayList<City>();

    Map<Integer,List<City>> cityMap = new HashMap<Integer, List<City>>();

    public Demo1(){

       citys1.add(new City(100,"武汉市"));

       citys1.add(new City(101,"宜昌市"));

       citys1.add(new City(102,"仙桃市"));

       citys1.add(new City(103,"黄冈市"));

       citys2.add(new City(200,"长沙市"));

       citys2.add(new City(201,"株洲市"));

       citys2.add(new City(202,"岳阳市"));

       citys2.add(new City(203,"湘潭市"));

       citys3.add(new City(300,"烟台市"));

       citys3.add(new City(301,"青岛市"));

       citys3.add(new City(302,"秦皇岛市"));

       cityMap.put(1,citys1);

       cityMap.put(2,citys2);

       cityMap.put(3,citys3);

    }

    public List<City> findCity(int id ){

       if(cityMap.containsKey(id)){

           returncityMap.get(id);

       }

       return null;

    }

}

后台的代码就是如此,servlet不需要了,返回的结果也不需要转换了,看起来就像在客户端直接调用服务器端java代码一样.

但是多了些配置和引用:

1.      web.xml的配置

2.      dwr.xml的配置

3.      自动生成的js脚本的引用(需要先注入)

我们会发现,所谓的框架,不过是封装了一些繁杂无味的机械化操作,将这些平时会重复使用的部分写好,把变化的部分提炼出来,以配置的形式让人修改,达到的效果是相同的,但开发的效率却大大提高。就像所有的Ajax框架和组件一样,底层的操作少不了,你不需要做,但你得知道有这么一出,这就是基本原理。

Ajax使用进阶的更多相关文章

  1. Ajax的进阶学习(二)

    JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ...

  2. Ajax的进阶学习(一)

    在Ajax课程中,我们了解了最基本的异步处理方式.本章,我们将了解一下Ajax的一些全局请求事件.跨域处理和其他一些问题. 加载请求 在Ajax异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长 ...

  3. python学习-- django 2.1.7 ajax 请求 进阶版

    #原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版  $.get(&qu ...

  4. AJAX学习必备三本书

    <AJAX基础教程>AJAX必备图书之一.国内发行的第一本AJAX图书,也是目前最好的AJAX入门书,如果您是AJAX新手,此书是最好的入门图书.本书基本包括了实现Ajax需要了解的大部分 ...

  5. Servlet处理(jQuery)Ajax请求

    1. jQuery     jQuery是一个JavaScript函数库,极大的简化了JavaScript编程,很容易学习.jQuery是目前最流行的开源js框架,并且提供了大量的扩展. 2. Aja ...

  6. jQuery 知识体系

    jQuery基础知识一 jQuery之知识二-选择器 [jQuery知识]jQuery之知识三-过滤器 [jQuery知识]jQuery之知识四-DOM和CSS操作 [jQuery知识]jQuery之 ...

  7. Ajax 整理总结(进阶)

    Ajax 进阶学习要点:1.加载请求2.错误处理3.请求全局事件4.JSON 和 JSONP5.jqXHR 对象 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的 ...

  8. jQuery基础---Ajax进阶

    原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ...

  9. javascript进阶之AJAX

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...

随机推荐

  1. vijos 1069 新年趣事之红包 Prim水题

    描述 xiaomengxian一进门,发现外公.外婆.叔叔.阿姨……都坐在客厅里等着他呢.经过仔细观察,xiaomengxian发现他们所有人正好组成了一个凸多边形.最重要的是,他们每个人手里都拿着一 ...

  2. 阿里云maven仓库地址,速度提升100倍

    参照:https://www.cnblogs.com/xxt19970908/p/6685777.html maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来. ...

  3. 【洛谷 P5110】 块速递推(矩阵加速,分块打表)

    题目链接 掌握了分块打表法了.原来以前一直想错了... 块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表. 然后就 ...

  4. 【洛谷 P2303】 [SDOi2012]Longge的问题 (欧拉函数)

    题目链接 题意:求\(\sum_{i=1}^{n}\gcd(i,n)\) 首先可以肯定,\(\gcd(i,n)|n\). 所以设\(t(x)\)表示\(gcd(i,n)=x\)的\(i\)的个数. 那 ...

  5. LCD实验学习笔记(五):MMU

    内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...

  6. win7旗舰版64位缺失tbb.dll文件

    win7旗舰版64位缺失tbb.dll文件 https://zhidao.baidu.com/question/688589990330312804.html 到好的电脑中复制一个,黏贴到下同的路径下 ...

  7. VPS L2TP配置

    原文地址:https://raymii.org/s/tutorials/IPSEC_L2TP_vpn_with_Ubuntu_14.04.html 只要保证ipsec verify没错,基本都可以成功 ...

  8. hadoop安装 伪分布

    伪分布hadoop 安装总结 准备,在配置中hadoop用的9000端口,如果有其它软件用着这个端口,建议更换后再进行下面配置,以避免出现错误.比如php-fpm经常使用9000端口. 一.下载jdk ...

  9. sicily 1153. 马的周游问题

    一.题目描述 在一个8 * 8的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便 ...

  10. iOS APP程序启动原理

    UIApplication 程序启动原理 一个应用程序运行就必须要有一个进程,一个进程至少要有一个线程,我们把这个线程叫做主线程,主线程开启之后会开启一个主运行循环,如果不开启一个运行循环,程序开启了 ...