java Web学习笔记(二)
乐正龙牙lox 2024-07-18 14:03:01 阅读 91
文章目录
1. 前置知识2. Ajax同步交互和异步交互Ajax的实现方式手写一个简单的Ajax请求响应过程
3. 前端工程化4. ES6 (为了vue3框架,你要卷它)let和constlet与const和var的区别解构表达式箭头函数reset和spread类和对象对象的拷贝js文件对象导出分别导出统一导出默认导出
5. 前端工程化软件安装nodejs安装npm安装配置阿里npm镜像源配置前端依赖目录
npm常见命令
1. 前置知识
前置知识
2. Ajax
概述:通过JS代码来控制请求的收发。
同步交互和异步交互
同步交互:
单线程作业,客户端发送请求前服务端需要等待,服务端处理请求时客户端等待。
异步交互:
多线程作业,客户端可以发送复数的请求等待服务端响应。服务端响应请求后客户端再一一跳转请求。
Ajax的实现方式
通过js手写代码实现通过第三方工具,重写或者直接使用第三方工具使用框架直接实现(eg. VUE 的 axios【暂时不懂】)
手写一个简单的Ajax请求响应过程
前端代码
<code><!DOCTYPE html>
<html lang="en">code>
<head>
<meta charset="UTF-8">code>
<title>Title</title>
<script>
function getMessage(){
var request = new XMLHttpRequest()
request.onreadystatechange=function (){
if(request.readyState == 4 && request.status == 200){
console.log(request.responseText)// 获取并打印响应信息
var inputEle = document.getElementById("message")
inputEle.value = request.response
window.location.href="https://baidu.com"code>
}
}
request.open("GET","/hello?username=zhangsan")
request.send()
}
</script>
</head>
<body>
<button onclick="getMessage()">点我</button>code>
<input type="text" id="message"/>code>
</body>
</html>
后端代码
package com.itchen.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
resp.getWriter().write("hello:" + username);
}
}
3. 前端工程化
前后端使用不同的框架十分不好管理!
前端文件管理:使用nodejs、npm、vite
后端文件管理:使用maven
引入前后端分离
前端-前端工程化:将前端独立,形成一个独立的工程
分析前后端分离项目
(前后端)开发分离(前后端)部署分离
4. ES6 (为了vue3框架,你要卷它)
let和const
let与const和var的区别
let不能重复声明
var i = 10
var i = ''
let cn = 123
// let cn = 'dw' // 报错
let有作用域
{
var i = 10
let j = 10
}
console.log(i)
// console.log(j) // 报错
let不会预解析进行变量提升
console.log(a)
var a = 'd'
// console.log(b) // 报错
let b = "dwadwa"
let定义的全局变量不会作为window属性
var ss = 123456
let sss = 121311
console.log(window.ss)
console.log(window.sss)
注意:const就是不可修改的let
const teachers = ["章老师","李老师","王老师"]
// teachers = ["","",""] // 报错
teachers.push("陈老师")
模板字符串:解决换行和字符串拼接问题(类似java中的文本块)
let city = '北京'
let str = `<ul->
<li></li>
<li></li>
<li>${ city}</li>
<li></li>
<li></li>
</ul->`
解构表达式
使用解构表达式取出数组中的元素
// 使用解构表达式取出数组中的元素
let arr = [11,22,33,44]
let = [a,b,c,d,e = 10] = arr
console.log(a,b,c,d,e)
使用解构表达式获取对象的属性值(按照同名参数的变量赋值)
let person = {
name:"zhangsan",
age:10
}
let { name,age} = person
console.log(name,age)
解构表达式应用在方法的参数列表
function showArr([a,b,c]){
console.log(a,b,c)
}
showArr(arr)
箭头函数
let fun1 = function(){ } // 普通函数声明
let fun2 = ()=>{ } // 箭头函数声明
let fun3 = (x)=>{ return x+1}
let fun4 = x => { return x+1} // 参数列表中有且只有一个参数,()可以省略不写
let fun5 = x => console.log(x) // 方法体中只有一行代码,{}可以不写
let fun6 = x => x+1 // 方法体中只有一行含return的代码,return必须省略,{}可以不写
// 在箭头函数中使用this相当于在上一作用域中使用this
reset和spread
reset 剩余的,解决剩余的参数接收问题
let fun1 = (a,b,c,... arr)=>{
console.log(a,b,c,d)
console.log(arr)
}
fun1(1,2,3,4,5,6,7,8)
// 输出:1 2 3 4
// 1 2 3 4 5 6 7 8
// spread rest在实参上的使用
let arr = [1,2,3]
// let info = ...arr // 报错
let fun2 = (a,b,c)=>{
console.log(a,b,c)
}
fun2(arr) // 输出:{[1,2,3],undefined,undefined}
fun2(...arr) // 输出:{1,2,3}
spread快速合并数组
let a = [1,2,3]
let b = [4,5,6]
let c = [7,8,9]
let d = [...a,...b,...c] // let d = [1,2,3,4,5,6,7,8,9]
console.log(d)
spread快速合并对象
let person1={ name:"张三"}
let person2={ age:"10"}
let person3={ gender:"boy"}
let person4={ ...person1,...person2,...person3}
console.log(person4)
类和对象
类及其说明
class Person{
// 公共属性
name
age
// 私有属性,#n 整体代表一个属性
#n
// getter and setter
get name(){
console.log("getter")
return this.name
}
set name(name){
console.log("setter")
this.name = name
}
// 实例方法
eat(food){
console.log(`${ this.age}岁的${ this.name}正在吃${ food}`)
}
// 静态方法
static sum(a,b){
return a + b
}
// 构造器
constructor(name,age){
this.name = name
this.age = age
}
}
测试
let person = new Person()
let person2 = new Person("小明",21)
person.name = "张三"
person.age = 21
console.log(person)
console.log(person2)
person.eat("蛋糕")
console.log(Person.sum(1,2))
类的继承及其测试
class Student extends Person{
score;
study(){
console.log(`${ this.age}岁的${ this.name}正在努力学习`)
}
constructor(name,age,score){
super(name,age) // 调用父类的构造器进行赋值
this.score = score
}
}
let stu = new Student("小王",21,60)
stu.study()
对象的拷贝
浅拷贝
let arr = [1,2,3]
let person = { name:"张三"}
浅拷贝 : 只拷贝变量的引用地址
let arr2 = arr
let person2 = person
arr[0] = 100
console.log(arr2) // [100,2,3]
person.name = "小明"
console.log(person2) // {name:小明}
深拷贝
let arr = [1,2,3]
let person = { name:"张三"}
// 深拷贝 :
let arr2 = [...arr]
// let person2 = {...person}
let person2 = JSON.parse(JSON.stringify(person)) // 将其先转换为字符串,再将字符串解析为一个person对象
arr[0] = 100
console.log(arr2) // [1,2,3]
person.name = "小明"
console.log(person2) // {name:张三}
js文件对象导出
分别导出
// module.js文件
export const PI = 3.14
// app.js文件
import * as m1 from "./module.js"
// 最后在html文件中关联js文件
统一导出
// module.js文件
export{ PI,sum,Person}
// app.js文件
import * as m1 from "./module.js"
默认导出
// module.js文件
export default sum
// app.js文件
import * as m1 from "./module.js"
console.log(m1.default)
// import {default as add} from './module.js'
// console.log(add(10,30))
5. 前端工程化软件安装
nodejs安装
nodejs的作用。运行js代码。兼容性好:可以运行到windows和linux里。
npm安装
Nodejs包管理工具。作用主要是:前端框架的下载工具,前端项目的管理工具
配置前端依赖目录以及配置阿里npm镜像源
配置阿里npm镜像源
npm config set registry https://registry.npmmirror.com
npm config get registry
配置前端依赖目录
npm config set prefix "D:\GlobalNodeModules"
npm config get prefix
npm常见命令
npm初始化
npm init
生成一个json文件,这个json文件相当于在maven中的pom.xml文件
下载依赖
npm insatll vue@2.7.14 # 下载对应版本的vue
npm install *** # 根据输入的内容下载相对应的依赖
npm i # 下载package.json里面所有的依赖
卸载依赖
npm uninstall *** # 卸载某个依赖
查看当前npm
所有依赖
npm ls
package.json中的scripts键值对可以自己声明
npm run *** # *** 处自己修改为脚本中的键名
vscode中集成了powershell终端,以便我们修改代码同时管理前端资源包
注意:如果vscode不能使用npm命令,可以用管理员身份打开npm。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。