1 VUE的生命周期
VUE中有一整套完整的VUE对象创建/使用/销毁的流程. 如果用户需要在某个特定的点 有特殊的需求,可以对VUE对象进行扩展!(销毁需要手动销毁)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试vue生命周期函数</title>
</head>
<body>
<!-- 知识梳理:
1.生命周期函数的方法名称 必须固定.
2.生命周期函数是VUE对象特有的函数.应该放到根目录下.
3.当页面渲染成功之后, 一共执行了4个生命周期方法.
第一类: VUE对象的创建.
beforeCreate:对象创建前调用
created: VUE对象已经创建完成之后调用
第二类: VUE对象的挂载(渲染)
beforeMount: el : "#app",VUE对象在找到@APP标签之前先执行该函数.
mounted: 当挂载完成(渲染完成),用户可以看到页面数据之后调用该函数
4. 用户修改阶段:
第三类:
beforeUpdate: 当用户修改数据 点击"回车" 之后调用该函数
过渡: 数据已经被修改
updated: 数据已经被修改之后调用该函数
5. 销毁阶段:
销毁函数,VUE对象默认不会调用. 可以通过函数由用户调用
beforeDestroy: 在销毁方法执行前
destroyed: 标志着VUE对象已经销毁.
-->
<div id="app">
<h3 v-text="msg"></h3>
<button @click="destroy">销毁</button>
</div>
<!--引入js函数类库 -->
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el : "#app",
data : {
msg: "vue生命周期"
},
methods:{
},
//在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
beforeCreate(){
console.log("beforeCreate")
},
//在实例创建完成后被立即调用
created(){
console.log("created")
},
//在挂载开始之前被调用:相关的 render 函数首次被调用。
beforeMount(){
console.log("beforeMount")
},
//实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了。
mounted(){
console.log("mounted")
},
//数据更新时调用,发生在虚拟 DOM 打补丁之前
beforeUpdate(){
console.log("beforeUpdate")
},
//由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
updated(){
console.log("updated")
},
//实例销毁之前调用。在这一步,实例仍然完全可用
beforeDestroy(){
console.log("beforeDestroy")
},
//实例销毁后调用。
destroyed(){
console.log("destroyed")
},
methods:{
destroy(){
this.$destroy()
}
}
})
</script>
</body>
</html>
2 VUE 前后端调用
2.1 前后端调用流程
3 Ajax
3.1 Ajax介绍
Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。 [3] 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。 [3]
特点:
局部刷新,异步访问
3.2 Ajax异步原理
请求同步 : 用户向服务器发起请求,如果服务器正忙,这时程序处于等待的状态.这时页面处于加载 ,同时用户不能操作.
异步调用的原理:
步骤:
1. 用户发起Ajax请求, Ajax内部机制,将请求交给Ajax引擎处理.
2. Ajax引擎接收到用户的请求之后,重写发起一个新的请求.访问后端服务器.
3. 当服务器端接收到了 Ajax请求之后,完成业务处理.之后将数据响应给Ajax引擎.
4. Ajax引擎通过事先约定好的 回调函数, 将服务器数据 交还给用户.
5.用户在请求的过程中,可以完成自己的任务.
注意事项: 多个Ajax的请求 不关注顺序.
3.3 Axios 入门案例
1 导入axios.js函数库
2 发起Ajax请求,之后业务处理
3 .then(回调函数,接受服务器相应的信息)
4 promise : params是添加到url的请求字符串中的,用于get请求。params是返回来的值
params.data获得里面的属性
而data是添加到请求体(body)中的, 用于post请求。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Axios入门案例</title>
</head>
<body>
<!-- 使用步骤:
1 导入JS函数库
2 发起Ajax请求,之后业务处理
-->
<!-- 案例一:利用axios获取后台用户列表-->
<!-- url:http://localhost:8080/findAll-->
<!--
axios 请求方式
1 请求类型:
1.get 执行查询业务
2.post 执行form表单提交(登录、新增)
3.put 执行修改操作
4.delete 执行删除业务时
2 axios语法
axios.get("url地址信息","参数信息")
.then(function(args){//回调函数 接受服务器相应信息
})
-->
<script src="../js/axios.js"></script>
<script>
axios.get("http://localhost:8080/findAll")
.then(function(promise){
console.log(promise.data);
})
/*
js为了简化用户调用方法提高了箭头函数学法 function 可以简介
*/
/* axios.get("http://localhost:8080/findAll")
.then(promise => {
console.log(promise.data);
}) */
/* 带参数的get请求 */
</script>
</body>
</html>
3.4 Axios 前后端调用
@CrossOrigin: 在controller上使用:跨域:允许Ajax访问后端
3.4.1 后端准备
1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jt</groupId>
<artifactId>springboot_demo4</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>
<!--历史: SSM 需要手动的编辑大量的配置信息
SpringBoot 使用体系了 "开箱即用" 的思想
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<!--Spring的启动器,相当于之前大量的配置文件 在内部已经将整合的配置写好了,实现拿来即用-->
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<!--spring整合mybatis-plus 删除mybatis的包-->
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<!--插件:
springboot项目:在打包部署发布时,需要依赖maven 工具API
如果不添加该插件,则直接影响项目的发布
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.pojo层(User类)
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
//1 将对象与表进行关联
//规则:如果表名与对象名一致时,名称可以省略
// 如果字段名与属性名一致,则注解可以省略
//序列化接口的作用:保证对象网络传输的有效性 网络传输(不同的服务器之间传递同一个对象)
//对象与表关联
@TableName("demo_user")
public class User implements Serializable {//序列化
@TableId(type = IdType.AUTO) //table + 主键 //主键自增/非空/UUID /生成唯一编号
private Integer id;
@TableField("name")//标识属性与字段的映射
private String name;
@TableField("age")
private Integer age;
@TableField("sex")
private String sex;
}
3 AxiosController (控制层)
package com.jt.controller;
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@CrossOrigin
@RequestMapping("/axios")
public class AxiosController {
@Autowired
private UserService userService;
@RequestMapping("/getUserByid")
public User getUserByid(Integer id){
return userService.findUserById(id);
}
@GetMapping("user/{sex}/{age}")
public List<User> getUserBySA(User user){
return userService.findUserBySA(user);
}
@GetMapping("getUser")
public List<User> getUser(User user){
return userService.getUser(user);
}
}
4.1 UserService(业务层)
package com.jt.service;
import com.jt.pojo.User;
import java.util.List;
public interface UserService {
List<User> findAll();
User findUserById(Integer id);
List<User> findUserByname(User user);
List<User> findUserByNA(User user);
List<User> findUserByIds(Integer[] ids);
void updataId(User user);
void insert1(User user);
User getUserByid(Integer id);
List<User> findUserBySA(User user);
List<User> getUser(User user);
}
4.2 UserServiceImpl
package com.jt.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.sun.corba.se.spi.orbutil.threadpool.WorkQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
//查询所有的where条件,所有参数为空 QueryWrapper 只有有where条件才使用
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
@Override
public User findUserById(Integer id) {
return userMapper.selectById(id);
}
//MP 可以根据对象中不为null的属性拼接where条件
@Override
public List<User> findUserByname(User user) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> user1 = userMapper.selectList(queryWrapper);
return user1;
}
/*
*规则:字段与属性的逻辑运算发为 “=” 时,使用(user) 对象封装
* name = “貂蝉” age > 10 岁的用户
* */
@Override
public List<User> findUserByNA(User user) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", user.getName()).gt("age", user.getAge());
return userMapper.selectList(queryWrapper);
}
/*
*规则:如何参数使用,分割,则SpringMVC可以自动的转化为数组
*
*查询多个用户
* url:http://localhost:8080/getUserByIds?ids=1,3,4,5
* */
@Override
public List<User> findUserByIds(Integer[] ids) {
List<Integer> list = Arrays.asList(ids);
List<User> users = userMapper.selectBatchIds(list);
return users;
}
@Override
public void updataId(User user) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", user.getId());
userMapper.update(user, queryWrapper);
}
@Override
public void insert1(User user) {
userMapper.insert(user);
System.out.println("插入成功");
}
@Override
public User getUserByid(Integer id) {
return userMapper.selectById(id);
}
@Override
public List<User> findUserBySA(User user) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex", user.getSex()).gt("age", user.getAge());
return userMapper.selectList(queryWrapper);
}
@Override
public List<User> getUser(User user) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
return userMapper.selectList(queryWrapper);
}
}
5 启动类
package com.jt;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.CrossOrigin;
@SpringBootApplication
@MapperScan("com.jt.mapper")
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
6 前端:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>前后端调用</title>
</head>
<body>
<h1>前后端调用</h1>
<script src="../js/axios.js"></script>
<script type="text/javascript">
/* 需求1 查询id=1的用户
方式1:
url: http://localhost:8080/axios/getUserByid?id=1
*/
let url1 = "http://localhost:8080/axios/getUserByid?id=1"
axios.get(url1).then(
promise =>{
console.log(promise.data);
}
)
/* 需求2
Get方式2 :利用restFul 查询数据
需求 查询sex = 女 age>18
*/
let sex2 = "女"
let age2 = 18
/* let url2 = "http://localhost:8080/axios/User/"+sex2+"/"+age2""
*/
let url3 = `http://localhost:8080/axios/user/${sex2}/${age2}`
axios.get(url3).then(
promise=>{
console.log(promise.data)
}
)
/*
需求3 查询 name="王昭君" sex="女" age=19
以对象的方式传参
参数语法:
数据结构:{}
关键字key(固定写法):params
varlue:用户需要传递的值
*/
let user = {
name : "王昭君",
sex : '女',
age : 19
}
let url4 = "http://localhost:8080/axios/getUser"
axios.get(url4,{params : user}).then(
promise =>{
console.log(promise.data)
}
)
</script>
</body>
</html>
注意 : 使用restFul查询数据时:
let url2 = "http://localhost:8080/axios/User/"+sex2+"/"+age2""
let url3 = `http://localhost:8080/axios/user/${sex2}/${age2}` //url用反单引号`括住,数据使用${属性}
使用创建对象的方式:
axios.get(url4,{params : user}).then(
promise =>{
console.log(promise.data)
}
)
axios.get(url,{params : 对象})//axios.get中有两个参数一个url,一个{params : 对象}