2020年应届毕业生自学两个月JAVA的历程
发布日期:2021-06-18 12:12:25 浏览次数:2 分类:技术文章

回想下一开始自学一个月,B站上找黑马的全套视频+材料,边学边做,一个月后终于过完了JAVA基础+高级,JAVA WEB,完成了第一个三层架构的项目(JSP+Servelt DAO、service和Bean全手写),就信心满满找工作去了…然后被虐的体无完肤
于是后面开始一边面试一边做总结,面试时录音,面试题拍照,回来复盘。针对经常问的点总结出自己的思路和说法,自己画图去辅助理解。
终于又历经一整个月在一次次失败后,找到了第一份工作。
在最后那一周,各种压力都混在一起,都快要放弃了…还好自己坚持住了,感谢自己
现在把当初总结的文档贡献出来,一是记录自己的心路历程,而是希望可以帮助到大家,祝愿看到这篇文章的人都能找到理想的工作

注:在图最后,但感觉只有我自己看得懂哈哈,仅供参考了。面试中被问到频率最高的知识点是数据库左右连接的概念,图附在最后

🔺🔺每日一遍背下来 面试过了就稳了
🔺🔺画图讲解+话述=完美面试(给别人讲最有助于记忆学习 这是适合自己的方法 比文字上的死记硬背强多了)

🔺画图讲解
String s =“a”+“b”+“c”;三个字符串相加会在内存中差产生五个字符串 StringBuilder 未被final修饰的数组 可变的字符串 StringBuffer线程安全(synchronized修饰方法)
String s1 = “A” 会在String池中创建对象 之后创建值相同对象指向该地址 始终只有一个内存地址被分配
String s2 = new String(“A”); new关键字都会在堆中创建新对象 equals(s1,s2)返回false 地址值不同

🔺画图讲解
单双列集合 未标明单线程都是 非线程安全的 多线程速度快> (Set通过map实现 只操作键) 集合来自数据集结构 用于存取信息
数组长度固定,存储同一类型数据。集合长度可以变化,存储的都是对象
ArrayList:底层数组 查询快删插慢 LinkedList:底层链表 查询慢删插快 Vector 单线程 允重有序有索引
HasSet: 同下 LinkedHasSet:同下 TreeSet 同下 不重无序无索引
HashMap 底层哈希表 查询快 LinkedHashMap 哈希表+链表(保证有序) TreeMap 二叉树实现 有序 HashTable 单线程(properties)
讲解点1:查找删插快慢实际上没有概念上那么简单 当对1W个元素测试时 (话术演练)
由于链表需要先遍历查找到元素再进行删插 在删插大量元素的中间元素时反而比删插需要移动大量元素的线性表要慢 具体情况具体分析
讲解点2:Hashmap的put方法在多线程情况下修改节点会造成操作覆盖 ||||||| HashTable用synchronized保证线程安全 但线程竞争激烈时效率低下(全局只有一把锁)
ConcurrentHashMap使用分段锁 多线程对不同段的操作不会相互影响 每个段使用一把锁 用于需线程安全的业务场景
讲解点3:遍历Map方式:keySet() /entrySet() 遍历Set集合

🔺画图讲解
查找排序算法(low hight mid) (i j temp) (i j temp tag) (i j temp k) (i j p)
线性表查询快 删插慢(具体描述)
唯一前驱后继 栈先进先出 队列后进先出 都有容量限制 串取值受限 数组长度固定 元素类型相同 有索引
前驱唯一后继不唯一 树层次关系 前驱后继都不唯一 网状关系
链表 查询慢 删插快(具体描述) 单链表头结点单向遍历 双向链表头尾节点双向遍历 循环链表任一点开始遍历

🔺🔺画图讲解
哈希表 存取快,JAVA中用hashCode方法计算key的哈希值得到要存取记录的存储位置
add先用hashCode计算元素哈希值在集合中找,若重复(哈希冲突)用equals比较,相同不存不同的时候以链表形式连接到后面。若链表长度超过阈值
就把表转成红黑树。反之链表长度低于6就转回链表。如果桶满了(容量16*加载因子0.75)就要扩容resize(扩容两倍后重新排列)
初始容量和加载(/负载)因子是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,加载(/负载)因子是哈希表在其容量自动增加之前可以达到多满的一种尺度
负载因子越大,对空间的利用更充分,然而后果是查找效率的降低。
负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。默认负载因子为0.75
红黑树:节点是红色或黑色的追求大致平衡的二叉查找树。每个结点到叶子结点经过黑色结点个数一样。
根结点是黑色。每个空的叶子结点(NIL)是黑色。红色结点的子结点是黑色的。
每个结点到叶子结点NIL所经过的黑色结点的个数一样的。[确保没有一条路径会比其他路径长出俩倍,所以红黑树是相对接近平衡的二叉树的!]
理解:红黑树插入为O(lgn),查询为O(lgn),链表插入为O(1),查询为O(n)。个数多时,查询成本高,用红黑树;个数少时,插入删除成本高,用链表;需要定一个值,比这个
值大就转红黑树,比这个值小就转链表,而且要避免频繁的转换。根据泊松分布,在负载因子0.75(HashMap默认)的情况下,单个hash槽内元素个数为8的概率小于百万分
之一,将7作为一个分水岭,等于7时不做转换,大于等于8才转红黑树,小于等于6才转链表。

🔺🔺画图讲解
多线程:进程(程序的动态执行 独立分配资源的单位) 线程(进程的执行单元,调度分配的基本单位) 一个进程拥有1到多个线程
进程有五种状态:新建 运行 就绪 阻塞 终止 使用线程通信方法wait()、notify 、sleep、join、interrupt等实现线程状态的转换
创建继承Thread的子类,重写run()方法实现Runnable接口,重写run()方法 .start开启新线程 单继承多实现
当多个线程操作同一份数据时就可能发生线程安全问题:
同步锁synchronized关键字创建同步代码块:Object锁对象,多个同一锁对象的synchronized代码块同一时间只有一个执行
锁对象:创建ReentrantLock对象,在同步代码前调用void lock()获取锁,在同步代码后调用void unlock()释放锁
Synchronized方法锁、对象锁、类锁区别:
方法锁(synchronized修饰方法时)声明为synchronized的成员函数中之多只有一个处于可执行状态,🔺从而有效避免了类成员变量的访问冲突。
对象锁(synchronized修饰方法或代码块 方法锁也是对象锁)调用对象的同步方法必须先获得对象锁。java的所有对象都含有一个互斥锁,这个锁由jvm自动获取和释放。
类锁(synchronized修饰静态的方法或者代码块)🔺对象锁是用来控制实例方法之间的同步🔺而类锁是用来控制静态方法之间的同步 只是概念并不存在
无状态锁–>偏向锁–>轻量级锁–>重量级锁
线程池:频繁创建销毁线程会降低系统效率 ExecutorService es = Executors.newFixedThreadPool(2); es.submit(new runnableimpl()); es.shutdown();

🔺画图讲解+话述=完美面试:(原理+情景模拟+目标+方法3)
话述:JAVA程序在JVM的方法区…栈…堆…,当程序使用对象内存满后触发fullGC,fullGC必须暂停用户线程,带来的系统卡顿现象或无响应 优化JVM减少此类现象
JVM优化原理:代码在方法区中加载,在栈中执行,所用对象在堆中存放,堆线程共享
程序使用的对象都在堆中存放,内存满后触发fullGC,fullGC必须暂停用户线程,导致系统卡顿现象或无响应
JVM调优目标:减少频繁长时间的fullGC带来的系统卡顿现象或无响应
JVM优化方法:减少创建对象的数量(StringBuilder)
堆内存调整(新生代老年代等组成了堆内存 对象在新生代创建 使用中逐渐过滤到老年代 内存满后触发fullGC 要减少Full GC的执行时间
当老年代内存过小时可能引起频繁Full GC,当内存过大时Full GC时间会特别长,通过测试调整合适的值适应不同的业务环境)
GC收集器合理选择(减少新生代对象转移到老年代的数量)

🔺画图讲解
数据库优化 画金字塔图https://blog.csdn.net/qq_40592933/article/details/90288265
1、sql语句和索引的优化 不使用子查询 建立临时表消耗资源;不要出现""来代替已知字段;合理建立索引 子查询//索引
2、表结构优化 字段属性优先使用小的数据类型;属性尽量not null减少一个判空步骤 ;将常用信息和不常用信息分表存储 小数据/not null/常不常用分表存储
3、系统配置和硬件优化成本高 效果却相对不显著
🔺画图讲解
数据库实施: 需求分析–>概念结构设计(E-R模型)–>逻辑结构设计(概念模型转数据模型 E-R图转二维关系表 关系规范化)–>物理设计–>数据库实施运维
软件工程:需求分析–>总体设计(流程图划分模块)–>详细设计(数据库)–>编码(选择语言)–>测试(黑白盒)–>运维

🔺
SSM:
三层架构与SSM对应关系: 浏览器 表现层/web层<Servlet+JSP SpringMVC框架>、业务逻辑层、持久层<DAO MyBatis框架> 数据库
•Spring在项目中就是提供IOC容器与AOP,在WEB层使用SpringMVC框架来处理请求,在持久层使用Mybatis封装JDBC实现动态SQL并将结果自动映射为Bean对象返回

Spring:是一个一站式的轻量级的java开发框架,核心是控制反转(IOC容器通过反射( 通过.class文件访问类)机制生成对象注入)和面向切面(AOP 动态代理)
IOC:反转Bean的创建权,service层创建dao层对象会造成过度耦合,spring中不再自行创建而是向IOC容器去要对象,将对象创建权交给IOC容器
减小对象耦合 简化对象管理
DI(依赖注入)就是给属性赋值
AOP就是根据动态代理分为切面,切入点和通知
•原先需要跨层new对象,Spring提供IOC容器以获取对象。
🔺实现方式:pom.xml中导入Spring坐标–>编写接口与实现类–>创建Spring核心配置文件.xml–>配置接口id标识–>service层获取对象
当service层需要对象时不再new而是Spring客户端.getBean(id标识)方式获取对象。使用SpringAPI获得Bean实例
Spring通过id标识获得Bean,通过反射获得对象,最后返回给方法调用处。
XML核心配置文件中语句: 也可使用注解方式配置
创建对象时代码:ApplicationContext app = new ClassPathXmlApplicationContext(核心配置文件名称 默认叫"applicationContext.xml");
UserDao userdao = (UserDao)app.getBean(需要创建对象的dao类的id标识""); userdao.方法;

MVC: model(数据封装与逻辑处理) view(展示数据视图) control(分发指派)
SpringMVC:是spring基础之上的一个MVC框架,主要处理web层开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分
•原先使用java类实现servlet接口来实现处理请求的逻辑控制,springMVC抽取的前端控制器与请求对应的POJO来实现处理请求的逻辑控制
WEB层功能:接收请求参数–>封装实体–>访问业务层–>接收返回结果–>指派页面
框架抽取共有行为成为前端控制器,再去找请求所需要的POJP/JavaBean(映射适配执行返回解析渲染)
🔺实现方式:pom.xml中导入SpringMVC坐标–>web.xml配置框架抽取出来的共有的前端控制器DispatcherServelt(每个请求都要过)–>编写特有的POJO也叫控制器
Controller放到IOC容器中(注解@Controller)–>创建视图–>在spring-mvc.xml中配置组件扫描
web.xml配置前端控制器语句: 用作前端控制器servelt文件名 全类名地址
1服务器启动时就创建而非访问时
用作前端控制器servelt文件名 同上
/任何请求都要走 *.xxx请求资源扩展名相同时走
编写特有的Controller:java类与方法,方法跳转到视图 return JSP名;
Controller放到IOC容器中:类名前加注解@Controller 请求映射方法注解@RequestMapping("/名称")加在方法前 访问时自动映射方法执行逻辑并返回JSP视图
在spring-mvc.xml中配置组件扫描:

Mybatis:1、封装JDBC 不需要手动加载驱动、创建链接 通过xml或注解的方式来配置
2、独立动态的SQL 通过Bean对象与配置中的动态参数映射生成最终的sql语句
3、执行语句后将结果映射为对象并返回

springBoot:简化配置,实现快速开发(嵌入应用服务器tomcat等不用部署war包、自动配置依赖、提供启动器简化配置)
🔺实现方式:创建工程–>添加依赖(启动器依赖,spring-boot-starter-web)–>创建启动类–>创建处理器Controller–>测试

springcloud:基于springBoot实现,整合管理springBoot的单体微服务

🔺
JDBC配置方式
–>导入驱动jar包
–>注册驱动 Class.forName(“com.mysql.jdbc.Driver”);
–>获取数据库连接对象 Connection root = DriverManager.getConnection(“jdbc:mysql://localhost:3306/db1”, “root”, “2050289910”);
–>定义sql String sql = “update student1 set age = 99 where id = 8”;
–>获取sql语句执行对象 Statement stmt = root.createStatement();
–>执行sql接收返回结果 int count = stmt.executeUpdate(sql);

🔺项目功能实现方式
公司人员信息管理系统实现登录
验证操作
对公司人员信息的添加、修改
删除选中条目 根据页面选中条目得参数删除数据
分页查询 设置页面参数(当前页码和显示条数)/pageBean(总记录数 总页数 每页展示得数据 当前页码和显示条数)
servelt获取参数后查调用服务层方法获取pageBean封装转发JSP 服务层调用dao层方法获得pageBean参数
复杂查询 将查询条件封装作为参数组成动态SQL语句再将查询结果返回页面

🔺
索引:数据库只做两件事,存储数据和检索数据。 索引就是存储数据本身外保存的路标,以减少检索时间。
一张表可建立任意个索引,每个索引可以是任意个字段的组合,索引会提高查询速度,也会减慢写入速度。
CREATE INDEX 索引名 ON 表名(列名1,列名2,列名3); 相当于建立了三个索引 单列索引(列1) 复合索引(列1 列2) 复合索引(列1 列2 列3)
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

🔺
Redis 就是一个内存中的数据库,速度快。
Key-Value数据库,V可以是String、list(队列 允许重复)、Set(无序集合 不允许重复)、Sortedset(有序集合 不允许重复)、Hash(hashmap)等类型
操作:String set key value get key del key redis中文网内涵所有命令
List lpush key value rpush key value lrange key start end(0 -1) lpop key rpop key 相当于队列
Set sadd key value smembers key srem key value
Sortedset zadd key score value zrange key start end zren key value 存储score来保证有序
Hash hset key field value hget key field hdel key filed hgetall
通用 keys * 查询所有键 type ley获取键对应value的类型 del key删除指定key value
持久化:RDB默认方式:间隔时间检测key后持久化保存 性能影响小 修改conf配置文件重启redis服务器指定配置文件
AOF方式:每一条命令操作持久化保存数据 性能影响大 同上
被广泛应用于缓存方向,实现"高性能”和“高并发”
高性能:将用户访问的数据存在缓存中,提高读写速度
高并发:把数据库中的部分数据转移到缓存中去,这样用户请求会到缓存而不经过数据库
Jedis java操作redis数据库的工具jar包
对比JDBC: 导入驱动jar包 注册驱动 获取数据库连接对象 定义sql 获取sql语句执行对象statement 执行sql接收返回结果 处理结果 释放资源
Jedis:获取连接Jedis js = new Jedis(“localhost”,6379); 操作set、get… 关闭连接js.close
🔺
JSP
擅长表现于页面显示;jsp经编译后就变成了Servlet; 内容包括三剑客、EL表达式(${域名.键名})、JSTL标签库(<c:if、<c:choose>、<c:forEach)
也可包括Jquery、Bootstrap等框架
对象(page当前页Servlet对象、request、response、session一次会话、application所有用户间共享数据、pageContext当前页面共享数据、
out字符输出流对象、configServlet配置对象、exception)
作用域page(当前页)、request(同一个请求中 forward转发)、session(同一个会话中使用)、application(在所有应用程序中有效)
Servlet
擅长于逻辑控制,是个完整的Java类,这个类的Service方法用于生成对客户端的响应
生命周期:服务器加载Sevrlet、请求时创建Sevrlet、init()初始化、service()处理用户请求(可多次调用)、destory()销毁

🔺
HTTP 基于TCP/IP与请求响应模型 请求/响应 行/头/体
POST(参数在请求体中 没有长度限制)/GET(参数在请求行中URL后 长度限制 相对不安全)
session服务器端 没有大小限制 数据安全,cookie客户端 有大小限制 相对不安全
状态码:1xx请求未完成 2xx请求成功 3xx重定向/访问缓存 4xx客户端错误 5xx服务器端错误

🔺
事务:一个包含多个步骤的操作被事务管理,那么操作要么同时成功,要么同时失败(例如转账:查余额、扣钱、加钱。没有事务加钱异常钱就不翼而飞了)
四大特性:
原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:事务提交或回滚后,数据库会持久化保存数据
隔离性:多个事务间,相互独立。–事务隔离级别<多个事务操同一数据会引发问题>
一致性:事务操作前后数据总量不变。
隔离级别:
read uncommitted:读取未提交 会产生脏读、不可重复读、幻读
read committed:读取已提交 会产生不可重复读、幻读
repeatable read:可重复读 会产生幻读
serializable:串行化
操作包含:开启(start transaction)、回滚(rollback)、提交(commit)

🔺JS
5+3数据类型:undefined、null、Boolean、number、string object、array、function
检测变量类型:typeof(obj)===?
代码练习
JSON比XML更小更快更易解析交互,XML数据描述性好

🔺数据库
数据定义语言(DDL)、数据操纵语言(DML:Data Manipulation Language)、数据查询语言(DQL: Data Query Language)
常用函数:
聚合函数:avg、count、min、max、sum
系统信息函数:database、version、user
类型转化函数:cast()
格式化函数:date_format(date,fmt) 依照字符串fmt格式化日期date值、format(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数、time_format(time,fmt) 依照字符串fmt格式化时间time值
控制流函数:if(test,t,f) 如果test是真,返回t;否则返回f
ifnull(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
nullif(arg1,arg2) 如果arg1=arg2返回null;否则返回arg1
case [test] when[val1] then [result]…else [default]end 如果test和valn相等,则返回resultn,否则返回default
case when[test1] then [result1]…else [default] end如果testn是真,则返回resultn,否则返回default
数学函数:abs(x) 返回x的绝对值、bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)
ceiling(x) 返回大于x的最小整数值、floor(x) 返回小于x的最大整数值
ln(x) 返回x的自然对数、log(x,y)返回x的以y为底的对数、mod(x,y) 返回x/y的模(余数)、pi()返回pi的值(圆周率)
rand()返回0到1内的随机值,可以通过提供一个参数(种子)使rand()随机数生成器生成一个指定的值、round(x,y)返回参数x的四舍五入的有y位小数的值
sqrt(x) 返回一个数的平方根、truncate(x,y) 返回数字x截短为y位小数的结果
字符串函数:ascii(char)返回字符的ascii码值、bit_length(str)返回字符串的比特长度、length(s)返回字符串str中的字符数
concat(s1,s2…,sn)将s1,s2…,sn连接成字符串、position(substr in str) 返回子串substr在字符串str中第一次出现的位置
upper(str)、lower(str)

临时表:大量数据查询、临时数据操作、多表联查时为提升效率,可使用临时表
更高效得查询速度,不用担心死锁问题。但一旦数据丢失临时表无法恢复
CREATE TEMPORARY TABLE [IF NOT EXISTS] 临时表名(字段1 约束1,字段2 约束2,…);
CREATE TEMPORARY TABLE [IF NOT EXISTS] 临时表名 [AS] SELECT 查询字段 FROM 业务表 [WHERE 条件];

🔺CSS 属性 选择器
CLASS .CLASS
ID #ID
属性选择器 [title]
属性和值选择器 [title=runoob]
属性和多值选择器 ~= 完整单词:[title~=flower] -->
|= 完整单词: [lang|=en] -->


= 拼接字符:[title=flower] -->
^= 开头 [lang^=en] -->


$= 结尾

编码表:GB(K、18030 2字节存中文)、ASCII、Unicode(utf-8、16、32 3字节存储中文)万国码等 一个中文: GBK两字节;UTF-8三字节

JDK JRE 关系
JAVA语言特点:面向对象、类库(JUnit单元测试库 Apache POI读写库 数据库连接池库 JSON解析库 )
跨平台、多线程 (函数式编程对行为抽象/面向对象编程对数据进行抽象)

←1024 3306 1521 8080 java.net.ServerSocket类 java.net.Socket类 Socket socket = new Socket(“127.0.0.1”,8888); 协议端口号IP地址
只能使用网络字节输入/出流 ServerSocket server = new ServerSocket(8888); Socket socket = server.accept(); OutputStream os = socket.getOutputStream();
jsp/servlet、php、asp 运行在服务器端

异常:
java.lang.Error; <错误> 只能手动修改源码
RuntimeException; <运行异常>(默认交给JVM 不处理)
java.lang.Exception; <编译异常> throws(中断)/trycatch(继续执行 try<可能出现异常的代码> catch()<异常处理逻辑>

IO流:java.io.OutputStream/InputStream、java.io.Reader/Writer、java.io.Buffered+OutputStream/InputStream、java.io.OutputStreamWriter
/InputStreamReader、java.io.PrintStream(System.setOut(PrintStream out))、java.io.Object+OutputStream/InputStream、java.util.
Properties(保存在流中或从流中加载、唯一和IO流相结合的集合 store()、load()) 字节字符缓冲转换打印 序列化
Stream流:Stream stream1 = list1.stream().filter(s -> s.length() == 3).limit(3); list.stream()/streamof()
Stream stream2 = list2.stream().filter(name -> name.startsWith(“张”)).skip(2);
Stream.concat(stream1,stream2).map(s->new Person(s)).forEach(s-> System.out.println(s));
filter(过滤) limit-skip(截取跳过) map(映射) foreach(count)(终结:遍历输出、计数)

重点代码 网络编程test

匿名内部类匿名对象:new Thread( new Runnableimpl(){…} ).start(); λ表达式: new Thread( ()->… ).start(); runnable只有一个run方法
λ(函数式编程):在调用函数式接口时使用 (函数式编程对行为抽象/面向对象编程对数据进行抽象)
(重写方法参数)->{重写方法体}; 重写方法参数只有一个时,参数类型、小括号,方法体大括号,分号、return都可以省略
方法引用优化λ: printString((s)->{System.out.println(s); }); 优化后: printString(System.out::println);
this关键字调用本类方法 this::方法名 super关键字调用父类方法 super::方法名
类的构造器(构造方法)引用 类名::new 数组构造器的引用 数组类型[]::new
对象名引用成员方法 对象名::方法名) 通过类名引用静态成员方法 类名::静态方法名

Junit 测试类
反射 指程序访问、检测修改它本身的能力 通过.class文件访问类
注解 也叫元数据,可以在编译,类加载,运行时被读取 (@Override @FunctionalInterface)

JDBC:CONNECTIVITY Java数据库连接 面向接口编程,真正执行的代码是jar包中的实现类
官方定义的一套操作所有关系型数据库的接口,各个数据库厂商实现这套接口,提供数据库驱动jar包,我们可以使用这套
sql: 习题多用分组查询、子查询

方法区:<线程共享 class和static、方法信息> 栈区:<一个线程一个栈 方法执行区 基础数据类型、引用对象地址> 堆区:<线程共享 对象本身>
代码在方法区中加载,方法在栈中执行,所用对象在堆中存放 压栈执行

TCP/IP第一,为了确认双方的接收与发送能力是否正常。第二,指定自己的初始化序列号,为后面的可靠传送做准备。
第三,如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。
第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。
第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y和确认序列号(
期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。
第三次握手: 客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包
的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。

Java web:
前端:
一、HTML 超文本标记语言 HTML5参考手册
标签:




属性color 单词、rgb值(11,11,11)、#FFFFFF width 数值、百分比 url: ./、…/相对路径
    • <a href="" target"打开方式">
      块标签占满一行
      行内标签
      头内容
      尾内容
      单元格 表头单元格
      🔺表单 采集输入数据与服务器交互 定义了采集用户数据的范围
      提交方式包括get(封装到请求行中会显示在地址栏内 大小限制 不太安全 ) post(封装在请求体中 大小无限制 较为安全)
      text、password、radio、checkbox、submit、file、hidden(隐藏域)、button、image src、color(拾色器)、date、datetime-local、email 、number

后端:
一、JSP
JSP对象pageContext PageContext 当前页面共享数据 也可获取其他八个对象
request HttpServletRequest 一次请求
response HttpServletResponse 一次响应
session HttpSession 一次会话多个请求间
application ServletContext 所有用户间共享数据
page Object 当前页Servlet对象 this
config ServletConfig Servlet配置对象x
exception Throwable 异常对象
作用域page(当前页)、request(同一个请求中 forward转发)、session(同一个会话中使用)、application(在所有应用程序中有效)
二、Servlet
Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应
生命周期:服务器加载Sevrlet、请求时创建Sevrlet、init()初始化、service()处理用户请求(可多次调用)、destory()销毁
JSP更擅长表现于页面显示,servlet更擅长于逻辑控制;jsp经编译后就变成了Servlet;
三、HTTP
基于TCP/IP与请求响应模型 (请求行GET/login.html HTTP/1.1 、 请求头 浏览器向服务器发送自身信息、请求体 封装POST请求参数)
POST(参数在请求体中 没有长度限制)/GET(参数在请求行中URL后 长度限制 相对不安全)
session服务器端 没有大小限制 数据安全,cookie客户端 有大小限制 相对不安全
状态码:1xx请求未完成 2xx请求成功 3xx重定向/访问缓存 4xx客户端错误 5xx服务器端错误

四、三层架构与SSM

五、其他
EL表达式${域名.键名}+JSTL标签库
过滤器(Filter):过滤器就是过滤的作用,在web开发中过滤一些我们指定的url,比如过拦截掉我们不需要的接口请求,修改请求(request)和响应(
response)内容,完成CORS跨域请求等等
拦截器(Interceptor):是面向切面编程(AOP,Aspect Oriented Program)的。就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法。
比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时
候做业务逻辑的操作
AJAX:“Asynchronous Javascript And XML”(异步 JavaScript 和 XML).创建交互式、快速动态网页应用的网页开发技术
Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新
使用Jquery实现AJAX JS标签方法体中 $.ajax({url:“请求路径”,type:“请求方式”,data:{JSON格式数据},});、
JavaBean 工具(封装标准Java类) 标准Java类:类是public的 提供空参构造器 成员变量是private的 提供公共的setter和getter方法
setProperty()设置属性值、getProperty()获取属性值
populate(Object obj,Map map)将map集合数据封装到对应的JavaBean对象中

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上一篇:2020-09-03
下一篇:FineReport帆软学习笔记汇总

关于作者

    白红宇是个全栈工程师,前端vue,小程序,app开发到后端框架设计,数据库设计,环境部署上线运维。

最新文章