【Ajax】 # ajax简单概述

1. Ajax概述

  1. 异步的(Asynchronous),使用Ajax代表不使用之前的转发重定向操作 异步访问,局部刷新
  2. 使用XMLHttpRequest技术整合

2. 原生Ajax实例 – 使用jsp

【【在<input>标签内,加入 onblur 事件】】

【获取输入】并判断,在页面内进行前端验证

======================================================================================
JS访问服务器
	// 1.创建XMLHttpRequest对象
	var xhr;
	function createXHR(){
        if(window.ActiveObject){  // IE
           xhr = new ActiveObject('Microsoft.XMLHTTP');
        } else {
            xhr = new XMLHttpRequest();
        }
    }

	// 2.和服务器建立连接 -- get请求
	xhr.open("get", "/example/index.jsp?name=" + name);
	// post请求
	xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
	xhr.open("post", "/example/index.jsp");

  	// 3.指定回调函数
	xhr.onreadystatechange = function() {
       if (xhr.readyState == 4) {
           if (xhr.status == 200) {
               // 1.获取返回值
               var text = xhr.responseText();
               // 2.处理返回值.....
           } else {
               alert(xhr.status + "  " + xhr.statusText);
           }
       }
    };
   
	// 4.发送请求给服务器 -- get请求的发送方式
	xhr.send();
	// post请求
	xhr.send("name=" + name);

3. 原生Ajax实例 – 使用servlet

【【在<input>标签内,加入 onblur 事件】】

【获取输入】并判断,在页面内进行前端验证

=====================================================================================
JS访问后端 servlet
	// 1.创建XMLHttpRequest对象 :与上面类似
	createXHR();
 
	// 2.和服务器建立连接
	xhr.open("post", "/example/servlet/CodeServlet");
	xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
  
	// 3.指定回调函数
	xhr.onreadystatechange = function(){
       if(xhr.readyState == 4){
           if(xhr.status == 200){
               // 1.获取返回值
               var text = xhr.responseText();
               // 2.处理返回值.....
               var arr = text.split(",");
               arr[0]   arr[1]
           } else {
               alert(xhr.status + "  " + xhr.statusText);
           }
       }
    };
  
	// 4.发送请求给服务器
	xhr.send("code="+code);
======================================================================================
服务端(CodeServlet)【需要配置web.xml】
	public class CodeServlet extends HttpServlet {
        protected void service(HttpServletRequest req, HttpServletResponse resp) 				throws Exception {
            // 获取数据
            String code = req.getParameter("code");
            
            // 调用业务层,访问数据库
            Map<String, String> map = new HashMap<>();
            map.put("010", "北京,北京");
            map.put("", "");
            String content = map.get(code);
            if(content == null){
                content = "未知,未知";
            }
            
            // 返回结果
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println(content);
        }
    }

4. jQuery封装

  1. 引入jQuery
   <script type="text/javascript" src="js/jquery.jqprint-0.3.js"></script>
  1. 通过jQuery使用ajax
$(function(){
    // get请求,无法处理错误
    $.get("/example/index.jsp", "name="+name, function(result){
        // result就是结果
    }); 
    
    // post请求
    $.post("/example/index.jsp", {"name":name}, function(result){
        // result就是结果
    }); 
--------------------------------------------------------------------------------
示例:
    $.ajax(function(){
     	url: "/example/index.jsp",
        type: "get",
        data: "name="+name,
        dataType: "text",
        success: function(msg){
            // 成功处理
        },
        error: function(msg){
            // 错误处理
        }
 	});
});

5. JSON

Ajax返回复杂数据,比如集合、对象等,使用JSON

  1. JSON对象

    var person = {"name": "你好", "age": 25, "wife": null};
    
    person.name  ==>  你好
    
  2. JSON数组

    var arr = ["HTML", "CSS", "JS"];
    
    arr[0]  ==>  HTML
    
  3. 对象数组(相当于集合)

    var users = [{"id": 1, "username": "root", passwd: "admin"},
    	{"id": 2, "username": "user", passwd: "123"}
    ];
    
    users[0].id  ==>  1
    
  4. 不规则数据

    var china = {name: "中国",
    	provinces:[
    		{name:"山东省", cities:{city:["临沂", "蒙阴"]}}{name:"河北省", cities:{city:["石家庄", "张家口", "承德"]}}
    	]
    };
    
    china.provinces[1].cities.city[1]  ==>  张家口
    
  5. JSON对象和JSON字符串之间的转换

    var person = {"name": "你好", "age": 25, "wife": null};   // JSON对象
    var person1 = '{"name": "你好", "age": 25, "wife": null}';   // JSON字符串
    
    
    JSON字符串  ==>  JSON对象
    1. JSON.parse(person1);
    2. eval("(" + person1 + ")");
    
    JSON对象  ==>  JSON字符串
    JSON.stringify(person);                   treeify【树化】
    
    

6. 简单示例:三级联动菜单

自关联(适合于树状结构的)

provinces:
    id
    ptitle
    
citys:
	id
    ctitle
    proid
    
合并为一张表
areas:
    id
    atitle
    pid

自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的

因为省没有所属的省份,所以pid可以填写为null
城市所属的省份pid,填写省所对应的编号id
在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息

自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。

查询省的名称为“山东省”的所有城市

select city.* 
from areas as city 
inner join areas as province 
on city.pid = province.aid 
where province.atitle='山东省';

三级联动

  • 省市县三级区域一张表即可
  • 通过外键建立上下级关系 自关联

页面:

<style type="text/css">
    select{
        width:300px;
        height:30px;
    }
    #showdiv{
        width:920px;
        margin:auto;
        margin-top:200px;
    }
</style>

<div id="showdiv">
    <select name="province" id="province" onchange="getCity()"></select>
    
    <select name="city" id="city" onchange="getCounty()"></select>
    
    <select name="county" id="county"></select>
</div>

<script>
    // 页面加载完成后,立即加载所有的省级行政区别写入指定的下拉列表中
	$(function(){
        $.ajax({
            url:"servlet地址",
            type:"get",
            data:{parentId:0},
            dataType:"text",
            success:function(res){
                // 返回的是JSON字符串,将它转换为JSON对象
                var arr = eval("(" + res + ")");
                // 生成option字符串
                var str = "";
                for(var i = 0; i < arr.length; i++){
                    str += 
                        '<option value="'+arr[i].areaId+'">'+arr[i].areaName+'</option>'
                }
                // 写到下拉列表中
                $("#province").html(str);

                // 调用getCity()
                getCity();
            },
            error:function(){

            }
        });
    });
    
    // 改变了省级行政区后,加载该省的市级行政区,并写入对应的下拉列表中
    function getCity(){
        var parentId = $("#province").val();
        $.ajax({
            url:"servlet地址",
            type:"get",
            data:{parentId:parentId},
            dataType:"text",
            success:function(res){
                // 返回的是JSON字符串,将它转换为JSON对象
                eval("var arr=" + res);
                // 生成option字符串
                var str = "";
                for(var i = 0; i < 【arr.length】; i++){
                    str += 
                        '<option value="'+arr[i].areaId+'">'+arr[i].areaName+'</option>'
                }
                // 写到下拉列表中
                $("#city").html(str);

                getCounty();
            },
            error:function(){

            }
        });
    }
    
	//改变了市级行政区后,加载该市的行政区,并写入对应的下拉列表中
    function getCounty(){
        var parentId = $("#city").val();
        $.ajax({
            url:"servlet地址",
            type:"get",
            data:{parentId:parentId},
            dataType:"json",
            success:function(arr){
                // 生成option字符串
                var str = "";
                for(var i = 0; i < arr.length; i++){
                    str += 
                        '<option value="'+arr[i].areaId+'">'+arr[i].areaName+'</option>'
                }
                // 写到下拉列表中
                $("#county").html(str);
            },
            error:function(){

            }
        });
    }
</script>

后端servlet中:

  • 获取传入的parentid
  • 调用持久层方法,获取指定parentid下的下级区域列表
  • 将List转换为字符串(使用Gson工具类)
    • Gson gson = new Gson();
    • gson.toJson(list);
  • 返回结果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRcoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值