ajax-js实现

概念

AJAX(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML

作用

1、与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据

   Servlet调用完业务逻辑层后将数据存储到域对象中,然后跳转到指定的jsp页面,在页面上使用EL表达式和JSTL标签库进行数据的展示。

   使用了AJAX和服务器进行通信,就可以使用 HTML+AJAX来替换JSP页面了.

2、异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验,等等

同步和异步

快速入门

服务端实现

1. 编写AjaxServlet,并使用response输出字符串
  在项目的创建 com.test.web.servlet,并在该包下创建名为 AjaxServlet的servlet

 1 @WebServlet("/ajaxServlet")
 2 public class AjaxServlet extends HttpServlet {
 3     @Override
 4     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 5         //1. 响应数据
 6         response.getWriter().write("hello ajax~");
 7     }
 8     @Override
 9     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
10         this.doGet(request, response);
11     }
12 }

客户端实现

在webapp下创建名为01-ajax-demo1.html的页面,在该页面书写ajax代码
2.创建 XMLHttpRequest 对象:用于和服务器交换数据

1 var xhttp;
2 if (window.XMLHttpRequest) {
3     xhttp = new XMLHttpRequest();
4 } else {
5     // code for IE6, IE5
6     xhttp = new ActiveXObject("Microsoft.XMLHTTP");
7 }

3. 向服务器发送请求

1 //建立连接
2 xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
3 //发送请求
4 xhttp.send();

4. 获取服务器响应数据

1 xhttp.onreadystatechange = function() {
2     if (this.readyState == 4 && this.status == 200) {
3         // 通过 this.responseText 可以获取到服务端响应的数据
4         alert(this.responseText);
5     }
6 };

完整代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 <script>
10     //1. 创建核心对象
11     var xhttp;
12     if (window.XMLHttpRequest) {
13         xhttp = new XMLHttpRequest();
14     } else {
15         // code for IE6, IE5
16         xhttp = new ActiveXObject("Microsoft.XMLHTTP");
17     }
18     //2. 发送请求
19     xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
20     xhttp.send();
21 
22     //3. 获取响应
23     xhttp.onreadystatechange = function() {
24         if (this.readyState == 4 && this.status == 200) {
25             alert(this.responseText);
26         }
27     };
28 </script>
29 </body>
30 </html>

ajax的状态码(readyState)

0 表示XMLHttpRequest已建立,但还未初始化,这时尚未调用open方法
1 表示open方法已经调用,但未调用send方法(已创建,未发送)
2 表示send方法已经调用,其他数据未知
3 表示请求已经成功发送,正在接受数据
4 表示数据已经成功接收。

响应状态码(status)

200:请求成功
404:请求资源未找到
500:内部服务器错误

 ajax的异步和同步

ajax.open(method,urL,async)
  async:设置同步代码执行还是异步代码执行
  true代表异步,默认是异步
  false代表同步

例:ajax.open("get","ajax",true);

ajax的基本流程

1)创建ajax引擎对象
2)复写onreadystatement函数
3)判断ajax状态码
4)判断响应状态码
5)获取响应内容(响应内容的格式)
  普通字符串:responseText
  json(重点):responseText
    其实就是将数据按照json的格式拼接好的字符串,方便使用eval方法
    将接收的字符串数据直接转换为js的对象
    json格式:
      var 对象名={
        属性名:属性值,
        属性名:属性值,
        ……
      }
  XML数据:responseXML.返回document对象
    通过document对象将数据从xml中获取出来
6)处理响应内容(js操作文档结构)
7)发送请求
  get请求
    get的请求实体拼接在URL后面,?隔开,键值对
    ajax.open("get","url");
    ajax.send(null);
  post请求
    有单独的请求实体
    ajax.open("post", "url");
    ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    ajax.send("name=张三&pwd=123");

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<!-- 声明js代码域 -->
<script type="text/javascript">
    function getData(){        
        //创建ajax引擎对象
            var ajax;
            if(window.XMLHttpRequest){//火狐
                ajax=new XMLHttpRequest();
            }else if(window.ActiveXObject){//IE
                ajax=new ActiveXObject("Msxml2.XMLHTTP");
            }
        
            //复写onreadystatement函数
            ajax.onreadystatechange=function(){
                //判断Ajax状态吗
                if(ajax.readyState==4){
                    //判断响应状态吗
                    if(ajax.status==200){
                        //获取响应内容
                        var result=ajax.responseText;
                        //处理响应内容
                            //获取元素对象
                            var showdiv=document.getElementById("showdiv");
                            showdiv.innerHTML=result;
                    }else if(ajax.status==404){
                        //获取元素对象
                        var showdiv=document.getElementById("showdiv");
                        showdiv.innerHTML="请求资源不存在";
                    }else if(ajax.status==500){
                        //获取元素对象
                        var showdiv=document.getElementById("showdiv");
                        showdiv.innerHTML="服务器繁忙";
                    }
                }else{
                    //获取元素对象
                    var showdiv=document.getElementById("showdiv");
                    showdiv.innerHTML="<img src='img/2.gif' width='200px' height='100px'/>";
                }
            }
        //发送请求
        //get方式:请求实体拼接在URL后面
            ajax.open("get","ajax?"+data);
            ajax.send(null);
        //post方式:请求实体需要单独的发送
            ajax.open("post", "ajax");
            ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            ajax.send("name=张三&pwd=123");
    }
</script>
<style type="text/css">
    #showdiv{
        border:solid 1px;
        width:200px;
        height:100px; 
    }
</style>
</head>
<body>
    <h3>欢迎登录403峡谷</h3>
    <hr>
    <input type="button" value="测试 " onclick="getData()"/>
    <div id="showdiv"></div>
</body>
</html>

Axios 异步框架

Axios 对原生的AJAX进行封装,简化书写
官网:https://www.axios-http.cn

Axios 快速入门

1. 引入 axios 的 js 文件

<script src="js/axios-0.18.0.js"></script>

2. 使用axios 发送请求,并获取响应结果
发送get请求

axios({
    method:"get",
    url:"http://localhost:8080/ajax-demo1/aJAXDemo1?username=zhangsan"
}).then(function (resp){
    alert(resp.data);
})

发送 post 请求

axios({
    method:"post",
    url:"http://localhost:8080/ajax-demo1/aJAXDemo1",
    data:"username=zhangsan"
}).then(function (resp){
    alert(resp.data);
});

axios() 是用来发送异步请求的,小括号中使用 js 对象传递请求相关的参数:
  method属性:用来设置请求方式的。取值为get或者post。
  url属性:用来书写请求的资源路径。如果是get请求,需要将请求参数拼接到路径的后面,格式为: url?参数名=参数值&参数名2=参数值2。
  data属性:作为请求体被发送的数据。也就是说如果是post请求的话,数据需要作为data属性的值。
then() 需要传递一个匿名函数。我们将then()中传递的匿名函数称为回调函数,意思是该匿名函数在发送请求时不会被调用,而是在成功响应后调用的函数。而该回调函数中的resp参数是对响应的数据进行封装的对象,通过resp.data可以获取到响应的数据。

请求方法别名

为了方便起见,Axios已经为所有支持的请求方法提供了别名。如下:
get请求:axios.get(url[,config])
delete请求:axios.delete(url[,config])
head请求:axios.head(url[,config])
options请求:axios.option(url[,config])
post请求:axios.post(url[,data[,config])
put请求:axios.put(url[,data[,config])
patch请求:axios.patch(url[,data[,config])

而我们只关注get请求和post请求:
发送 get请求:

axios.get("http://localhost:8080/ajax-demo/axiosServlet?username=zhangsan").then(function (resp) {
    alert(resp.data);
});

发送 post请求:

axios.post("http://localhost:8080/ajax-demo/axiosServlet","username=zhangsan").then(function (resp) {
    alert(resp.data);
})

JSON

概念:JavaScript Object Notation。JavaScript 对象表示法。
由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输。

{
    "name":"zhangsan",
    "age":23,
    "city":"北京"
}

 JSON 基础语法

 JSON本质就是一个字符串,但是该字符串内容是有一定的格式要求的。定义格式如下:

var 变量名 = '{"key":value,"key":value,...}';

value 的数据类型为:
  数字(整数或浮点数)
  字符串(在双引号中)
  逻辑值(true 或 false)
  数组(在方括号中)
  对象(在花括号中)
  null
例:var jsonStr = '{"name":"zhangsan","age":23,"addr":["北京","上海","西安"]}';

JSON字符串转为JS对象:
  var jsObject = JSON.parse(jsonStr);
JSON字符串转为JS对象:
  var jsonStr2 = JSON.stringify(jsObject);
注:
  Axios中,JSON字符串和JS对象自动进行转换,以上方法作为了解。
  发送异步请求时,如果请求参数是JSON格式,那请求方式必须是POST。因为JSON串需要放在请求体中。

JSON 数据和Java对象转换

Fastjson 概述

Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON字符串的相互转换。

Fastjson 使用

1. 导入坐标

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

2. Java对象转JSON

String jsonStr = JSON.toJSONString(obj);

3. JSON字符串转Java对象

User user = JSON.parseObject(jsonStr, User.class);

代码:

 1 public class FastJsonDemo {
 2     public static void main(String[] args) {
 3         //1. 将Java对象转为JSON字符串
 4         User user = new User();
 5         user.setId(1);
 6         user.setUsername("zhangsan");
 7         user.setPassword("123");
 8         String jsonString = JSON.toJSONString(user);
 9         System.out.println(jsonString);//{"id":1,"password":"123","username":"zhangsan"}
10         //2. 将JSON字符串转为Java对象
11         User u = JSON.parseObject("{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);
12         System.out.println(u);
13     }
14 }

附加

前端提交的数据格式是json,后端需要通过request 对象获取输入流,再通过输入流读取数据

 1 @WebServlet("/addServlet")
 2 public class AddServlet extends HttpServlet {
 3     private BrandService brandService = new BrandService();
 4     @Override
 5     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 6 
 7         //1. 接收数据,request.getParameter 不能接收json的数据
 8        /* String brandName = request.getParameter("brandName");
 9         System.out.println(brandName);*/
10 
11         // 获取请求体数据
12         BufferedReader br = request.getReader();
13         String params = br.readLine();
14         // 将JSON字符串转为Java对象
15         Brand brand = JSON.parseObject(params, Brand.class);
16         //2. 调用service 添加
17         brandService.add(brand);
18         //3. 响应成功标识
19         response.getWriter().write("success");
20     }
21     @Override
22     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23         this.doGet(request, response);
24     }
25 }
posted @ 2020-03-28 15:58  溯鸣  阅读(750)  评论(0编辑  收藏  举报