Ajax使用进阶
关于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使用进阶的更多相关文章
- Ajax的进阶学习(二)
		JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ... 
- Ajax的进阶学习(一)
		在Ajax课程中,我们了解了最基本的异步处理方式.本章,我们将了解一下Ajax的一些全局请求事件.跨域处理和其他一些问题. 加载请求 在Ajax异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长 ... 
- python学习-- django 2.1.7 ajax 请求 进阶版
		#原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版 $.get(&qu ... 
- AJAX学习必备三本书
		<AJAX基础教程>AJAX必备图书之一.国内发行的第一本AJAX图书,也是目前最好的AJAX入门书,如果您是AJAX新手,此书是最好的入门图书.本书基本包括了实现Ajax需要了解的大部分 ... 
- Servlet处理(jQuery)Ajax请求
		1. jQuery jQuery是一个JavaScript函数库,极大的简化了JavaScript编程,很容易学习.jQuery是目前最流行的开源js框架,并且提供了大量的扩展. 2. Aja ... 
- jQuery 知识体系
		jQuery基础知识一 jQuery之知识二-选择器 [jQuery知识]jQuery之知识三-过滤器 [jQuery知识]jQuery之知识四-DOM和CSS操作 [jQuery知识]jQuery之 ... 
- Ajax 整理总结(进阶)
		Ajax 进阶学习要点:1.加载请求2.错误处理3.请求全局事件4.JSON 和 JSONP5.jqXHR 对象 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的 ... 
- jQuery基础---Ajax进阶
		原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ... 
- javascript进阶之AJAX
		AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ... 
随机推荐
- jQuery中val()、text()、html()之间的差别
			一.括号里没有值时表示取值 val获取表单中的值: text获取对象中的文本内容,不包含html标签: html获取对象中的内容,包括html标签 <!DOCTYPE HTML> & ... 
- CentOS7安装Memcached 三步曲
			1.yum 安装 yum clean allyum -y updateyum -y install memcached 2.Memcached 运行 memcached -h //查看考号修改配置vi ... 
- 天气预报service
			https://weather.com/ https://api.weather.com/v2/turbo/vt1dailyForecast?apiKey=c1ea9f47f6a88b9acb43ab ... 
- 【NOIP】提高组2015 跳石头
			[算法]二分查找 [题解]最小值最大化问题. 从1..l内二分枚举答案,将每个答案最少移开的石头数与最大移开数m比较. 精简写法学自:https://vijos.org/p/1981/solution ... 
- 顺序图(Sequence Diagram)
			顺序图(Sequence Diagram): 是一种强调对象间消息传递次序的交互图,又称为时序图或序列图.描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接 ... 
- Eureka服务下线(Cancel)源码分析
			Cancel(服务下线) 在Service Provider服务shut down的时候,需要及时通知Eureka Server把自己剔除,从而避免其它客户端调用已经下线的服务,导致服务不可用. co ... 
- upupw注入by pass
			http:' and updatexml(null,concat(0x5c,(/*!00000select SCHEMA_name*/from/*!information_schema*/.schem ... 
- DIV+CSS综合实例【传智PHP首页】
			1.首页结构 2.准备工作 所有素材放到与当前网页同级的目录下: 网页背景色.背景图: 主页宽度:1000px: 创建CSS文件,将CSS文件引入到当前的HTML文件中. 3.实现 效果图: HTML ... 
- Visual Studio 附加到进程调试
			Visual Studio 果然是强大的,今天第一次使用附加到进程调试的功能!但是,在使用的时候发现进不了断点... 解决方案: 1.发布的时候选择Debug,而不是Release: 2.右键项目-& ... 
- BZOJ 3656: 异或 (组合数取模 CRT)
			http://www.lydsy.com/JudgeOnline/problem.php?id=3656 大意:经过一通推导,问题变成求\[\binom N M \mod P\],其中N,M<= ... 
