文章目录
- 概要
- 整体架构流程
- 技术名词解释
- 技术细节
- 小结
概要
Axios 是什么?
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
特性
- 从浏览器创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF
安装
使用 npm:
$ npm install axios
使用 bower:
$ bower install axios
使用 yarn:
$ yarn add axios
使用 jsDelivr CDN:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
使用 unpkg CDN:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
导包
我这里使用的vue中的cdn:
axios可以请求的方法:
- get:获取数据,请求指定的信息,返回实体对象
- post:向指定资源提交数据(例如表单提交或文件上传)
- put:更新数据,从客户端向服务器传送的数据取代指定的文档的内容
- patch:更新数据,是对put方法的补充,用来对已知资源进行局部更新
- delete:请求服务器删除指定的数据
整体架构流程
要写一个前端页面和一个后端页面。完成前后端分离
前端:
1.get请求
new Vue({
el:"#app",
data:{
deptList:[]
},
methods:{
showDept(){
axios.get('http://localhost:8080/deptC').then((resp)=>{
console.log(resp,resp.data)
this.deptList=resp.data
})
}
}
})
后端:
1.创建servlet
package com.hp.controller;
import com.hp.pojo.Dept;
import com.hp.service.IDeptService;
import com.hp.service.impl.DeptServiceImpl;
import com.hp.utils.JsonUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
//每一个类,继承HttpServlet,该类就是一个servlet,每一个servlet都有一个访问路径
@WebServlet("/deptC")
public class DeptC extends HttpServlet {
//引入service层
private IDeptService deptService=new DeptServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("测试访问deget...");
List<Dept> list = deptService.list();
System.out.println(list);
//数据转化成json格式,再响应给浏览器
JsonUtil.transJson(list,resp);
}
}
2.在web中新建一个.html的文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/vue/vue.min.js"></script>
<script src="/vue/axios.min.js"></script>
</head>
<body>
<div id="app">
<button @click="showDept">点击显示数据</button>
<table border="1" cellpadding="20" cellspacing="0">
<tr>
<th>序号</th>
<th>部门名称</th>
<th>部门位置</th>
<th>部门领导</th>
</tr>
<tr v-for="dept in deptList">
<td>{{dept.did}}</td>
<td>{{dept.dname}}</td>
<td>{{dept.dlocation}}</td>
<td>{{dept.leader}}</td>
</tr>
</table>
</div>
</body>
<script>
new Vue({
el:"#app",
data:{
deptList:[]
},
methods:{
showDept(){
axios.get('http://localhost:8080/deptC').then((resp)=>{
console.log(resp,resp.data)
this.deptList=resp.data
})
}
}
})
</script>
</html>
技术名词解释
1.什么是Ajax
说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分消耗网络资源。而我们只是需要修改页面的部分数据,也希望不刷新页面,因此异步网络请求就应运而生。
Ajax(Asynchronous JavaScript and XML):
- 异步网络请求。
- Ajax能够让页面无刷新的请求数据。
实现ajax的方式有多种,如jQuery封装的ajax,原生的XMLHttpRequest,以及axios。但各种方式都有利弊:
- 原生的XMLHttpRequest的配置和调用方式都很繁琐,实现异步请求十分麻烦
- jQuery的ajax相对于原生的ajax是非常好用的,但是没有必要因为要用ajax异步网络请求而引用jQuery框架
技术细节
上述代码servlet中的核心API
List<Dept> list = deptService.list();
完整代码如下:
//查询多行多列
public static <T> List<T> list(String sql,Class<T> c,Object ...params) {
//创建一个集合,存放所有对象
List<T> tList = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/salary?characterEncoding=utf-8", "root", "root");
PreparedStatement preState = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
//statement执行sql,返回结果集
ResultSet rs = preState.executeQuery();
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//解析rs(循环打印)
while (rs.next()) {//读取结果集的光标向下移动,光标默认在哪一行,列名所在的那一行
//根据每一行的数据,封装成一个实体对象
T t = c.newInstance();
//1.取出某一行的每一列数据,封装到对象t的属性中
for (int i = 1; i <= columnCount; i++) {
//通过列的序号,获取每一列的值
Object value = rs.getObject(i);
if (value!=null){
//通过列的序号,获取每一列的列名
String columnName = md.getColumnName(i);
//因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
Field f = c.getDeclaredField(columnName);
//赋予私有属性的赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t,value);//理解为:把value赋值给对象t的columnName属性,相当于set方法
}
}
//把对象存入集合中
tList.add(t);
}
//关闭资源
preState.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
代码功能:
上述代码可以查询到表里的所有数据,之前的深入解析prepareStatement方法文章中提到过,如何查询一个表中的多行多列数据,今天也是把之前的内容进行了补充,添加了新的知识点axios在vue中很常用,是连接前后端的重要步骤,上次的小作业是通过增删改查在前端的实际应用,后续功能还需要补全,可以对表中的数据进行修改,添加,达到前端修改数据,后端的数据库数据同样更新。有兴趣的小伙伴可以尝试着自己写一下,很有挑战性。
小结
这节课我们学习了Axios的基本用法,我这里只运用到了get请求,实际过程中会有不同的用法,在上述的实例中我们也能看到Axios的具体特性有自动转换JSON数据和响应数据,以及在浏览器中创建 XMLHttpRequests,帮助我们建立前后端之间的联系。明天我会讲解如何在后台响应图片数据,前端传递参数,后端接收参数。还有vue的自动加载函数,帮助我们完成美女后宫的建造,做到真正的后宫佳丽三千。