这里写自定义目录标题
java程序的架构
-
java在生成字节码之外,还生成了JVM(java virtual machine,java 虚拟机),通过JVM支持了字节码的解释运行
所以说java语言的进阶分为两层:java语言、jvm
java的命名规则ascll码不能有空格 |
Public class ClassName{
public static void main(String[] args){
System.out.println("Hello World");//1
}
}
- public class :固定格式
- ClassName: 类的名称
- main:方法最重要,java程序从main开始执行
- 1 语句
包
-
包路径采用“.”分隔
-
包路径不是绝对路径的文件路径,它只是相对java工程目录的路径
-
一个文件只有一个package语句,并在文件的第一行
变量
- 变量是解决内容复用的
- 变量是名称的
- 声明变量(类似于String a)
- 赋值 (a=“阿娆”)或者(String a = “阿娆”)
- 数据类型 主要是 字符串 数字 布尔等 运算符±*/等
- Math.random 随机数(浮点)几位数通过*100000之后再 1. %得出整数的随机数 2.强制int转换
int code = (int) ((Math.random()+1) * 100000);
public static void random(int length){//void 无返回值
int code = (int) ((Math.random()+1) * length);
System.out.println(code);
}//
//还可以错参数
- 自定义方法:解决代码复用问题,隐藏细节,程序更清晰 ,降低复杂度
public class Custom {
public static void main(String[] args){
System.out.println("测试");
// 这里执行一下 newLine 这个自定义方法的调用
newLine();
System.out.println("结束");
}
public static void newLine(){
System.out.println("");
}
}
- 逻辑语句
- if
- if else if else
- if {if}
- return
- 递归
- for
- void 无返回值 int /bool…有返回值
// 验证码方法void
public static void code(int len)
// 随机数方法double
public static double random()
public static int code(int len){
// 得到随机数结果
double val = Math.random();
// 随机数结果*9+1 然后再乘以位数得到验证码
int result = (int)((val*9+1)*len);
return result;
}
-
字符串常用
- 拼接 substring
- 查找 indexOf
- 开始/结束判断 startsWith/endsWith
- 替换 replaceAll’
- 分割 split
- 大小写转换 toUpperCase/toLowerCase
- 比较 equals
- 数字和字符串转换 integer parseint
- Sring.valueOf()
-
包(package)的导入 import 包名+类名
-
import java.time.LocalDate;
-
Java网络编程
- 协议
- http
- https
-
- URL 统一资源定位符
-
- 协议类型于域名之间://分割
- 路径(path)以/开头,中间每层的分隔符/
- 路径(path)相当于一层层的文件夹,但是要与windows的文件夹分隔符\区分
- 参数
- 路径与参数之间用?分割,
- 多个参数之间用&分割
- 参数用“参数名=参数值(key=value)”的表示方法
-
get 请求
-
安装依赖库
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.1.0</version> </dependency>
-
-
- 实例化OkkHttpClient. 使用
OkHttpClient okHttpClient = new OkHttpClient();
代码。 - 执行调用。
- 在执行调用之前,需要实例化一个 Request对象,作用是定义请求的各种参数 Request request = new Request.Builder().url(url).build();
- 构建调用对象
Call call = okHttpClient.newCall(request);
- 最后执行调用,如果调用失败可能抛异常,所以必须抓取异常 call.execute()执行调用
- call.execute()返回的其实是一个执行的结果对象,调用对象的方法即可获取返回的字符串内容:call.execute().body().string();
- 实例化OkkHttpClient. 使用
不要忘了在pom.xml里添加依赖,以及import语句引入使用类
API
应用程序接口,api一般是指一些预先定义的函数,目的是可以为开发人员快速访问某一程序,无需访问的源码,或内部工作机制的细节
-
Okhttp3的一些方法
-
post():放在表单中提交
Builder builder = new FormBody.Builder(); // 设置数据,第一个参数是数据名,第二个参数是数据值 builder.add("", ""); FormBody formBody = builder.build(); Request request = new Request.Builder().url(url).post(formBody).build();
-
get():调用api
-
JSON方式提交数据步骤
- 将数据转换成JSON格式的字符串,调用
- 创建RequestBody实例,注意需要指定提交的类型是application/json;chaarset=utf-8(api规定的编码格式)
- 构建request实例对象时,调用.post(requestBody)表示使用JSON的方式提交数据
-
request response对象
使用一条语句执行调用请求,并取得返回结果字符串
call.execute().body().string()
获取响应状态码
call.execute().code()
请求图片、excel等非文本文件时,不能使用 response.body().string()
response.body().bytes();
JSON 很多api返回的文件内容是JSON格式的。JSON是一段文本,是java的字符串,是难以进行解析具体内容的。必须转换成Java的对象
JSON.parseObject()
headers
HTTP header是HTTP协议的一项重要内容
Request request = new Request.Builder()
.url(url)
.addHeader("Referer", "https://ham.youkeda.com/course/j14/0")
.build();
Host表示当前请求的域名
Request request = new Request.Builder()
.url(url)
.addHeader("Host", "www.douban.com")
.build();
在console中下载文件、图片
-
写入文本文件
import java.io.File; import java.io.FileWriter; // 文件对象 File file = new File("foo.txt"); // 写入内容 FileWriter fileWritter = new FileWriter(file.getName()); fileWritter.write(content); // 关闭 fileWritter.close();
-
写入二进制文件
import java.io.File; import java.io.FileOutputStream; // 文件对象 File file = new File("china-city-list.xlsx"); // 写文件 FileOutputStream fos = new FileOutputStream(file); fos.write(data); // 必须刷新并关闭 fos.flush(); fos.close();
-
下载图片
与上面一样
-
解析excel
-
加依赖库
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency>
-
-
- 调用库
import com.alibaba.excel.EasyExcel; import java.util.Map; import java.util.List; // 读取第一个sheet List<Map<Integer, String>> sheetDatas = EasyExcel.read("xzq_201907.xlsx").sheet(0).doReadSync(); // List 中每个元素表示一行 for (Map<Integer, String> rowData : sheetDatas) { // Map 中用序号指代每一列 for (Integer index : rowData.keySet()) { // 列值 String columnValue = rowData.get(index); } }
print不换行 println 换行
cookie 和 session
数据结构与算法入门
emmmm 怎么说呢,
web前端基础
HTML元素的结构
HTML标签
- 由尖括号包围关键词
- 多成对出现
- 等是单独呈现的
- 嵌套
-
<! DOCTYPE HTML> 作用:告知浏览器该页面文件的文档类型,该声明必须在HTML文档的第一行,对大小写不敏感, 没有结束标签
- ..... 告知浏览器其自身是一个html文档,与
标签限定文档的开始和结束,头部 主体 lang属性(语言属性):en表英文
- 属性标签
- 文档的头部
- 文档主体
- 注释<!-- —>
- 表单标签
- action:一个处理此表单信息的程序所在的URL,所述表格信息将在表单提交时被发送到定义的地址
- method:它的值可以是GET/POST,用来规定如何发送表单信息
- 占位文本
<input type="text" placeholder="昵称" />
<input type="text" placeholder="昵称" name="nick" value="小明" readonly />
-
多行文本输入框
<textarea name="sign" rows="5" cols="30" placeholder="请输入个性签名" ></textarea> //密码的 <input type="password" name="password" placeholder="密码" />
-
单选框和复选框
<label> <input type="radio" name="gender" value="male" />男 </label> <label> <input type="radio" name="gender" value="female" />女 </label>
<input id="male" type="radio" name="gender" value="male" /> <label for="male">男</label> <input id="female" type="radio" name="gender" value="female" /> <label for="female">女</label>
//复选 <input type="checkbox" />
-
选择菜单option(菜单) multiple(可滚动)
<select name="career" multiple>
<option value="default">请选择职业</option>
<option value="staff">公司职员</option>
<option value="freelancer">自由职业者</option>
<option value="student">学生</option>
<option value="other">其他</option>
</select>
- 按钮 button
<button>注册</button>
引入方式
- 行内样式 一行一个
- 内部样式抽离步骤
- 将每一个标签的CSS样式抽取出来
- 在head标签里声明一个标签
- 将样式放入style标签里
- 将相同标签的样式卸载相同的大括号里
- 外部样式
- 嵌套 将一套嵌套到一个整体中
- 复用 :mixin /include
- 无参数混合
//css
.square {
width: 100px;
height: 100px;
}
//html
<div class="user-avatar square">...</div>
<div class="admin-avatar square">...</div>
//Sass
@mixin square {
width: 100px;
height: 100px;
}
// 应用:
.user-avatar {
@include square;
}
.admin-avatar {
@include square;
}
混合的目的:不用改动html代码(在元素中添加类名)
使用方法:“@mixin”:定义可复用的样式“@include”:应用可复用的样式
-
- 有参数混合
//通过修改size来修改square的大小,该参数$size:value 来默认square的值
@mixin square($size) {
width: $size;
height: $size;
}
// 应用
.avatar {
@include square(100px);
}
javascript
是一种专与网页交互设计的语言,主要由三部分组成:
-
核心(ECMAScript)
由 语法,类型,语句,关键字,保留字,操作符,对象
-
文档对象模型(DOM)获取html标签,并给标签添加或者删除样式,并添加时间
DOM遍历和范围:可以找到页面中的所有标签
DOM时间:添加事件
DOM样式:元素的样式
-
浏览器对象模型(BOM)
弹出,移动,放缩,关闭浏览器等功能
-
位置,在html内部
使用script标签嵌入JavaScript
// script标签嵌入JavaScript代码
<script>
// JavaScript代码
let name = "kimi";
function(){
console.log("我的名字叫:"+name);
}
</script>
多字符拼接用“+ ”
-
变量
- 隐式转换
- 字符+数字 数字转换成字符串
- 字符做除了+的运算, 字符串转换成数字
- 强制转换
- parseInt
- parseFloat 小数字符串,转化为小数
- 隐式转换
-
对象:键值对
-
- 属性读取
console.log(person.name);
console.log(person['name']);
//增加属性
person.gender="male";
//删除属性
delete person.name;
-
- 属性是否存在 :in
-
Object JSON Map的区别
-
JSON是一种轻量级的文本数据交换格式,用JavaScript的语法书写,但独立于这种语言,可以认为这是编程语言用于传递数据而约定的数据格式
// 一个 JSON 字符串 const jsonStr = '{"sites":[{"name":"Runoob", "url":"www.runoob.com"},{"name":"Google", "url":"www.google.com"},{"name":"Taobao", "url":"www.taobao.com"}]}'; // 转成 JavaScript 对象 const obj = JSON.parse(jsonStr);
-
-
- Map和Object 相似,都可以保存键值对,但
- Object的键通常是字符串,但一个Map的键可以是任意值
- Map中的键值是有序的,而添加到对象中的键则不是
- Map的键值对个数可以直接获取,Object则要借助Object.keys()
- Map可以直接对进行迭代,Object则要借助Object.keys
- Map不存在键名和原型键名冲突问题,可以直接覆盖,Object不行
- Map和Object 相似,都可以保存键值对,但
-
Math、Storage
Math.abs() // 绝对值
Math.ceil() // 向上取整
Math.floor() // 向下取整
Math.round() // 四舍五入取整
Math.max() // 最大值
Math.min() // 最小值
Math.pow() // 指数运算
Math.sqrt() // 平方根
Math.log() // 自然对数
Math.exp() // e的指数
Math.random() // 随机数
window.localStorage.setItem('myLocalStorage', 'storage Value');
window.localStorage.setItem(‘key’, ‘value’) 方法接受两个参数:
- key:键名;
- value:键值
两个参数都是字符串,不是字符串的参数会被转成字符串后再存入浏览器。
-
- 清除缓存 clear
- 读取数据getitem
-
String
-
字符串长度 length
-
查找字符 indexOf()
-
去掉两端空格 trim()
-
截取字符串 substring/substr
-
分割字符串 :split
-
- Array
-
BOM(浏览器对象模型)(Browser Object MOdel)
- 有一系列相关对象构成,每个对象都提供了很多方法和属性
- 对象
- window(窗口):是整个网页的框架,每个网页都是装在window里面
- navigator(浏览器):navigator里面存储浏览器相关信息
- history(历史):存储网页栈的
- screen(显示屏幕):硬件信息
- location(地址)当前访问的页面信息
-
DOM(文档对象模型)(Document Object Model)
- 可以将Web页面与脚本或编程语言连接起来
- 特性:
- 树根document,整个页面文档
- 每个HTML标签称为DOM节点,
- 每个HTML标签包裹的子标签,在树上体现为分支,儿子节点
- 以及树相关的知识点(数据结构)
-
页面分析步骤
- 把涉及页面的静态页面写出
- 利用Javascript控制区域的显示和隐藏,达到动态效果
- 根据写好的静态页面模板和数据,动态创建DOM节点
-
dom事件
- focus 表单组件获取焦点事件
- burl 表单组件 失去焦点事件
- click点击事件
- dblclick 双击事件
- mouse’down 按下任意鼠标按钮
- mouseenter 指针移到有事件监听的元素内
- mouseleave:指针移出元素范围外(不冒泡)。
- mousemove: 指针在元素内移动时持续触发。
- mouseover: 指针移到有事件监听的元素或者它的子元素内。
- mouseout: 指针移出元素,或者移到它的子元素上。
- mouseup: 在元素上释放任意鼠标按键。
- keydown:键盘按下事件
- keyup:键盘释放事件
- scroll:文档滚动事件
- resize:窗口放缩事件
-
冒泡事件
- 点击事件触发监听
- 冒泡依次找到父节点,触发父节点的监听事件
- 依次冒泡到html结束
-
捕获
- 父节点往下移动到点击的元素
-
委托 类似于冒泡事件
Spring Web
maven
- POM
- 定义项目的类型、名字’
- 管理依赖关系
- 定制插件
-
Maven 坐标
<groupId>com.youkeda.course</groupId> <artifactId>app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version>
-
Maven 工程属性
<properties> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>${java.version}</maven.compiler.target> </properties>
-
Maven 依赖
-
Maven 插件
-
依赖管理
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.2.2</version> </dependency> </dependencies>
-
插件体系
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </build>
Spring强调面向接口编程
调用MessageService 实例的getMessage()方法
在Spring中,想调用MessageService 可以直接从上下文获取,不需要关心它的实现类
如何实例化实现类,从而达到耦合
java 注释(Annotation)
本质上来说Annotation (注解)是Java推出的-种注释机制,和普通的注释有个显著的特Annotation是可以在编译、运行阶段读取的,注释很明显不可以。能够在编译、运行阶段读取信息,这就有很多的扩展空间,而环会污染源代码。可以借助它来实现一些增强功能,在Spring当中就重度使用了Annotation,通过运行阶段动态的获取Annotation从而完成很多自定义的行为,所以如果不了解Annotation,那学习Spring就没有办法进行下去了。从另外一个角度来看,Annotation 也是-个Java类,只是这个类太特殊了点。
-
target :只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围具体可以作用的类型配置在java. lang. annotation. ElementType
-
Retebtion :用于声明注解的生命周期,即有效性。1.SOURCE:也就是说是纯注释作用2.CL ASS:也就是在编译阶段是有效的3.RUNTIME:在运行时有效
-
Documented :将注解中的元素包含到JavaDoc文档中
-
@interface 就是声明当前java类型是Annotation ,固定语法
-
Annotation的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型: String、 boolean、 int、 long), 和属性名称(默认名称是value,在引用的时候可以省略),default 代表的是默认值。
spring bean
IoC (Inversion of Control 控制反转)容器时Spring框架最最核心的组件,没有IoC容器就没有Spring框架
通过依赖注入(Dependency injection)来实现IoC,获取Bean的实例直接从IoC容器中获取,不需要关心实现类
//启动IoC容器
ApplicationContext context =
new AnnotationConfigApplicationContext("fm.douban");
Spring 官方声明为Spring Bean 的注解有如下
org.springframework.stereotype.Service
扩展自Component 代表Service Beanorg.springframework.stereotype.Component
是通用的Bean 注解org.springframework.stereotype.Controller
Web Beanorg.springframework.stereotype.Repository
持久化相关Bean
依赖注入
-
完成容器的启动
-
完成依赖注入行为
-
作用,让Spring 系统自动管理各种实例
Spring Resource
把本地文件、classpath文件,远程文件都封装成Resource 对象统一加载
Spring Boot
核心还是spring,web服务器做了什么
在Spring Boot方案里,一个网页请求到了服务器后,首先进入的是JavaWeb服务器,再进入SpringBoot应用,最后匹配到某一个Spring Controller,然后路由到具体摸一个bean的方法,执行完后返回结果输出到客户端
- http网络中对重要的协议
- get
- post
-
thymeleaf 是一个模板框架吗,支持多种格式内容的动态晕染,和html相融合-
-
初始化 添加Maven依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
-
-
th代表thymeleaf语法
-
th:each 循环语句
-
<ul th:each="song,it: ${songs}"> <li> <span th:text="${it.count}"></span> <span th:text="${song.name}"></span> </li> </ul>
-
th:if 条件语句
-
//${xxx}是固定语法 <span th:text="${msg}">Hello</span>
-
-
Spring Validation
-
JSR java Specification Requests 380:java规范提案。指JCP java community process 提出新增一个标准化技术规范的正式请求。
<dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
创建一个表单页 user/addUser.html模板文件
-
-
thymeleaf layout
-
th:include=“::content”是选择器
-
th:replace=“layout”页面会替换成layout
-
th:fragment=“content”
<div th:fragment="content"> </div>
-
-
Spring Boot ComponentScan
-
使用日志系统,两大步骤
-
配置 修改
Spring Boot
系统的标准配置文件:application.properties
(在项目的src/main/resources/
目录下),增加日志级别配置:logging.level.root=info -
编码
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController public class SongListControl { private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class); @PostConstruct public void init(){ LOG.info("SongListControl 启动啦"); } }
-
Spring Session
-
Cookie类的构造函数,第一个参数是cookie名称,第二个参数是coolie值。其他的属性,需要根据实际情况和具体的业务需求决定。
-
但是重要信息放入cookie,会带来安全隐患,不超过4kb
-
Session机制可以解决安全问题,放在服务端,没有限制,
-
依赖
<!-- spring session 支持 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency>
Spring Request 拦截器(HandlerInterceptor)
- 创建拦截器
HandlerInterceptor
接口。可以在三个点进行拦截:- Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在
preHandle()
方法中处理。 - Controller方法执行之后。例如记录日志、统计方法执行时间等,就要在
postHandle()
方法中处理。 - 整个请求完成后。不常用的拦截点。例如统计整个请求的执行时间的时候用,在
afterCompletion
方法中处理。
- Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class InterceptorDemo implements HandlerInterceptor {
// Controller方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 只有返回true才会继续向下执行,返回false取消当前请求
return true;
}
//Controller方法执行之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
// 整个请求完成后(包括Thymeleaf渲染完毕)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
preHandle()` 方法的参数中有 `HttpServletRequest` 和 `HttpServletResponse`,可以像 `control` 中一样使用 `Session
- 实现 WebMvcConfigurer
Spring Data CRUD,类似于数据库
-
新增数据 插入mongoTemplate.insert()
-
查询数据 findById() mongoTemplate.findById(songId, Song.class)
-
修改数据
// 修改 id=1 的数据 Query query = new Query(Criteria.where("id").is("1")); // 把歌名修改为 “new name” Update updateData = new Update(); updateData.set("name", "new name"); // 执行修改,修改返回结果的是一个对象 UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class); // 修改的记录数大于 0 ,表示修改成功 System.out.println("修改的数据记录数量:" + result.getModifiedCount());
-
删除数据
Song song = new Song();
song.setId(songId);
// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());
java程序的架构
-
java在生成字节码之外,还生成了JVM(java virtual machine,java 虚拟机),通过JVM支持了字节码的解释运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKurYleH-1673275878158)(D:\1ar\youkedai\图片合集\图片1.png)]
所以说java语言的进阶分为两层:java语言、jvm
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fshD6EKs-1673275878159)(D:\1ar\youkedai\图片合集\图片2.png)]
java的命名规则ascll码不能有空格 |
Public class ClassName{
public static void main(String[] args){
System.out.println("Hello World");//1
}
}
- public class :固定格式
- ClassName: 类的名称
- main:方法最重要,java程序从main开始执行
- 1 语句
包
-
包路径采用“.”分隔
-
包路径不是绝对路径的文件路径,它只是相对java工程目录的路径
-
一个文件只有一个package语句,并在文件的第一行
变量
- 变量是解决内容复用的
- 变量是名称的
- 声明变量(类似于String a)
- 赋值 (a=“阿娆”)或者(String a = “阿娆”)
- 数据类型 主要是 字符串 数字 布尔等 运算符±*/等
- Math.random 随机数(浮点)几位数通过*100000之后再 1. %得出整数的随机数 2.强制int转换
int code = (int) ((Math.random()+1) * 100000);
public static void random(int length){//void 无返回值
int code = (int) ((Math.random()+1) * length);
System.out.println(code);
}//
//还可以错参数
- 自定义方法:解决代码复用问题,隐藏细节,程序更清晰 ,降低复杂度
public class Custom {
public static void main(String[] args){
System.out.println("测试");
// 这里执行一下 newLine 这个自定义方法的调用
newLine();
System.out.println("结束");
}
public static void newLine(){
System.out.println("");
}
}
- 逻辑语句
- if
- if else if else
- if {if}
- return
- 递归
- for
- void 无返回值 int /bool…有返回值
// 验证码方法void
public static void code(int len)
// 随机数方法double
public static double random()
public static int code(int len){
// 得到随机数结果
double val = Math.random();
// 随机数结果*9+1 然后再乘以位数得到验证码
int result = (int)((val*9+1)*len);
return result;
}
-
字符串常用
- 拼接 substring
- 查找 indexOf
- 开始/结束判断 startsWith/endsWith
- 替换 replaceAll’
- 分割 split
- 大小写转换 toUpperCase/toLowerCase
- 比较 equals
- 数字和字符串转换 integer parseint
- Sring.valueOf()
-
包(package)的导入 import 包名+类名
-
import java.time.LocalDate;
-
Java网络编程
- 协议
- http
- https
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oH7C3IfT-1673275878160)(D:\1ar\youkedai\图片合集\图片4.png)]
-
- URL 统一资源定位符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BoigzT6j-1673275878160)(D:\1ar\youkedai\图片合集\图片5.png)]
-
- 协议类型于域名之间://分割
- 路径(path)以/开头,中间每层的分隔符/
- 路径(path)相当于一层层的文件夹,但是要与windows的文件夹分隔符\区分
- 参数
- 路径与参数之间用?分割,
- 多个参数之间用&分割
- 参数用“参数名=参数值(key=value)”的表示方法
-
get 请求
-
安装依赖库
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.1.0</version> </dependency>
-
-
- 实例化OkkHttpClient. 使用
OkHttpClient okHttpClient = new OkHttpClient();
代码。 - 执行调用。
- 在执行调用之前,需要实例化一个 Request对象,作用是定义请求的各种参数 Request request = new Request.Builder().url(url).build();
- 构建调用对象
Call call = okHttpClient.newCall(request);
- 最后执行调用,如果调用失败可能抛异常,所以必须抓取异常 call.execute()执行调用
- call.execute()返回的其实是一个执行的结果对象,调用对象的方法即可获取返回的字符串内容:call.execute().body().string();
- 实例化OkkHttpClient. 使用
不要忘了在pom.xml里添加依赖,以及import语句引入使用类
API
应用程序接口,api一般是指一些预先定义的函数,目的是可以为开发人员快速访问某一程序,无需访问的源码,或内部工作机制的细节
-
Okhttp3的一些方法
-
post():放在表单中提交
Builder builder = new FormBody.Builder(); // 设置数据,第一个参数是数据名,第二个参数是数据值 builder.add("", ""); FormBody formBody = builder.build(); Request request = new Request.Builder().url(url).post(formBody).build();
-
get():调用api
-
JSON方式提交数据步骤
- 将数据转换成JSON格式的字符串,调用
- 创建RequestBody实例,注意需要指定提交的类型是application/json;chaarset=utf-8(api规定的编码格式)
- 构建request实例对象时,调用.post(requestBody)表示使用JSON的方式提交数据
-
request response对象
使用一条语句执行调用请求,并取得返回结果字符串
call.execute().body().string()
获取响应状态码
call.execute().code()
请求图片、excel等非文本文件时,不能使用 response.body().string()
response.body().bytes();
JSON 很多api返回的文件内容是JSON格式的。JSON是一段文本,是java的字符串,是难以进行解析具体内容的。必须转换成Java的对象
JSON.parseObject()
headers
HTTP header是HTTP协议的一项重要内容
Request request = new Request.Builder()
.url(url)
.addHeader("Referer", "https://ham.youkeda.com/course/j14/0")
.build();
Host表示当前请求的域名
Request request = new Request.Builder()
.url(url)
.addHeader("Host", "www.douban.com")
.build();
在console中下载文件、图片
-
写入文本文件
import java.io.File; import java.io.FileWriter; // 文件对象 File file = new File("foo.txt"); // 写入内容 FileWriter fileWritter = new FileWriter(file.getName()); fileWritter.write(content); // 关闭 fileWritter.close();
-
写入二进制文件
import java.io.File; import java.io.FileOutputStream; // 文件对象 File file = new File("china-city-list.xlsx"); // 写文件 FileOutputStream fos = new FileOutputStream(file); fos.write(data); // 必须刷新并关闭 fos.flush(); fos.close();
-
下载图片
与上面一样
-
解析excel
-
加依赖库
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency>
-
-
- 调用库
import com.alibaba.excel.EasyExcel; import java.util.Map; import java.util.List; // 读取第一个sheet List<Map<Integer, String>> sheetDatas = EasyExcel.read("xzq_201907.xlsx").sheet(0).doReadSync(); // List 中每个元素表示一行 for (Map<Integer, String> rowData : sheetDatas) { // Map 中用序号指代每一列 for (Integer index : rowData.keySet()) { // 列值 String columnValue = rowData.get(index); } }
print不换行 println 换行
cookie 和 session
数据结构与算法入门
emmmm 怎么说呢,
web前端基础
HTML元素的结构
HTML标签
- 由尖括号包围关键词
- 多成对出现
- 等是单独呈现的
-
嵌套
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRqlKYpm-1673275878161)(D:\1ar\youkedai\图片合集\图片6.png)]
-
<! DOCTYPE HTML> 作用:告知浏览器该页面文件的文档类型,该声明必须在HTML文档的第一行,对大小写不敏感, 没有结束标签
- ..... 告知浏览器其自身是一个html文档,与
标签限定文档的开始和结束,头部 主体 lang属性(语言属性):en表英文
- 属性标签
- 文档的头部
- 文档主体
- 注释<!-- —>
- 表单标签
- action:一个处理此表单信息的程序所在的URL,所述表格信息将在表单提交时被发送到定义的地址
- method:它的值可以是GET/POST,用来规定如何发送表单信息
- 占位文本
<input type="text" placeholder="昵称" />
<input type="text" placeholder="昵称" name="nick" value="小明" readonly />
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBxAqhLd-1673275878161)(D:\1ar\youkedai\图片合集\图片7.png)]
-
多行文本输入框
<textarea name="sign" rows="5" cols="30" placeholder="请输入个性签名" ></textarea> //密码的 <input type="password" name="password" placeholder="密码" />
-
单选框和复选框
<label> <input type="radio" name="gender" value="male" />男 </label> <label> <input type="radio" name="gender" value="female" />女 </label>
<input id="male" type="radio" name="gender" value="male" /> <label for="male">男</label> <input id="female" type="radio" name="gender" value="female" /> <label for="female">女</label>
//复选 <input type="checkbox" />
-
选择菜单option(菜单) multiple(可滚动)
<select name="career" multiple>
<option value="default">请选择职业</option>
<option value="staff">公司职员</option>
<option value="freelancer">自由职业者</option>
<option value="student">学生</option>
<option value="other">其他</option>
</select>
- 按钮 button
<button>注册</button>
引入方式
- 行内样式 一行一个
- 内部样式抽离步骤
- 将每一个标签的CSS样式抽取出来
- 在head标签里声明一个标签
- 将样式放入style标签里
- 将相同标签的样式卸载相同的大括号里
- 外部样式
- 嵌套 将一套嵌套到一个整体中
- 复用 :mixin /include
- 无参数混合
//css
.square {
width: 100px;
height: 100px;
}
//html
<div class="user-avatar square">...</div>
<div class="admin-avatar square">...</div>
//Sass
@mixin square {
width: 100px;
height: 100px;
}
// 应用:
.user-avatar {
@include square;
}
.admin-avatar {
@include square;
}
混合的目的:不用改动html代码(在元素中添加类名)
使用方法:“@mixin”:定义可复用的样式“@include”:应用可复用的样式
-
- 有参数混合
//通过修改size来修改square的大小,该参数$size:value 来默认square的值
@mixin square($size) {
width: $size;
height: $size;
}
// 应用
.avatar {
@include square(100px);
}
javascript
是一种专与网页交互设计的语言,主要由三部分组成:
-
核心(ECMAScript)
由 语法,类型,语句,关键字,保留字,操作符,对象
-
文档对象模型(DOM)获取html标签,并给标签添加或者删除样式,并添加时间
DOM遍历和范围:可以找到页面中的所有标签
DOM时间:添加事件
DOM样式:元素的样式
-
浏览器对象模型(BOM)
弹出,移动,放缩,关闭浏览器等功能
-
位置,在html内部
使用script标签嵌入JavaScript
// script标签嵌入JavaScript代码
<script>
// JavaScript代码
let name = "kimi";
function(){
console.log("我的名字叫:"+name);
}
</script>
多字符拼接用“+ ”
-
变量
- 隐式转换
- 字符+数字 数字转换成字符串
- 字符做除了+的运算, 字符串转换成数字
- 强制转换
- parseInt
- parseFloat 小数字符串,转化为小数
- 隐式转换
-
对象:键值对
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBTduopn-1673275878162)(D:\1ar\youkedai\图片合集\图片11.png)]
-
- 属性读取
console.log(person.name);
console.log(person['name']);
//增加属性
person.gender="male";
//删除属性
delete person.name;
-
- 属性是否存在 :in
-
Object JSON Map的区别
-
JSON是一种轻量级的文本数据交换格式,用JavaScript的语法书写,但独立于这种语言,可以认为这是编程语言用于传递数据而约定的数据格式
// 一个 JSON 字符串 const jsonStr = '{"sites":[{"name":"Runoob", "url":"www.runoob.com"},{"name":"Google", "url":"www.google.com"},{"name":"Taobao", "url":"www.taobao.com"}]}'; // 转成 JavaScript 对象 const obj = JSON.parse(jsonStr);
-
-
- Map和Object 相似,都可以保存键值对,但
- Object的键通常是字符串,但一个Map的键可以是任意值
- Map中的键值是有序的,而添加到对象中的键则不是
- Map的键值对个数可以直接获取,Object则要借助Object.keys()
- Map可以直接对进行迭代,Object则要借助Object.keys
- Map不存在键名和原型键名冲突问题,可以直接覆盖,Object不行
- Map和Object 相似,都可以保存键值对,但
-
Math、Storage
Math.abs() // 绝对值
Math.ceil() // 向上取整
Math.floor() // 向下取整
Math.round() // 四舍五入取整
Math.max() // 最大值
Math.min() // 最小值
Math.pow() // 指数运算
Math.sqrt() // 平方根
Math.log() // 自然对数
Math.exp() // e的指数
Math.random() // 随机数
window.localStorage.setItem('myLocalStorage', 'storage Value');
window.localStorage.setItem(‘key’, ‘value’) 方法接受两个参数:
- key:键名;
- value:键值
两个参数都是字符串,不是字符串的参数会被转成字符串后再存入浏览器。
-
- 清除缓存 clear
- 读取数据getitem
-
String
-
字符串长度 length
-
查找字符 indexOf()
-
去掉两端空格 trim()
-
截取字符串 substring/substr
-
分割字符串 :split
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tA2MLCJH-1673275878169)(D:\1ar\youkedai\图片合集\图片12.png)]
-
-
Array
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bozsTE56-1673275878170)(D:\1ar\youkedai\图片合集\图片13.png)]
-
BOM(浏览器对象模型)(Browser Object MOdel)
- 有一系列相关对象构成,每个对象都提供了很多方法和属性
- 对象
- window(窗口):是整个网页的框架,每个网页都是装在window里面
- navigator(浏览器):navigator里面存储浏览器相关信息
- history(历史):存储网页栈的
- screen(显示屏幕):硬件信息
- location(地址)当前访问的页面信息
-
DOM(文档对象模型)(Document Object Model)
- 可以将Web页面与脚本或编程语言连接起来
- 特性:
- 树根document,整个页面文档
- 每个HTML标签称为DOM节点,
- 每个HTML标签包裹的子标签,在树上体现为分支,儿子节点
- 以及树相关的知识点(数据结构)
-
页面分析步骤
- 把涉及页面的静态页面写出
- 利用Javascript控制区域的显示和隐藏,达到动态效果
- 根据写好的静态页面模板和数据,动态创建DOM节点
-
dom事件
- focus 表单组件获取焦点事件
- burl 表单组件 失去焦点事件
- click点击事件
- dblclick 双击事件
- mouse’down 按下任意鼠标按钮
- mouseenter 指针移到有事件监听的元素内
- mouseleave:指针移出元素范围外(不冒泡)。
- mousemove: 指针在元素内移动时持续触发。
- mouseover: 指针移到有事件监听的元素或者它的子元素内。
- mouseout: 指针移出元素,或者移到它的子元素上。
- mouseup: 在元素上释放任意鼠标按键。
- keydown:键盘按下事件
- keyup:键盘释放事件
- scroll:文档滚动事件
- resize:窗口放缩事件
-
冒泡事件
- 点击事件触发监听
- 冒泡依次找到父节点,触发父节点的监听事件
- 依次冒泡到html结束
-
捕获
- 父节点往下移动到点击的元素
-
委托 类似于冒泡事件
Spring Web
maven
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTrarrUE-1673275878171)(D:\1ar\youkedai\图片合集\Maven核心概念.png)]
- POM
- 定义项目的类型、名字’
- 管理依赖关系
- 定制插件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8Gl9E8D-1673275878171)(D:\1ar\youkedai\图片合集\图片14.png)]
-
Maven 坐标
<groupId>com.youkeda.course</groupId> <artifactId>app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version>
-
Maven 工程属性
<properties> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>${java.version}</maven.compiler.target> </properties>
-
Maven 依赖
-
Maven 插件
-
依赖管理
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.2.2</version> </dependency> </dependencies>
-
插件体系
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </build>
Spring强调面向接口编程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8dVxTOc-1673275878172)(D:\1ar\youkedai\图片合集\图片15.png)]
调用MessageService 实例的getMessage()方法
在Spring中,想调用MessageService 可以直接从上下文获取,不需要关心它的实现类
如何实例化实现类,从而达到耦合
java 注释(Annotation)
本质上来说Annotation (注解)是Java推出的-种注释机制,和普通的注释有个显著的特Annotation是可以在编译、运行阶段读取的,注释很明显不可以。能够在编译、运行阶段读取信息,这就有很多的扩展空间,而环会污染源代码。可以借助它来实现一些增强功能,在Spring当中就重度使用了Annotation,通过运行阶段动态的获取Annotation从而完成很多自定义的行为,所以如果不了解Annotation,那学习Spring就没有办法进行下去了。从另外一个角度来看,Annotation 也是-个Java类,只是这个类太特殊了点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8khcjGJT-1673275878172)(D:\1ar\youkedai\图片合集\图片16.png)]
-
target :只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围具体可以作用的类型配置在java. lang. annotation. ElementType
-
Retebtion :用于声明注解的生命周期,即有效性。1.SOURCE:也就是说是纯注释作用2.CL ASS:也就是在编译阶段是有效的3.RUNTIME:在运行时有效
-
Documented :将注解中的元素包含到JavaDoc文档中
-
@interface 就是声明当前java类型是Annotation ,固定语法
-
Annotation的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型: String、 boolean、 int、 long), 和属性名称(默认名称是value,在引用的时候可以省略),default 代表的是默认值。
spring bean
IoC (Inversion of Control 控制反转)容器时Spring框架最最核心的组件,没有IoC容器就没有Spring框架
通过依赖注入(Dependency injection)来实现IoC,获取Bean的实例直接从IoC容器中获取,不需要关心实现类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OlEVhH1-1673275878172)(D:\1ar\youkedai\图片合集\图片17.png)]
//启动IoC容器
ApplicationContext context =
new AnnotationConfigApplicationContext("fm.douban");
Spring 官方声明为Spring Bean 的注解有如下
org.springframework.stereotype.Service
扩展自Component 代表Service Beanorg.springframework.stereotype.Component
是通用的Bean 注解org.springframework.stereotype.Controller
Web Beanorg.springframework.stereotype.Repository
持久化相关Bean
依赖注入
-
完成容器的启动
-
完成依赖注入行为
-
作用,让Spring 系统自动管理各种实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CPCj8Ugb-1673275878173)(D:\1ar\youkedai\图片合集\图片18.png)]
Spring Resource
把本地文件、classpath文件,远程文件都封装成Resource 对象统一加载
Spring Boot
核心还是spring,web服务器做了什么
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iY6VUdRd-1673275878173)(D:\1ar\youkedai\图片合集\图片19.png)]
在Spring Boot方案里,一个网页请求到了服务器后,首先进入的是JavaWeb服务器,再进入SpringBoot应用,最后匹配到某一个Spring Controller,然后路由到具体摸一个bean的方法,执行完后返回结果输出到客户端
- http网络中对重要的协议
- get
- post
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NadV7dT-1673275878174)(D:\1ar\youkedai\图片合集\图片20.png)]
-
thymeleaf 是一个模板框架吗,支持多种格式内容的动态晕染,和html相融合-
-
初始化 添加Maven依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
-
-
th代表thymeleaf语法
-
th:each 循环语句
-
<ul th:each="song,it: ${songs}"> <li> <span th:text="${it.count}"></span> <span th:text="${song.name}"></span> </li> </ul>
-
th:if 条件语句
-
//${xxx}是固定语法 <span th:text="${msg}">Hello</span>
-
-
Spring Validation
-
JSR java Specification Requests 380:java规范提案。指JCP java community process 提出新增一个标准化技术规范的正式请求。
<dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
创建一个表单页 user/addUser.html模板文件
-
-
thymeleaf layout
-
th:include=“::content”是选择器
-
th:replace=“layout”页面会替换成layout
-
th:fragment=“content”
<div th:fragment="content"> </div>
-
-
Spring Boot ComponentScan
-
使用日志系统,两大步骤
-
配置 修改
Spring Boot
系统的标准配置文件:application.properties
(在项目的src/main/resources/
目录下),增加日志级别配置:logging.level.root=info -
编码
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController public class SongListControl { private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class); @PostConstruct public void init(){ LOG.info("SongListControl 启动啦"); } }
-
Spring Session
-
Cookie类的构造函数,第一个参数是cookie名称,第二个参数是coolie值。其他的属性,需要根据实际情况和具体的业务需求决定。
-
但是重要信息放入cookie,会带来安全隐患,不超过4kb
-
Session机制可以解决安全问题,放在服务端,没有限制,
-
依赖
<!-- spring session 支持 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency>
Spring Request 拦截器(HandlerInterceptor)
- 创建拦截器
HandlerInterceptor
接口。可以在三个点进行拦截:- Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在
preHandle()
方法中处理。 - Controller方法执行之后。例如记录日志、统计方法执行时间等,就要在
postHandle()
方法中处理。 - 整个请求完成后。不常用的拦截点。例如统计整个请求的执行时间的时候用,在
afterCompletion
方法中处理。
- Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class InterceptorDemo implements HandlerInterceptor {
// Controller方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 只有返回true才会继续向下执行,返回false取消当前请求
return true;
}
//Controller方法执行之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
// 整个请求完成后(包括Thymeleaf渲染完毕)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
preHandle()` 方法的参数中有 `HttpServletRequest` 和 `HttpServletResponse`,可以像 `control` 中一样使用 `Session
- 实现 WebMvcConfigurer
Spring Data CRUD,类似于数据库
-
新增数据 插入mongoTemplate.insert()
-
查询数据 findById() mongoTemplate.findById(songId, Song.class)
-
修改数据
// 修改 id=1 的数据 Query query = new Query(Criteria.where("id").is("1")); // 把歌名修改为 “new name” Update updateData = new Update(); updateData.set("name", "new name"); // 执行修改,修改返回结果的是一个对象 UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class); // 修改的记录数大于 0 ,表示修改成功 System.out.println("修改的数据记录数量:" + result.getModifiedCount());
-
删除数据
Song song = new Song();
song.setId(songId);
// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());
前端的
在这里插入图片描述