AJAX

1. 概念: ASynchronous JavaScript And XML 			异步的JavaScript 和 XML
  	1. 异步和同步: 客户端和服务器端相互通信的基础上
      	  * 同步: 客户端必须等待放服务器端的响应. 在等待的期间客户端不能做其他操作.
          * 异步: 客户端不需要等待服务器的响应. 在服务器处理请求的过程中, 客户端可以进行其他的操作.
    2. 特点:
		  1. Ajax 是一种无需重新加载整个页面的情况下, 能够更新部分网页的技术
          2. 通过在后台与服务器进行少量数据交换, Ajax 可以使网页实现异步更新. 这意味着可以在不重新加载整个页面的情况下, 对页面的某部分进行更新.
          3. 传统的网页(不使用 Ajax)如果需要更新内容, 必须重载整个网页页面.
            
2. 实现方式:
	1. 原生的JS实现方式(了解)
        * 代码:
			// 发送异步请求
            // 1. 创建核心对象
            var xmlhttp;
            if (window.XMLHttpRequest){
                // 高版本浏览器创建对象
                xmlhttp = new XMLHttpRequest();
            } else {
                // 低版本浏览器创建对象
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }

            // 2. 建立连接
            /*
                参数:
                   1. 请求方式: GET、POST
                        * get方式: 请求参数在URL后边拼接. send方法为空参
                        * post方式: 请求参数在send方法中定义
                   2. 请求的URL
                   3. 同步或异步请求: true(异步) 或 false(同步)
             */
            xmlhttp.open("GET", "ajaxServlet?username=tom", true);

            // 3. 发送请求
            xmlhttp.send();

            // 4. 接受并处理来自服务器的响应结果
            // 获取方式: xmlhttp.responseText
            // 什么时候获取? 当服务器响应成功后再获取

            // 当xmlhttp对象的就绪状态改变时, 触发时间onreadystatechange
            xmlhttp.onreadystatechange = function(){
                // 判断就绪状态是否为4, 判断status响应的状态码是否为200
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    // 获取服务器的响应结果
                    var responseText = xmlhttp.responseText;
                    alert(responseText);
                }

            }


    2. JQuery实现方式
      	1. $.ajax()
      		* 语法: $.ajax({键值对})
            * 代码:
				// 使用$.ajax发送异步请求
                $.ajax({
                    url: "ajaxServlet", 									// 请求路径
                    type: "post",       									// 请求方式, 默认是get, 就是不写的情况
                    // contentType: "application/json",   // 发送的数据, mime类型
                    async: "true",      						// 异步或同步, true异步, false同步, 默认异步
                    // data: "username=jack&age=23", 			//请求参数, 第一种方式
                    data: {"username": "jack", "age": 23}, // 请求参数, 第二种方式
                    dataType: "text",   									// 设置接受到的响应数据的格式, mime类型
                    success: function(data){    					// 响应成功后的回调
                        alert(data);
                    },
                    error: function(error){  					// 表示如果请求响应出现错误, 会执行的回调函数
                        alert("出错啦...")
                    }
                });

      	2. $.post(): 发送post请求
             * 语法: $.post(url, [data], [callback], [type])
               	  * 参数:
					  * url: 请求路径
                      * data: 请求参数
                      * callback: 回调函数
                      * type: 响应结果的类型
                  * 代码:
					  $.post("ajaxServlet", {"username": "rose"}, function(data){
                          alert(data);
                      }, "text");
          
      	3. $.get(): 发送get请求
          	 * 语法: $.get(url, [data], [callback], [type])
               	  * 参数:
					  * url: 请求路径
                      * data: 请求参数
                      * callback: 回调函数
                      * type: 响应结果的类型
                  * 代码:
					  $.get("ajaxServlet", {"username": "rose"}, function(data){
                          alert(data);
                      }, "text");

JSON

1. 概念: JavaScript Object Notation				JavaScript对象表示法
  	  var p = {"name": "张三", "age": 23, "gender": "男"};

	  * json现在多用于存储和交换文本信息的语法
      * 进行数据的传输
      * JSON 比 XML 更小、更快、更易解析.
      
2. 语法:
  	  1. 基本规则:
    		* 数据在名称/值对中: json数据是由键值对构成
        		* 键用引号(单双都行)引起来, 也可以不适用引号
					* 值得取值类型:
            				1. 数字(整数或浮点数)
							2. 字符串(在双引号中)
							3. 逻辑值(true 或 false)
							4. 数组(在方括号中) 					{"persons": [{}, {}]}
							5. 对象(在花括号中)(json对象) {"address": {"province": "陕西"...}}
							6. null

			* 数据由逗号分隔: 多个键值对由逗号分隔         		         
	        * 花括号保存对象: 使用{}定义json 格式        
	        * 方括号保存数组: []
	        * 代码:
          		  // 1. 定义json
	              var person = {"name": "张三", "age":18, "gender": true};
	
	              // 2. 嵌套格式  {}-->[]
	              var persons = {
	                  "persons": [
	                      {"name": "张三", "age": 18, "gender": true},
	                      {"name": "张三", "age": 18, "gender": true},
	                      {"name": "张三", "age": 18, "gender": true}
	                  ]
	              };
	
	              // 3. 嵌套格式
	              var ps = [
	                  {"name": "张三", "age": 18, "gender": true},
	                  {"name": "张三", "age": 18, "gender": true},
	                  {"name": "张三", "age": 18, "gender": true}
	              ];
      
      2. 获取数据:
           1. json对象.键名
           2. json对象["键名"]
           3. 数组对象[索引]
           4. 代码, 获取数据:
         		// 获取张三
      			var name = person.name;
      			var name = person["name"];
                                        
                // 获取王五
        		var name = persons.persons[2].name;
                                       
                // 获取李四
        		var name = ps[1].name;
           5. 代码, 遍历获取数据:
           		  // 获取person对象中所有的键和值
                  for(var key in person) {
                      // 这样的方式获取不行. 因为相当于 person."name"
                      // alert(key+ ":" +person.key);
                      alert(key + ": "+ person[key]);
                  }


                  // 获取ps中的所有值
                  for (var i = 0; i < ps.length; i++) {
                      var p = ps[i];

                      for(var key in p) {
                          alert(key + ": " + p[key]);
                      }

                  }
                                        
      
3. JSON数据和Java对象的相互转换
	  * JSON解析器:
       		* 创建的JSON解析器: Jsonlib, Gson, fastjson, jackson

	  1. JSON转为Java对象
      		1. 使用步骤:
               1. 导入jackson的相关jar包
               2. 创建jackson核心对象 ObjectMapper
               3. 调用ObjectMapper的相关方法进行转换
            		1. 转换方法:
						* readValue(json数据, Class):
						* 代码:
                            // JSON字符串, 转换为Java, Person对象

                            // 1. 定义Json字符串
                            String json = "{\"name\": \"张三\", \"age\": 23, \"gender\": \"男\"}";

                            // 2. 创建ObjectMapper对象
                            ObjectMapper om = new ObjectMapper();

                            // 3. 转换为Java对象 Person对象
                            Person person = om.readValue(json, Person.class);
                            System.out.println(person); // Person{name='张三', age=23, gender='男'}
												

      2. Java对象转换JSON
      		1. 使用步骤:
               1. 导入jackson的相关jar包
               2. 创建jackson核心对象 ObjectMapper
               3. 调用ObjectMapper的相关方法进行转换
               		1. 转换方法:
                        * writeValue(参数1, obj):
                             参数1:
                               File: 将obj对象转换为JSON字符串, 并保存到指定的文件中
                               Writer: 将obj对象转换为JSON字符串, 并将JSON数据填充到字符输出流中
                               OutputStream: 将obj对象转换为JSON字符串, 并将JSON数据填充到字节输出流中
                        * writeValueAsString(obj): 将对象转为json字符串
                               
                               
                    2. 代码:
                          // 1. 创建Person对象
                          Person p = new Person();
                          p.setName("张三");
                          p.setAge(23);
                          p.setGender("男");

                          // 2. 创建Jackson的核心对象    ObjectMapper
                          ObjectMapper om = new ObjectMapper();

						  String json = om.writeValueAsString(p);
        				  System.out.println(json); // {"name":"张三","age":23,"gender":"男"}
      		
						  // writeValue, 将数据写到/Users/xiaoge/Desktop/a.txt文件中
        				  om.writeValue(new File("/Users/xiaoge/Desktop/a.txt"), p);
						  // 桌面上多了一个a.txt内容为{"name":"张三","age":23,"gender":"男"}

        			      // writeValue, 将数据关联到Writer中
        				  om.writeValue(new FileWriter("/Users/xiaoge/Desktop/c.txt"), p);
													// 桌面上多了一个c.txt内容为{"name":"张三","age":23,"gender":"男"}


					3. 注解:
						  1. @JsonIgnore: 排除属性
                          2. @JsonFormat: 属性值得格式化
                            		@JsonFormat(pattern = "yyyy-MM-dd")  // 属性格式化
                          3. 代码, 定义类时, 在属性 或 方法上加注解:
								1. person类属性
									  private String name;
	                                  private Integer age;
	                                  private String gender;
	
	                                  // @JsonIgnore 忽略该属性, 把该对象实例, 转换为JSON时, 该属性忽略
	                                  @JsonFormat(pattern = "yyyy-MM-dd")  // 属性格式化
	                                  private Date birthday;
	
								2. 忽略属性 和 格式化属性, 转换的json值:
										Person p = new Person();
	                                    p.setName("张三");
	                                    p.setAge(23);
	                                    p.setGender("男");
	                                    p.setBirthday(new Date());
	
	
	                                    // 2. 转换
	                                    ObjectMapper om = new ObjectMapper();
	
	                                    String json = om.writeValueAsString(p);
	                                    System.out.println(json); 
										// 没加注解: {"name":"张三","age":23,"gender":"男","birthday":1581492798086}
	                                    
										// @JsonIgnore: {"name":"张三","age":23,"gender":"男"}                          
	
										// @JsonFormat: {"name":"张三","age":23,"gender":"男","birthday":"2020-02-12"}


						  4. 复杂java对象转换:
								1. List: 数组
                                  	* 代码:
																				// 1. 创建Person对象
                                        Person p1 = new Person();
                                        p1.setName("张三");
                                        p1.setAge(23);
                                        p1.setGender("男");
                                        p1.setBirthday(new Date());

                                        Person p2 = new Person();
                                        p2.setName("李四");
                                        p2.setAge(23);
                                        p2.setGender("男");
                                        p2.setBirthday(new Date());

                                        Person p3 = new Person();
                                        p3.setName("王五");
                                        p3.setAge(23);
                                        p3.setGender("男");
                                        p3.setBirthday(new Date());


                                        // 创建集合
                                        List<Person> ps = new ArrayList<Person>();
                                        ps.add(p1);
                                        ps.add(p2);
                                        ps.add(p3);

                                        // 2. 转换
                                        ObjectMapper om = new ObjectMapper();

                                        String json = om.writeValueAsString(ps);

                                        /*

                                            [
                                                {"name": "张三", "age": 23, "gender": "男", "birthday": "2020-02-12"},
                                                {"name": "李四", "age": 23, "gender": "男", "birthday": "2020-02-12"},
                                                {"name": "王五", "age": 23, "gender": "男", "birthday": "2020-02-12"},
                                            ]

                                         */
                                        System.out.println(json);
																				
                                2. Map: 对象格式一致
                                  	* 代码:
																				// 1. 创建集合
                                        Map<String, Object> map = new HashMap<String, Object>();
                                        map.put("name", "张三");
                                        map.put("age", 23);
                                        map.put("gender", "男");

                                        // 2. 转换
                                        ObjectMapper om = new ObjectMapper();

                                        String json = om.writeValueAsString(map);

                                        /*
                                            {"name": "张三", "age": 23, "gender": "男"}
                                         */
                                        System.out.println(json);

服务器响应的数据, 在客户端使用时, 要想当做json数据格式使用

1. $.get(type): 将最后一个参数type指定为"json"
2. $.post(type): 将最后一个参数type指定为"json"
3. $.ajax(dataType): 键dataType指定为"json"
4. JSON.parse(服务器返回的数据); 将服务器返回的数据转换成"json"
5. 在服务器端设置MIME类型: response.setContentType("application/json;charset=utf-8");