mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
docs: update docs
This commit is contained in:
parent
cf9e96aa6c
commit
7f877f8e5f
@ -31,7 +31,7 @@ tag:
|
|||||||
|
|
||||||
不知道其他公司的程序员是怎么样的?我感觉技术积累很大程度在乎平时,单纯依靠工作绝大部分情况只会加快自己做需求的熟练度,当然,写多了之后或多或少也会提升你对代码质量的认识(前提是你有这个意识)。
|
不知道其他公司的程序员是怎么样的?我感觉技术积累很大程度在乎平时,单纯依靠工作绝大部分情况只会加快自己做需求的熟练度,当然,写多了之后或多或少也会提升你对代码质量的认识(前提是你有这个意识)。
|
||||||
|
|
||||||
工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security+JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,Github 地址:https://github.com/Snailclimb/spring-security-jwt-guide 。以次为契机,我还分享了
|
工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security+JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,Github 地址:<https://github.com/Snailclimb/spring-security-jwt-guide> 。以次为契机,我还分享了
|
||||||
|
|
||||||
- [《一问带你区分清楚 Authentication,Authorization 以及 Cookie、Session、Token》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485626&idx=1&sn=3247aa9000693dd692de8a04ccffeec1&chksm=cea24771f9d5ce675ea0203633a95b68bfe412dc6a9d05f22d221161147b76161d1b470d54b3&token=684071313&lang=zh_CN&scene=21#wechat_redirect)
|
- [《一问带你区分清楚 Authentication,Authorization 以及 Cookie、Session、Token》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485626&idx=1&sn=3247aa9000693dd692de8a04ccffeec1&chksm=cea24771f9d5ce675ea0203633a95b68bfe412dc6a9d05f22d221161147b76161d1b470d54b3&token=684071313&lang=zh_CN&scene=21#wechat_redirect)
|
||||||
- [JWT 身份认证优缺点分析以及常见问题解决方案](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485655&idx=1&sn=583eeeb081ea21a8ec6347c72aa223d6&chksm=cea2471cf9d5ce0aa135f2fb9aa32d98ebb3338292beaccc1aae43d1178b16c0125eb4139ca4&token=1737409938&lang=zh_CN#rd)
|
- [JWT 身份认证优缺点分析以及常见问题解决方案](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485655&idx=1&sn=583eeeb081ea21a8ec6347c72aa223d6&chksm=cea2471cf9d5ce0aa135f2fb9aa32d98ebb3338292beaccc1aae43d1178b16c0125eb4139ca4&token=1737409938&lang=zh_CN#rd)
|
||||||
|
@ -122,7 +122,7 @@ tag:
|
|||||||
|
|
||||||
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
|
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
|
||||||
|
|
||||||
Markdown 规范请参考:**https://javaguide.cn/javaguide/contribution-guideline.html** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
|
Markdown 规范请参考:**<https://javaguide.cn/javaguide/contribution-guideline.html>** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
|
||||||
|
|
||||||
## 有没有什么写作技巧分享?
|
## 有没有什么写作技巧分享?
|
||||||
|
|
||||||
|
@ -138,4 +138,3 @@ star: 2
|
|||||||
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
|
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
|
||||||
|
|
||||||
**星球提供的服务质量还是很高的,非常适合准备面试的同学。我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
**星球提供的服务质量还是很高的,非常适合准备面试的同学。我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||||
|
|
||||||
|
@ -16,8 +16,6 @@ head:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
|
如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
|
||||||
|
|
||||||

|

|
||||||
|
@ -115,7 +115,7 @@ ER 图由下面 3 个要素组成:
|
|||||||
- `truncate` (清空数据) : `truncate table 表名` ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
|
- `truncate` (清空数据) : `truncate table 表名` ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
|
||||||
- `delete`(删除数据) : `delete from 表名 where 列名=值`,删除某一行的数据,如果不加 `where` 子句和`truncate table 表名`作用类似。
|
- `delete`(删除数据) : `delete from 表名 where 列名=值`,删除某一行的数据,如果不加 `where` 子句和`truncate table 表名`作用类似。
|
||||||
|
|
||||||
`truncate` 和不带 where``子句的 `delete`、以及 `drop` 都会删除表内的数据,但是 **`truncate` 和 `delete` 只删除数据不删除表的结构(定义),执行 `drop` 语句,此表的结构也会删除,也就是执行 `drop` 之后对应的表不复存在。**
|
`truncate` 和不带 `where`子句的 `delete`、以及 `drop` 都会删除表内的数据,但是 **`truncate` 和 `delete` 只删除数据不删除表的结构(定义),执行 `drop` 语句,此表的结构也会删除,也就是执行`drop` 之后对应的表不复存在。**
|
||||||
|
|
||||||
### 属于不同的数据库语言
|
### 属于不同的数据库语言
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ tag:
|
|||||||
- 数据库基础
|
- 数据库基础
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
MySQL 字符编码集中有两套 UTF-8 编码实现:**`utf8`** 和 **`utf8mb4`**。
|
MySQL 字符编码集中有两套 UTF-8 编码实现:**`utf8`** 和 **`utf8mb4`**。
|
||||||
|
|
||||||
如果使用 **`utf8`** 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。
|
如果使用 **`utf8`** 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。
|
||||||
@ -73,7 +72,7 @@ BIG5 主要针对的是繁体中文,收录了 13000 多个汉字。
|
|||||||
|
|
||||||
就比如说你使用 UTF-8 编码方式打开 GB2312 编码格式的文件就会出现乱码。示例:“牛”这个汉字 GB2312 编码后的十六进制数值为 “C5A3”,而 “C5A3” 用 UTF-8 解码之后得到的却是 “ţ”。
|
就比如说你使用 UTF-8 编码方式打开 GB2312 编码格式的文件就会出现乱码。示例:“牛”这个汉字 GB2312 编码后的十六进制数值为 “C5A3”,而 “C5A3” 用 UTF-8 解码之后得到的却是 “ţ”。
|
||||||
|
|
||||||
你可以通过这个网站在线进行编码和解码:https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan
|
你可以通过这个网站在线进行编码和解码:<https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -152,9 +151,9 @@ Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'name' at row 1
|
|||||||
|
|
||||||
## 参考
|
## 参考
|
||||||
|
|
||||||
- 字符集和字符编码(Charset & Encoding): https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
|
- 字符集和字符编码(Charset & Encoding): <https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html>
|
||||||
- 十分钟搞清字符集和字符编码:http://cenalulu.github.io/linux/character-encoding/
|
- 十分钟搞清字符集和字符编码:<http://cenalulu.github.io/linux/character-encoding/>
|
||||||
- Unicode-维基百科:https://zh.wikipedia.org/wiki/Unicode
|
- Unicode-维基百科:<https://zh.wikipedia.org/wiki/Unicode>
|
||||||
- GB2312-维基百科:https://zh.wikipedia.org/wiki/GB_2312
|
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
|
||||||
- UTF-8-维基百科:https://zh.wikipedia.org/wiki/UTF-8
|
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
|
||||||
- GB18030-维基百科: https://zh.wikipedia.org/wiki/GB_18030
|
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>
|
||||||
|
@ -20,7 +20,7 @@ NoSQL 数据库代表:HBase 、Cassandra、MongoDB、Redis。
|
|||||||
## SQL 和 NoSQL 有什么区别?
|
## SQL 和 NoSQL 有什么区别?
|
||||||
|
|
||||||
| | SQL 数据库 | NoSQL 数据库 |
|
| | SQL 数据库 | NoSQL 数据库 |
|
||||||
| :----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
| :----------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档:JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
|
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档:JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
|
||||||
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
|
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
|
||||||
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档:MongoDB、CouchDB,键值:Redis 、DynamoDB,宽列:Cassandra 、 HBase,图表:Neo4j 、 Amazon Neptune、Giraph |
|
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档:MongoDB、CouchDB,键值:Redis 、DynamoDB,宽列:Cassandra 、 HBase,图表:Neo4j 、 Amazon Neptune、Giraph |
|
||||||
|
@ -24,7 +24,6 @@ icon: "configuration"
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
@ -33,7 +32,6 @@ icon: "configuration"
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||||
|
|
||||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
||||||
@ -46,7 +44,6 @@ icon: "configuration"
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
@ -394,6 +394,3 @@ private static class LockData
|
|||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
这篇文章我们介绍了分布式锁的基本概念以及实现分布式锁的两种常见方式。至于具体选择 Redis 还是 ZooKeeper 来实现分布式锁,还是要看业务的具体需求。如果对性能要求比较高的话,建议使用 Redis 实现分布式锁。如果对可靠性要求比较高的话,建议使用 ZooKeeper 实现分布式锁。
|
这篇文章我们介绍了分布式锁的基本概念以及实现分布式锁的两种常见方式。至于具体选择 Redis 还是 ZooKeeper 来实现分布式锁,还是要看业务的具体需求。如果对性能要求比较高的话,建议使用 Redis 实现分布式锁。如果对可靠性要求比较高的话,建议使用 ZooKeeper 实现分布式锁。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ category: 高可用
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
@ -30,7 +29,6 @@ category: 高可用
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||||
|
|
||||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
||||||
@ -43,7 +41,6 @@ category: 高可用
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
@ -85,7 +85,7 @@ category: 高可用
|
|||||||
理清他们的概念,就很容易搞清楚他们之间的关系了。
|
理清他们的概念,就很容易搞清楚他们之间的关系了。
|
||||||
|
|
||||||
- **QPS(TPS)** = 并发数/平均响应时间
|
- **QPS(TPS)** = 并发数/平均响应时间
|
||||||
- **并发数** = QPS*平均响应时间
|
- **并发数** = QPS\*平均响应时间
|
||||||
|
|
||||||
书中是这样描述 QPS 和 TPS 的区别的。
|
书中是这样描述 QPS 和 TPS 的区别的。
|
||||||
|
|
||||||
|
@ -68,4 +68,3 @@ category: 高可用
|
|||||||
|
|
||||||
- 微服务之间调用超时的设置治理:https://www.infoq.cn/article/eyrslar53l6hjm5yjgyx
|
- 微服务之间调用超时的设置治理:https://www.infoq.cn/article/eyrslar53l6hjm5yjgyx
|
||||||
- 超时、重试和抖动回退:https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/
|
- 超时、重试和抖动回退:https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/
|
||||||
|
|
||||||
|
@ -120,9 +120,6 @@ http://cdn.wangsu.com/4/123.mp3? wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTim
|
|||||||
|
|
||||||
## 参考
|
## 参考
|
||||||
|
|
||||||
- 时间戳防盗链 - 七牛云 CDN:https://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention
|
- 时间戳防盗链 - 七牛云 CDN:<https://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention>
|
||||||
- CDN是个啥玩意?一文说个明白:https://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw
|
- CDN 是个啥玩意?一文说个明白:<https://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw>
|
||||||
- 《透视 HTTP 协议》- 37 | CDN:加速我们的网络服务:http://gk.link/a/11yOG
|
- 《透视 HTTP 协议》- 37 | CDN:加速我们的网络服务:<http://gk.link/a/11yOG>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ public class CustomLoadBalancerConfiguration {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
关于Spring Cloud Load Balancer更详细更新的介绍,推荐大家看看官方文档:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer ,一切以官方文档为主。
|
关于 Spring Cloud Load Balancer 更详细更新的介绍,推荐大家看看官方文档:<https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer> ,一切以官方文档为主。
|
||||||
|
|
||||||
轮询策略基本可以满足绝大部分项目的需求,我们的实际项目中如果没有特殊需求的话,通常使用的就是默认的轮询策略。并且,Ribbon 和 Spring Cloud Load Balancer 都支持自定义负载均衡策略。
|
轮询策略基本可以满足绝大部分项目的需求,我们的实际项目中如果没有特殊需求的话,通常使用的就是默认的轮询策略。并且,Ribbon 和 Spring Cloud Load Balancer 都支持自定义负载均衡策略。
|
||||||
|
|
||||||
@ -231,6 +231,6 @@ Spring Cloud 2020.0.0 版本移除了 Netflix 除 Eureka 外的所有组件。Sp
|
|||||||
|
|
||||||
## 参考
|
## 参考
|
||||||
|
|
||||||
- 干货 | eBay 的 4 层软件负载均衡实现:https://mp.weixin.qq.com/s/bZMxLTECOK3mjdgiLbHj-g
|
- 干货 | eBay 的 4 层软件负载均衡实现:<https://mp.weixin.qq.com/s/bZMxLTECOK3mjdgiLbHj-g>
|
||||||
- HTTP Load Balancing(Nginx 官方文档):https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
|
- HTTP Load Balancing(Nginx 官方文档):<https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/>
|
||||||
- 深入浅出负载均衡 - vivo 互联网技术:https://www.cnblogs.com/vivotech/p/14859041.html
|
- 深入浅出负载均衡 - vivo 互联网技术:<https://www.cnblogs.com/vivotech/p/14859041.html>
|
||||||
|
@ -210,4 +210,3 @@ ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere
|
|||||||
- **分库** 就是将数据库中的数据分散到不同的数据库上。**分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
|
- **分库** 就是将数据库中的数据分散到不同的数据库上。**分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
|
||||||
- 引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
|
- 引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
|
||||||
- ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。另外,ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
|
- ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。另外,ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# 程序人生
|
# 程序人生
|
||||||
|
|
||||||
::: tip 这是一则或许对你有用的小广告
|
::: tip 这是一则或许对你有用的小广告
|
||||||
|
@ -54,4 +54,3 @@ category: 知识星球
|
|||||||
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
|
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -111,4 +111,3 @@ Github 或者码云上面有很多实战类别项目,你可以选择一个来
|
|||||||
并且,你还可以自定义检查规则。
|
并且,你还可以自定义检查规则。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -40,4 +40,3 @@ JavaGuide 这个项目诞生一年左右就有出版社的老师联系我了,
|
|||||||
- ......
|
- ......
|
||||||
|
|
||||||
这几年一直在默默完善,真心希望 JavaGuide 越来越好,帮助到更多朋友!也欢迎大家参与进来!
|
这几年一直在默默完善,真心希望 JavaGuide 越来越好,帮助到更多朋友!也欢迎大家参与进来!
|
||||||
|
|
||||||
|
@ -17,5 +17,3 @@ category: 走近项目
|
|||||||
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/827996e7722fd51718863d4bee156a8c6c759ff5) : 移除了开发工具的部分内容。
|
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/827996e7722fd51718863d4bee156a8c6c759ff5) : 移除了开发工具的部分内容。
|
||||||
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/5a5f8ccb3bfb8d6ba8ac41295f1a1e4555395260) : vuepress-theme-hope 主题更新升级(比较重要的一次主题更新,从 1.x 版本升级到 2.x 版本,网站性能提升)。
|
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/5a5f8ccb3bfb8d6ba8ac41295f1a1e4555395260) : vuepress-theme-hope 主题更新升级(比较重要的一次主题更新,从 1.x 版本升级到 2.x 版本,网站性能提升)。
|
||||||
- [2021-11-09](https://github.com/Snailclimb/JavaGuide/commit/dc45389934b7763f4f9789168f71c72ef303d3c4) : 基于 vuepress 重构整个项目,提升阅读体验。
|
- [2021-11-09](https://github.com/Snailclimb/JavaGuide/commit/dc45389934b7763f4f9789168f71c72ef303d3c4) : 基于 vuepress 重构整个项目,提升阅读体验。
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,4 +11,3 @@ category: 走近项目
|
|||||||
- [ ] 分布式常见理论和算法总结完善
|
- [ ] 分布式常见理论和算法总结完善
|
||||||
|
|
||||||
欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](./contribution-guideline.md) 。
|
欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](./contribution-guideline.md) 。
|
||||||
|
|
||||||
|
@ -9,4 +9,3 @@ icon: big-data
|
|||||||
- **[HBase](https://hbase.apache.org/)**: HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
|
- **[HBase](https://hbase.apache.org/)**: HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
|
||||||
- **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
|
- **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
|
||||||
- **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。
|
- **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。
|
||||||
|
|
||||||
|
@ -8,4 +8,3 @@ icon: a-MachineLearning
|
|||||||
- **[Smile](https://github.com/haifengl/smile)** :基于 Java 和 Scala 的机器学习库。
|
- **[Smile](https://github.com/haifengl/smile)** :基于 Java 和 Scala 的机器学习库。
|
||||||
|
|
||||||
相关阅读:[Java 能用于机器学习和数据科学吗?-InfoQ](https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph)
|
相关阅读:[Java 能用于机器学习和数据科学吗?-InfoQ](https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph)
|
||||||
|
|
||||||
|
@ -1,31 +1,3 @@
|
|||||||
点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
|
|
||||||
|
|
||||||
<!-- MarkdownTOC -->
|
|
||||||
|
|
||||||
- [Servlet总结](#servlet总结)
|
|
||||||
- [阐述Servlet和CGI的区别?](#阐述servlet和cgi的区别)
|
|
||||||
- [CGI的不足之处:](#cgi的不足之处)
|
|
||||||
- [Servlet的优点:](#servlet的优点)
|
|
||||||
- [Servlet接口中有哪些方法及Servlet生命周期探秘](#servlet接口中有哪些方法及servlet生命周期探秘)
|
|
||||||
- [get和post请求的区别](#get和post请求的区别)
|
|
||||||
- [什么情况下调用doGet\(\)和doPost\(\)](#什么情况下调用doget和dopost)
|
|
||||||
- [转发(Forward)和重定向(Redirect)的区别](#转发forward和重定向redirect的区别)
|
|
||||||
- [自动刷新\(Refresh\)](#自动刷新refresh)
|
|
||||||
- [Servlet与线程安全](#servlet与线程安全)
|
|
||||||
- [JSP和Servlet是什么关系](#jsp和servlet是什么关系)
|
|
||||||
- [JSP工作原理](#jsp工作原理)
|
|
||||||
- [JSP有哪些内置对象、作用分别是什么](#jsp有哪些内置对象、作用分别是什么)
|
|
||||||
- [Request对象的主要方法有哪些](#request对象的主要方法有哪些)
|
|
||||||
- [request.getAttribute\(\)和 request.getParameter\(\)有何区别](#requestgetattribute和-requestgetparameter有何区别)
|
|
||||||
- [include指令include的行为的区别](#include指令include的行为的区别)
|
|
||||||
- [JSP九大内置对象,七大动作,三大指令](#jsp九大内置对象,七大动作,三大指令)
|
|
||||||
- [讲解JSP中的四种作用域](#讲解jsp中的四种作用域)
|
|
||||||
- [如何实现JSP或Servlet的单线程模式](#如何实现jsp或servlet的单线程模式)
|
|
||||||
- [实现会话跟踪的技术有哪些](#实现会话跟踪的技术有哪些)
|
|
||||||
- [Cookie和Session的的区别](#cookie和session的的区别)
|
|
||||||
|
|
||||||
<!-- /MarkdownTOC -->
|
|
||||||
|
|
||||||
## Servlet 总结
|
## Servlet 总结
|
||||||
|
|
||||||
在 Java Web 程序中,**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数,供 Servlet 内部使用。一个 Servlet 类只会有一个实例,在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet 需要在 web.xml 中配置(MyEclipse 中创建 Servlet 会自动配置),**一个 Servlet 可以设置多个 URL 访问**。**Servlet 不是线程安全**,因此要谨慎使用类变量。
|
在 Java Web 程序中,**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数,供 Servlet 内部使用。一个 Servlet 类只会有一个实例,在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet 需要在 web.xml 中配置(MyEclipse 中创建 Servlet 会自动配置),**一个 Servlet 可以设置多个 URL 访问**。**Servlet 不是线程安全**,因此要谨慎使用类变量。
|
||||||
@ -55,6 +27,7 @@
|
|||||||
参考:《javaweb 整合开发王者归来》P7
|
参考:《javaweb 整合开发王者归来》P7
|
||||||
|
|
||||||
## Servlet 接口中有哪些方法及 Servlet 生命周期探秘
|
## Servlet 接口中有哪些方法及 Servlet 生命周期探秘
|
||||||
|
|
||||||
Servlet 接口定义了 5 个方法,其中**前三个方法与 Servlet 生命周期相关**:
|
Servlet 接口定义了 5 个方法,其中**前三个方法与 Servlet 生命周期相关**:
|
||||||
|
|
||||||
- `void init(ServletConfig config) throws ServletException`
|
- `void init(ServletConfig config) throws ServletException`
|
||||||
@ -79,6 +52,7 @@ get和post请求实际上是没有区别,大家可以自行查询相关文章
|
|||||||
- https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
|
- https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
|
||||||
|
|
||||||
## 什么情况下调用 doGet()和 doPost()
|
## 什么情况下调用 doGet()和 doPost()
|
||||||
|
|
||||||
Form 标签里的 method 的属性为 get 时调用 doGet(),为 post 时调用 doPost()。
|
Form 标签里的 method 的属性为 get 时调用 doGet(),为 post 时调用 doPost()。
|
||||||
|
|
||||||
## 转发(Forward)和重定向(Redirect)的区别
|
## 转发(Forward)和重定向(Redirect)的区别
|
||||||
@ -87,9 +61,11 @@ Form标签里的method的属性为get时调用doGet(),为post时调用doPost()
|
|||||||
|
|
||||||
**转发(Forward)**
|
**转发(Forward)**
|
||||||
通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher 可以通过 HttpServletRequest 的 getRequestDispatcher()方法获得。例如下面的代码就是跳转到 login_success.jsp 页面。
|
通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher 可以通过 HttpServletRequest 的 getRequestDispatcher()方法获得。例如下面的代码就是跳转到 login_success.jsp 页面。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
request.getRequestDispatcher("login_success.jsp").forward(request, response);
|
request.getRequestDispatcher("login_success.jsp").forward(request, response);
|
||||||
```
|
```
|
||||||
|
|
||||||
**重定向(Redirect)** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse` 的 `setStatus(int status)` 方法设置状态码。如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源。
|
**重定向(Redirect)** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse` 的 `setStatus(int status)` 方法设置状态码。如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源。
|
||||||
|
|
||||||
1. **从地址栏显示来说**
|
1. **从地址栏显示来说**
|
||||||
@ -113,25 +89,28 @@ forward:高.
|
|||||||
redirect:低.
|
redirect:低.
|
||||||
|
|
||||||
## 自动刷新(Refresh)
|
## 自动刷新(Refresh)
|
||||||
|
|
||||||
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:
|
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
|
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
|
||||||
```
|
```
|
||||||
|
|
||||||
其中 5 为时间,单位为秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会实现每过 5 秒自动刷新本页面一次)
|
其中 5 为时间,单位为秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会实现每过 5 秒自动刷新本页面一次)
|
||||||
|
|
||||||
|
|
||||||
## Servlet 与线程安全
|
## Servlet 与线程安全
|
||||||
|
|
||||||
**Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet()和 doPost()方法内。虽然使用 synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
|
**Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet()和 doPost()方法内。虽然使用 synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
|
||||||
注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。
|
注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。
|
||||||
|
|
||||||
参考:《javaweb 整合开发王者归来》P92
|
参考:《javaweb 整合开发王者归来》P92
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## JSP 和 Servlet 是什么关系
|
## JSP 和 Servlet 是什么关系
|
||||||
|
|
||||||
其实这个问题在上面已经阐述过了,Servlet 是一个特殊的 Java 程序,它运行于服务器的 JVM 中,能够依靠服务器的支持向浏览器提供显示内容。JSP 本质上是 Servlet 的一种简易形式,JSP 会被服务器处理成一个类似于 Servlet 的 Java 程序,可以简化页面内容的生成。Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。有人说,Servlet 就是在 Java 中写 HTML,而 JSP 就是在 HTML 中写 Java 代码,当然这个说法是很片面且不够准确的。JSP 侧重于视图,Servlet 更侧重于控制逻辑,在 MVC 架构模式中,JSP 适合充当视图(view)而 Servlet 适合充当控制器(controller)。
|
其实这个问题在上面已经阐述过了,Servlet 是一个特殊的 Java 程序,它运行于服务器的 JVM 中,能够依靠服务器的支持向浏览器提供显示内容。JSP 本质上是 Servlet 的一种简易形式,JSP 会被服务器处理成一个类似于 Servlet 的 Java 程序,可以简化页面内容的生成。Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。有人说,Servlet 就是在 Java 中写 HTML,而 JSP 就是在 HTML 中写 Java 代码,当然这个说法是很片面且不够准确的。JSP 侧重于视图,Servlet 更侧重于控制逻辑,在 MVC 架构模式中,JSP 适合充当视图(view)而 Servlet 适合充当控制器(controller)。
|
||||||
|
|
||||||
## JSP 工作原理
|
## JSP 工作原理
|
||||||
|
|
||||||
JSP 是一种 Servlet,但是与 HttpServlet 的工作方式不太一样。HttpServlet 是先由源代码编译为 class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
|
JSP 是一种 Servlet,但是与 HttpServlet 的工作方式不太一样。HttpServlet 是先由源代码编译为 class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
|
||||||
工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。
|
工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。
|
||||||
.class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候,Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。
|
.class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候,Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。
|
||||||
@ -145,9 +124,11 @@ JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServ
|
|||||||
参考:《javaweb 整合开发王者归来》P97
|
参考:《javaweb 整合开发王者归来》P97
|
||||||
|
|
||||||
## JSP 有哪些内置对象、作用分别是什么
|
## JSP 有哪些内置对象、作用分别是什么
|
||||||
|
|
||||||
[JSP 内置对象 - CSDN 博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
[JSP 内置对象 - CSDN 博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
||||||
|
|
||||||
JSP 有 9 个内置对象:
|
JSP 有 9 个内置对象:
|
||||||
|
|
||||||
- request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
|
- request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
|
||||||
- response:封装服务器对客户端的响应;
|
- response:封装服务器对客户端的响应;
|
||||||
- pageContext:通过该对象可以获取其他对象;
|
- pageContext:通过该对象可以获取其他对象;
|
||||||
@ -158,8 +139,8 @@ JSP有9个内置对象:
|
|||||||
- page:JSP 页面本身(相当于 Java 程序中的 this);
|
- page:JSP 页面本身(相当于 Java 程序中的 this);
|
||||||
- exception:封装页面抛出异常的对象。
|
- exception:封装页面抛出异常的对象。
|
||||||
|
|
||||||
|
|
||||||
## Request 对象的主要方法有哪些
|
## Request 对象的主要方法有哪些
|
||||||
|
|
||||||
- setAttribute(String name,Object):设置名字为 name 的 request 的参数值
|
- setAttribute(String name,Object):设置名字为 name 的 request 的参数值
|
||||||
- getAttribute(String name):返回由 name 指定的属性值
|
- getAttribute(String name):返回由 name 指定的属性值
|
||||||
- getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
|
- getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
|
||||||
@ -185,6 +166,7 @@ JSP有9个内置对象:
|
|||||||
- removeAttribute(String name):删除请求中的一个属性
|
- removeAttribute(String name):删除请求中的一个属性
|
||||||
|
|
||||||
## request.getAttribute()和 request.getParameter()有何区别
|
## request.getAttribute()和 request.getParameter()有何区别
|
||||||
|
|
||||||
**从获取方向来看:**
|
**从获取方向来看:**
|
||||||
|
|
||||||
`getParameter()`是获取 POST/GET 传递的参数值;
|
`getParameter()`是获取 POST/GET 传递的参数值;
|
||||||
@ -208,6 +190,7 @@ mapping.findForward。 getAttribute 只能收到程序用 setAttribute 传过来
|
|||||||
`getAttribute()`返回的是 Object,需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
|
`getAttribute()`返回的是 Object,需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
|
||||||
|
|
||||||
## include 指令 include 的行为的区别
|
## include 指令 include 的行为的区别
|
||||||
|
|
||||||
**include 指令:** JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。 语法格式如下:
|
**include 指令:** JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。 语法格式如下:
|
||||||
<%@ include file="文件相对 url 地址" %>
|
<%@ include file="文件相对 url 地址" %>
|
||||||
|
|
||||||
@ -215,16 +198,20 @@ i**nclude动作:** `<jsp:include>`动作元素用来包含静态和动态的
|
|||||||
<jsp:include page="相对 URL 地址" flush="true" />
|
<jsp:include page="相对 URL 地址" flush="true" />
|
||||||
|
|
||||||
## JSP 九大内置对象,七大动作,三大指令
|
## JSP 九大内置对象,七大动作,三大指令
|
||||||
|
|
||||||
[JSP 九大内置对象,七大动作,三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
[JSP 九大内置对象,七大动作,三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
||||||
|
|
||||||
## 讲解 JSP 中的四种作用域
|
## 讲解 JSP 中的四种作用域
|
||||||
|
|
||||||
JSP 中的四种作用域包括 page、request、session 和 application,具体来说:
|
JSP 中的四种作用域包括 page、request、session 和 application,具体来说:
|
||||||
|
|
||||||
- **page**代表与一个页面相关的对象和属性。
|
- **page**代表与一个页面相关的对象和属性。
|
||||||
- **request**代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
|
- **request**代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
|
||||||
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
|
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
|
||||||
- **application**代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
|
- **application**代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
|
||||||
|
|
||||||
## 如何实现 JSP 或 Servlet 的单线程模式
|
## 如何实现 JSP 或 Servlet 的单线程模式
|
||||||
|
|
||||||
对于 JSP 页面,可以通过 page 指令进行设置。
|
对于 JSP 页面,可以通过 page 指令进行设置。
|
||||||
`<%@page isThreadSafe="false"%>`
|
`<%@page isThreadSafe="false"%>`
|
||||||
|
|
||||||
@ -233,15 +220,19 @@ JSP中的四种作用域包括page、request、session和application,具体来
|
|||||||
说明:如果将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
|
说明:如果将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
|
||||||
|
|
||||||
## 实现会话跟踪的技术有哪些
|
## 实现会话跟踪的技术有哪些
|
||||||
|
|
||||||
1. **使用 Cookie**
|
1. **使用 Cookie**
|
||||||
|
|
||||||
向客户端发送 Cookie
|
向客户端发送 Cookie
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Cookie c =new Cookie("name","value"); //创建Cookie
|
Cookie c =new Cookie("name","value"); //创建Cookie
|
||||||
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
|
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
|
||||||
response.addCookie(c); //把Cookie放入到HTTP响应中
|
response.addCookie(c); //把Cookie放入到HTTP响应中
|
||||||
```
|
```
|
||||||
|
|
||||||
从客户端读取 Cookie
|
从客户端读取 Cookie
|
||||||
|
|
||||||
```java
|
```java
|
||||||
String name ="name";
|
String name ="name";
|
||||||
Cookie[]cookies =request.getCookies();
|
Cookie[]cookies =request.getCookies();
|
||||||
@ -257,6 +248,7 @@ if(cookies !=null){
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**优点:** 数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value
|
**优点:** 数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value
|
||||||
|
|
||||||
**缺点:** 大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。
|
**缺点:** 大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。
|
||||||
@ -270,6 +262,7 @@ if(cookies !=null){
|
|||||||
**缺点:** 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。
|
**缺点:** 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。
|
||||||
|
|
||||||
3.隐藏的表单域
|
3.隐藏的表单域
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<input type="hidden" name="session" value="..." />
|
<input type="hidden" name="session" value="..." />
|
||||||
```
|
```
|
||||||
@ -280,8 +273,8 @@ if(cookies !=null){
|
|||||||
|
|
||||||
4. HttpSession
|
4. HttpSession
|
||||||
|
|
||||||
|
|
||||||
在所有会话跟踪技术中,HttpSession 对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest 对象的 getSession 方 法获得 HttpSession,通过 HttpSession 的 setAttribute 方法可以将一个值放在 HttpSession 中,通过调用 HttpSession 对象的 getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象。与上面三种方式不同的 是,HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 HttpSession 中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
|
在所有会话跟踪技术中,HttpSession 对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest 对象的 getSession 方 法获得 HttpSession,通过 HttpSession 的 setAttribute 方法可以将一个值放在 HttpSession 中,通过调用 HttpSession 对象的 getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象。与上面三种方式不同的 是,HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 HttpSession 中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
|
||||||
|
|
||||||
## Cookie 和 Session 的区别
|
## Cookie 和 Session 的区别
|
||||||
|
|
||||||
Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
|
Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
|
||||||
|
@ -233,8 +233,8 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
|
|||||||
|
|
||||||
1. 《阿里巴巴 Java 开发手册》
|
1. 《阿里巴巴 Java 开发手册》
|
||||||
2. 《Clean Code》
|
2. 《Clean Code》
|
||||||
3. Google Java 代码指南:https://google.github.io/styleguide/javaguide.html
|
3. Google Java 代码指南:<https://google.github.io/styleguide/javaguide.html>
|
||||||
4. 告别编码5分钟,命名2小时!史上最全的Java命名规范参考:https://www.cnblogs.com/liqiangchn/p/12000361.html
|
4. 告别编码 5 分钟,命名 2 小时!史上最全的 Java 命名规范参考:<https://www.cnblogs.com/liqiangchn/p/12000361.html>
|
||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
@ -247,4 +247,3 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
|
|||||||
另外,国人开发的一个叫做 Codelf 的网站被很多人称为“变量命名神器”,当你为命名而头疼的时候,你可以去参考一下上面提供的一些命名示例。
|
另外,国人开发的一个叫做 Codelf 的网站被很多人称为“变量命名神器”,当你为命名而头疼的时候,你可以去参考一下上面提供的一些命名示例。
|
||||||
|
|
||||||
最后,祝愿大家都不用再为命名而困扰!
|
最后,祝愿大家都不用再为命名而困扰!
|
||||||
|
|
||||||
|
@ -50,8 +50,6 @@ Dijkstra(Dijkstra算法的作者) 在 1972年图灵奖获奖感言中也提
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**敏捷开发模型** 是目前使用的最多的一种软件开发模型。[MBA 智库百科对敏捷开发的描述](https://wiki.mbalib.com/wiki/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91)是这样的:
|
**敏捷开发模型** 是目前使用的最多的一种软件开发模型。[MBA 智库百科对敏捷开发的描述](https://wiki.mbalib.com/wiki/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91)是这样的:
|
||||||
|
|
||||||
> **敏捷开发** 是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
|
> **敏捷开发** 是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
|
||||||
@ -96,5 +94,5 @@ Dijkstra(Dijkstra算法的作者) 在 1972年图灵奖获奖感言中也提
|
|||||||
|
|
||||||
## 参考
|
## 参考
|
||||||
|
|
||||||
- 软件工程的基本概念-清华大学软件学院 刘强:https://www.xuetangx.com/course/THU08091000367
|
- 软件工程的基本概念-清华大学软件学院 刘强:<https://www.xuetangx.com/course/THU08091000367>
|
||||||
- 软件开发过程-维基百科 :[https://zh.wikipedia.org/wiki/软件开发过程](https://zh.wikipedia.org/wiki/软件开发过程)
|
- 软件开发过程-维基百科 :[https://zh.wikipedia.org/wiki/软件开发过程](https://zh.wikipedia.org/wiki/软件开发过程)
|
@ -113,7 +113,7 @@ JUnit 几乎是默认选择,但是其不支持 Mock,因此我们还需要选
|
|||||||
|
|
||||||
究竟是选择 Mockito 还是 Spock 呢?我这里做了一些简单的对比分析:
|
究竟是选择 Mockito 还是 Spock 呢?我这里做了一些简单的对比分析:
|
||||||
|
|
||||||
- Spock 没办法 Mock 静态方法和私有方法 ,Mockito 3.4.0 以后,支持静态方法的 Mock,具体可以看这个 issue:https://github.com/mockito/mockito/issues/1013,具体教程可以看这篇文章:https://www.baeldung.com/mockito-mock-static-methods。
|
- Spock 没办法 Mock 静态方法和私有方法 ,Mockito 3.4.0 以后,支持静态方法的 Mock,具体可以看这个 issue:<https://github.com/mockito/mockito/issues/1013,具体教程可以看这篇文章:https://www.baeldung.com/mockito-mock-static-methods。>
|
||||||
- Spock 基于 Groovy,写出来的测试代码更清晰易读,比较规范(自带 given-when-then 的常用测试结构规范)。Mockito 没有具体的结构规范,需要项目组自己约定一个或者遵守比较好的测试代码实践。通常来说,同样的测试用例,Spock 的代码要更简洁。
|
- Spock 基于 Groovy,写出来的测试代码更清晰易读,比较规范(自带 given-when-then 的常用测试结构规范)。Mockito 没有具体的结构规范,需要项目组自己约定一个或者遵守比较好的测试代码实践。通常来说,同样的测试用例,Spock 的代码要更简洁。
|
||||||
- Mockito 使用的人群更广泛,稳定可靠。并且,Mockito 是 SpringBoot Test 默认集成的 Mock 工具。
|
- Mockito 使用的人群更广泛,稳定可靠。并且,Mockito 是 SpringBoot Test 默认集成的 Mock 工具。
|
||||||
|
|
||||||
|
@ -58,9 +58,9 @@ setInterval(() => {
|
|||||||
// 方法请求
|
// 方法请求
|
||||||
messageCount().then((res) => {
|
messageCount().then((res) => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
this.messageCount = res.data
|
this.messageCount = res.data;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}, 1000);
|
}, 1000);
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -438,13 +438,10 @@ MQTT 协议为什么在物联网(IOT)中如此受偏爱?而不是其它协
|
|||||||
> 以下内容为 JavaGuide 补充
|
> 以下内容为 JavaGuide 补充
|
||||||
|
|
||||||
| | 介绍 | 优点 | 缺点 |
|
| | 介绍 | 优点 | 缺点 |
|
||||||
| --------- | ------------------------------------------------------------ | ---------------------- | ---------------------------------------------------- |
|
| --------- | ------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------- |
|
||||||
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
|
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
|
||||||
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
|
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
|
||||||
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
|
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
|
||||||
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
|
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
|
||||||
| WebSocket | 除了最初建立连接时用 HTTP 协议,其他时候都是直接基于 TCP 协议进行通信的,可以实现客户端和服务端的全双工通信。 | 性能高、开销小 | 对开发人员要求更高,实现相对复杂一些 |
|
| WebSocket | 除了最初建立连接时用 HTTP 协议,其他时候都是直接基于 TCP 协议进行通信的,可以实现客户端和服务端的全双工通信。 | 性能高、开销小 | 对开发人员要求更高,实现相对复杂一些 |
|
||||||
| MQTT | 基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |
|
| MQTT | 基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ tag:
|
|||||||
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
|
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
|
||||||
- Docker 可以**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
|
- Docker 可以**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
|
||||||
|
|
||||||
官网地址:https://www.docker.com/ 。
|
官网地址:<https://www.docker.com/> 。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user