zoukankan      html  css  js  c++  java
  • Ajax介绍

    什么是AJAX?

    AJAX(Asynchronous Javascript And XML),即异步的js和xml.

    用途 : 不重新刷新整个页面的情况下,与服务器交互并局部更新页面内容.

    实现AJAX的两个步骤

      1.前端用JS写AJAX代码

      2.后端响应AJAX请求

    一.前端AJAX代码

    AJAX有两种写法,分别是:

      1).用javascript写

      2).用js框架写(如jQuery)

    AJAX主要用两种请求方式:

      1).GET ==> @请求参数写在url后,不安全

             @发送数据量有限制(url长度有限,比如Chrome的url最大长度为8182字节) 

             @会获取缓存结果,因为get一般做查询操作,不必每次都与数据库连接(解决方法,用Math.random()在url地址后加一个随机数参数)

      2).POST ==> @比GET安全,请求参数放在请求body中

             @没有长度限制

             @POST不能使用缓存(因为一般做删改操作,必须与数据库交互)

    I.首先用JS代码写AJAX请求

    展示代码之前,先介绍实现AJAX的核心对象window.XMLHttpRequest,用于在后台与服务器交换数据

    XMLHttpRequest的属性们:

      onreadystatechange : 用于存储(回调)函数,每当 readyState 属性改变时,就会调用该函数.  

      readyState : 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化.0: 请求未初始化1: 服务器连接已建立2: 请求已接收3: 请求处理中4: 请求已完成,且响应已就绪

      status : 请求状态 200: "OK"  404: 未找到页面

    1.使用get请求方式

    有3个步骤
    function useGet() {
    		//1.创建XMLHttpRequest对象
    		var xmlhttp;
    		if (window.XMLHttpRequest)
    		{
    			//  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
    			xmlhttp=new XMLHttpRequest();
    		}
    		else
    		{
    			// IE6, IE5 浏览器执行代码
    			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    		}
    		//2.设置获得响应后的操作
    		xmlhttp.onreadystatechange=function()
    		{
    			if (xmlhttp.readyState==4 && xmlhttp.status==200)
    			{
    				document.getElementById("result").value=xmlhttp.responseText;
    			}
    		}
    		//3.设置请求信息(open()),发送请求(send())
    		//请求方法用get时,需要把请求参数写在url中(?a=1&b=2).  true表示开启异步
    		xmlhttp.open("GET", "${pageContext.request.contextPath }/test/ajaxTest?a=1&b=2", true);
    		xmlhttp.send();
    	}

    扩展 :   

      回调函数 : 用于存入主函数(useGet())中.让主函数调用的函数即回调函数,在上边代码中xmlhttp.onreadystatechange=后面的function内容就是回调函数,回调函数是在主函数执行完后才执行

    2.使用post请求方式

     使用post请求的写法和get请求的写法稍有不同,多一个setRequestHeader()函数来设置请求头的Content-type,因为get方法中,请求参数不在请求体中,所以get方法无需设置Content-type,而post方法需要设置

    //设置异步请求信息,post请求中,请求参数无需写在url中
    xmlhttp.open("POST","${pageContext.request.contextPath }/test/getRealName",true);
    //设置请求头(application/json表示发送的数据是json格式的字符串)
    xmlhttp.setRequestHeader("Content-type","application/json; charset=UTF-8");
    //发送请求,  JSON.stringify()用于把js对象转换为字符串
    xmlhttp.send(JSON.stringify({"username" : username}));
    //顺便一提,JavaScript中把字符串转换成JSON对象的方法
    //JSON.parse(str)

      

    II.后端响应AJAX请求的代码

    以SpringMVC为例

    首先要注意几点 : 

      1).springMVC中Ajax请求无需为Controller方法return跳转地址.因为异步请求还是在原页面局部刷新,并不会跳转页面.所以即使给方法返回类型设置为void也没问题!

    //方法返回类型设置为void也无妨
    @RequestMapping("/ajaxTest")
    public void ajaxTest(int num1, int num2, HttpServletResponse response) {
    	try {
    		//设置字符集编码
    		response.setCharacterEncoding("UTF-8");
    		//创建PrintWriter对象,
    		PrintWriter writer = response.getWriter();
    		Integer resInteger = num1*num2;
    		//用PrintWriter对象的write()方法将数据写入HTTP response body中,JS中XMLHttpRequest对象的responseText会接收到该数据
    		writer.write(resInteger.toString());
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    

      2).@ResponseBody和@RequestBody的用法要了解

      使用位置 作用
    @ResponseBody Controller层方法的上边

    使用该注解后,方法的返回结果将直接写入响应体(HTTP response body)中,

    而不再走视图解析器(把返回值解析为跳转路径)

    @RequestBody Controller层方法的参数类型前 请求体的数据使用HttpMessageConverter解析,然后封装到形参上

      

      

     在AJAX中,主要使用@ResponseBody把数据转换为JSON格式返回给前端,@RequestBody把前端传入的JSON格式数据封装到JavaBean中(配合jackson-databind实现)

      3).前台发送json格式数据时,必须引入jackson-databind,用于把接受到的json格式数据转化为POJO

        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.0</version>
        </dependency>

    后台代码实例 : 

    @RequestMapping("/getRealName")
    @ResponseBody  //设置@ResponseBody后,该方法不再走视图解析器,即使返回String也不会被视图解析器拦截
    public User result1(@RequestBody User user) {  //@RequestBody把请求体中的数据封装到POJO中
    	User u = ts.getRealName(user);
         //返回User类型对象,会被自动解析成JSON格式字符串并发回给前端 return u; }

      

    是否使用@RequestBody和@ResponseBody看你自己的需求,用不到的话就不必使用.

    f

  • 相关阅读:
    MAVEN 安装与配置
    MAVEN 常用仓库地址
    一些常用的工具
    springFramework 源码学习之源码下载与编译
    测试工程师学习笔记
    什么是多态
    聚簇索引与非聚簇索引
    正则表达式菜鸟教程
    我的第一篇博客
    转Hibernate继承
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10799824.html
Copyright © 2011-2022 走看看