Web核心技术之Ajax异步请求(1)

//判断

if(this.responseText == “true”){

//用户名存在,显示提示信息

document.getElementById(“username_err”).style.display = ‘’;

}else {

//用户名不存在 ,清楚提示信息

document.getElementById(“username_err”).style.display = ‘none’;

}

综上所述,前端完成代码如下:

//1. 给用户名输入框绑定 失去焦点事件

document.getElementById(“username”).onblur = function () {

//2. 发送ajax请求

// 获取用户名的值

var username = this.value;

//2.1. 创建核心对象

var xhttp;

if (window.XMLHttpRequest) {

xhttp = new XMLHttpRequest();

} else {

// code for IE6, IE5

xhttp = new ActiveXObject(“Microsoft.XMLHTTP”);

}

//2.2. 发送请求

xhttp.open(“GET”, “http://localhost:8080/ajax-demo/selectUserServlet?username=”+username);

xhttp.send();

//2.3. 获取响应

xhttp.onreadystatechange = function() {

if (this.readyState == 4 && this.status == 200) {

//alert(this.responseText);

//判断

if(this.responseText == “true”){

//用户名存在,显示提示信息

document.getElementById(“username_err”).style.display = ‘’;

}else {

//用户名不存在 ,清楚提示信息

document.getElementById(“username_err”).style.display = ‘none’;

}

}

};

}

4,axios


Axios 对原生的AJAX进行封装,简化书写。

Axios官网是:https://www.axios-http.cn

4.1 基本使用

axios 使用是比较简单的,分为以下两步:

  • 引入 axios 的 js 文件
  • 使用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 可以获取到响应的数据。

4.2 快速入门

4.2.1 后端实现

定义一个用于接收请求的servlet,代码如下:

@WebServlet(“/axiosServlet”)

public class AxiosServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println(“get…”);

//1. 接收请求参数

String username = request.getParameter(“username”);

System.out.println(username);

//2. 响应数据

response.getWriter().write(“hello Axios~”);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println(“post…”);

this.doGet(request, response);

}

}

4.2.2 前端实现
  • 引入 js 文件
  • 发送 ajax 请求

  • get 请求

axios({

method:“get”,

url:“http://localhost:8080/ajax-demo/axiosServlet?username=zhangsan”

}).then(function (resp) {

alert(resp.data);

})

  • post 请求

axios({

method:“post”,

url:“http://localhost:8080/ajax-demo/axiosServlet”,

data:“username=zhangsan”

}).then(function (resp) {

alert(resp.data);

})

整体页面代码如下:

Title

4.3 请求方法别名

为了方便起见, 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);

})

5,JSON


5.1 概述

概念:JavaScript Object Notation。JavaScript 对象表示法.

如下是 JavaScript 对象的定义格式:

{

name:“zhangsan”,

age:23,

city:“北京”

}

接下来我们再看看 JSON 的格式:

{

“name”:“zhangsan”,

“age”:23,

“city”:“北京”

}

通过上面 js 对象格式和 json 格式进行对比,发现两个格式特别像。只不过 js 对象中的属性名可以使用引号(可以是单引号,也可以是双引号);而 json 格式中的键要求必须使用双引号括起来,这是 json 格式的规定。json 格式的数据有什么作用呢?

作用:由于其语法格式简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输。如下图所示就是服务端给浏览器响应的数据,这个数据比较简单,如果现需要将 JAVA 对象中封装的数据响应回给浏览器的话,应该以何种数据传输呢?

大家还记得 ajax 的概念吗? 是 异步的 JavaScript 和 xml。这里的 xml就是以前进行数据传递的方式,如下:

张三

23

北京

再看 json 描述以上数据的写法:

{

“name”:“张三”,

“age”:23,

“city”:“北京”

}

上面两种格式进行对比后就会发现 json 格式数据的简单,以及所占的字节数少等优点。

5.2 JSON 基础语法

5.2.1 定义格式

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

var 变量名 = ‘{“key”:value,“key”:value,…}’;

JSON 串的键要求必须使用双引号括起来,而值根据要表示的类型确定。value 的数据类型分为如下

  • 数字(整数或浮点数)

  • 字符串(使用双引号括起来)

  • 逻辑值(true或者false)

  • 数组(在方括号中)

  • 对象(在花括号中)

  • null

示例:

var jsonStr = ‘{“name”:“zhangsan”,“age”:23,“addr”:[“北京”,“上海”,“西安”]}’

5.2.2 代码演示

创建一个页面,在该页面的 <script> 标签中定义json字符串

Title

通过浏览器打开,页面效果如下图所示

现在我们需要获取到该 JSON 串中的 name 属性值,应该怎么处理呢?

如果它是一个 js 对象,我们就可以通过 js对象.属性名 的方式来获取数据。JS 提供了一个对象 JSON ,该对象有如下两个方法:

  • parse(str) :将 JSON串转换为 js 对象。使用方式是: var jsObject = JSON.parse(jsonStr);

  • stringify(obj) :将 js 对象转换为 JSON 串。使用方式是:var jsonStr = JSON.stringify(jsObject)

代码演示:

Title
5.2.3 发送异步请求携带参数

后面我们使用 axios 发送请求时,如果要携带复杂的数据时都会以 JSON 格式进行传递,如下

axios({

method:“post”,

url:“http://localhost:8080/ajax-demo/axiosServlet”,

data:“username=zhangsan”

}).then(function (resp) {

alert(resp.data);

})

请求参数不可能由我们自己拼接字符串吧?肯定不用,可以提前定义一个 js 对象,用来封装需要提交的参数,然后使用 JSON.stringify(js对象) 转换为 JSON 串,再将该 JSON 串作为 axiosdata 属性值进行请求参数的提交。如下:

var jsObject = {name:“张三”};

axios({

method:“post”,

url:“http://localhost:8080/ajax-demo/axiosServlet”,

data: JSON.stringify(jsObject)

}).then(function (resp) {

alert(resp.data);

})

axios 是一个很强大的工具。我们只需要将需要提交的参数封装成 js 对象,并将该 js 对象作为 axiosdata 属性值进行,它会自动将 js 对象转换为 JSON 串进行提交。如下:

var jsObject = {name:“张三”};

axios({

method:“post”,

url:“http://localhost:8080/ajax-demo/axiosServlet”,

data:jsObject //这里 axios 会将该js对象转换为 json 串的

}).then(function (resp) {

alert(resp.data);

})

注意:

  • js 提供的 JSON 对象我们只需要了解一下即可。因为 axios 会自动对 js 对象和 JSON 串进行想换转换。
  • 发送异步请求时,如果请求参数是 JSON 格式,那请求方式必须是 POST。因为 JSON 串需要放在请求体中。

5.3 JSON串和Java对象的相互转换

学习完 json 后,接下来聊聊 json 的作用。以后我们会以 json 格式的数据进行前后端交互。前端发送请求时,如果是复杂的数据就会以 json 提交给后端;而后端如果需要响应一些复杂的数据时,也需要以 json 格式将数据响应回给浏览器。

在后端我们就需要重点学习以下两部分操作:

  • 请求数据:JSON字符串转为Java对象

  • 响应数据:Java对象转为JSON字符串

接下来给大家介绍一套 API,可以实现上面两部分操作。这套 API 就是 jackson

5.3.1 Jackson 概述

Jackson 是一个 Java 的用来处理 JSON 格式数据的类库,性能非常好。

5.3.2 Jackson 使用

jaskson 使用也是比较简单的,分为以下四步完成

  1. 导入坐标

com.fasterxml.jackson.core

jackson-databind

2.9.1

  1. 创建ObjectMapper对象

bjectMapper mapper = new ObjectMapper();

  1. Java对象转JSON

String str = mapper.writeValueAsString(user);

将 Java 对象转换为 JSON 串,只需要使用 mapper 提供的writeValueAsString方法即可。

  1. JSON字符串转Java对象

User object = mapper.readValue(str, User.class);

将 json 转换为 Java 对象,只需要使用mapper 提供的readValue方法即可。

5.3.3 代码演示
  • 引入坐标

  • 创建一个类,专门用来测试 Java 对象和 JSON 串的相互转换,代码如下:

public class JacksonDemo {

public static void main(String[] args) {

//1 创建ObjectMapper对象

ObjectMapper mapper = new ObjectMapper();

User user = new User(1, “zhangsan”, “123”);

// 把对象转换成json

String str = mapper.writeValueAsString(user);

System.out.println(str);

// 字符串

String content = “{“id”:1,“username”:“zhangsan”,“password”:“123”}”;

User object = mapper.readValue(content, User.class);

System.out.println(object);

}

}

5.4 服务器获取json数据

学习完 json 后,接下来聊聊 json 的作用

  • 获取请求参数

由于前端提交的是 json 格式的数据,所以我们不能使用 request.getParameter() 方法获取请求参数。

通过获取数据流的方式来获取。

//中文请求乱码

request.setCharacterEncoding(“utf-8”);

// 1 获取数据流

BufferedReader br = request.getReader();

String json = br.readLine();

6,案例


6.1 需求

使用Axios + JSON 完成品牌列表数据查询和添加。页面效果还是下图所示:

6.2 查询所有功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4FKNF2p-1642766224444)(assets/image-20210831085332612.png)]

如上图所示就该功能的整体流程。前后端需以 JSON 格式进行数据的传递;由于此功能是查询所有的功能,前端发送 ajax 请求不需要携带参数,而后端响应数据需以如下格式的 json 数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BCts8EMk-1642766224445)(assets/image-20210831090839336.png)]

6.2.1 环境准备

02-AJAX\04-资料\3. 品牌列表案例\初始工程 下的 brand-demo 工程拷贝到我们自己 工作空间 ,然后再将项目导入到我们自己的 Idea 中。工程目录结构如下:

注意:

  • 在给定的原始工程中已经给定一些代码。而在此案例中我们只关注前后端交互代码实现

  • 要根据自己的数据库环境去修改连接数据库的信息,在 mybatis-config.xml 核心配置文件中修改

6.2.2 后端实现

com.ligong.web 包下创建名为 SelectAllServletservlet,具体的逻辑如下:

  • 调用 service 的 selectAll() 方法进行查询所有的逻辑处理

  • 将查询到的集合数据转换为 json 数据。我们将此过程称为 序列化;如果是将 json 数据转换为 Java 对象,我们称之为 反序列化

  • 将 json 数据响应回给浏览器。这里一定要设置响应数据的类型及字符集 response.setContentType("text/json;charset=utf-8");

SelectAllServlet 代码如下:

@WebServlet(“/selectAllServlet”)

public class SelectAllServlet extends HttpServlet {

private BrandService brandService = new BrandService();

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 调用Service查询

List brands = brandService.selectAll();

//2 把集合转换成json

ObjectMapper mapper = new ObjectMapper();

String json = mapper.writeValueAsString(brands);

//3. 响应数据 application/json text/json

response.setContentType(“text/json;charset=utf-8”);

response.getWriter().write(jsonString);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

6.2.3 前端实现
  1. 引入 js 文件

brand.html 页面引入 axios 的 js 文件

  1. 绑定 页面加载完毕 事件

brand.html 页面绑定加载完毕事件,该事件是在页面加载完毕后被触发,代码如下

window.onload = function() {

}

  1. 发送异步请求

在页面加载完毕事件绑定的匿名函数中发送异步请求,代码如下:

//2. 发送ajax请求

axios({

method:“get”,

url:“http://localhost:8080/brand-demo/selectAllServlet”

}).then(resp => {

});

  1. 处理响应数据

then 中的回调函数中通过 resp.data 可以获取响应回来的数据,而数据格式如下

现在我们需要拼接字符串,将下面表格中的所有的 tr 拼接到一个字符串中,然后使用 document.getElementById("brandTable").innerHTML = 拼接好的字符串 就可以动态的展示出用户想看到的数据

而表头行是固定的,所以先定义初始值是表头行数据的字符串,如下

//获取数据

let brands = resp.data;

let tableData = " \n" +

" 序号\n" +

" 品牌名称\n" +

" 企业名称\n" +

" 排序\n" +

" 品牌介绍\n" +

" 状态\n" +

" 操作\n" +

" ";

接下来遍历响应回来的数据 brands ,拿到每一条品牌数据

for (let i = 0; i < brands.length ; i++) {

let brand = brands[i];

}

紧接着就是从 brand 对象中获取数据并且拼接 数据行,累加到 tableData 字符串变量中

tableData += “\n” +

" <tr align=“center”>\n" +

" “+(i+1)+”\n" +

" “+brand.brandName+”\n" +

" “+brand.companyName+”\n" +

" “+brand.ordered+”\n" +

" “+brand.description+”\n" +

" “+brand.status+”\n" +

“\n” +

" <a href=“#”>修改 <a href=“#”>删除\n" +

" ";

最后再将拼接好的字符串写到表格中

// 设置表格数据

document.getElementById(“brandTable”).innerHTML = tableData;

整体页面代码如下:

Title



6.3 添加品牌功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxK5vGUa-1642766224445)(assets/image-20210831100117014.png)]

如上所示,当我们点击 新增 按钮,会跳转到 addBrand.html 页面。在 addBrand.html 页面输入数据后点击 提交 按钮,就会将数据提交到后端,而后端将数据保存到数据库中。

具体的前后端交互的流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-puSpDdAk-1642766224446)(assets/image-20210831100329698.png)]

说明:

前端需要将用户输入的数据提交到后端,这部分数据需要以 json 格式进行提交,数据格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f5v53iZj-1642766224446)(assets/image-20210831101234467.png)]

6.3.1 后端实现

com.ligong.web 包下创建名为 AddServletservlet,具体的逻辑如下:

  • 获取请求参数

由于前端提交的是 json 格式的数据,所以我们不能使用 request.getParameter() 方法获取请求参数

  • 如果提交的数据格式是 username=zhangsan&age=23 ,后端就可以使用 request.getParameter() 方法获取

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

  • 将获取到的请求参数(json格式的数据)转换为 Brand 对象

  • 调用 service 的 add() 方法进行添加数据的逻辑处理

  • 将 json 数据响应回给浏览器。

AddServlet 代码如下:

@WebServlet(“/addServlet”)

public class AddServlet extends HttpServlet {

private BrandService brandService = new BrandService();

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 接收数据,request.getParameter 不能接收json的数据

/* String brandName = request.getParameter(“brandName”);

System.out.println(brandName);*/

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
42766224446)(assets/image-20210831101234467.png)]](https://img-blog.csdnimg.cn/900fe006569f4d4494f6bfe202dd1495.png)

6.3.1 后端实现

com.ligong.web 包下创建名为 AddServletservlet,具体的逻辑如下:

  • 获取请求参数

由于前端提交的是 json 格式的数据,所以我们不能使用 request.getParameter() 方法获取请求参数

  • 如果提交的数据格式是 username=zhangsan&age=23 ,后端就可以使用 request.getParameter() 方法获取

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

  • 将获取到的请求参数(json格式的数据)转换为 Brand 对象

  • 调用 service 的 add() 方法进行添加数据的逻辑处理

  • 将 json 数据响应回给浏览器。

AddServlet 代码如下:

@WebServlet(“/addServlet”)

public class AddServlet extends HttpServlet {

private BrandService brandService = new BrandService();

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 接收数据,request.getParameter 不能接收json的数据

/* String brandName = request.getParameter(“brandName”);

System.out.println(brandName);*/

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-9aRj0Rz0-1715714682644)]

[外链图片转存中…(img-ODch8afv-1715714682645)]

[外链图片转存中…(img-iML8T9A6-1715714682645)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值