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:
|
||||
|
||||
CSDN 我就不想多说了,就一大型文章垃圾场,都是各种不规范转载,各种收费下载的垃圾资源。这号称国内流量最大的技术网站贼恶心,吃香太难看,能不用就不要用吧!
|
||||
|
||||
像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。
|
||||
像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。
|
||||
|
||||

|
||||
|
||||
|
@ -7,18 +7,18 @@ tag:
|
||||
|
||||
不知不觉已经入职一个多月了,在入职之前我没有在某个公司实习过或者工作过,所以很多东西刚入职工作的我来说还是比较新颖的。学校到职场的转变,带来了角色的转变,其中的差别因人而异。对我而言,在学校的时候课堂上老师课堂上教的东西,自己会根据自己的兴趣选择性接受,甚至很多课程你不想去上的话,还可以逃掉。到了公司就不一样了,公司要求你会的技能你不得不学,除非你不想干了。在学校的时候大部分人编程的目的都是为了通过考试或者找到一份好工作,真正靠自己兴趣支撑起来的很少,到了工作岗位之后我们编程更多的是因为工作的要求,相比于学校的来说会一般会更有挑战而且压力更大。在学校的时候,我们最重要的就是对自己负责,我们不断学习知识去武装自己,但是到了公司之后我们不光要对自己负责,更要对公司负责,毕竟公司出钱请你过来,不是让你一直 on beach 的。
|
||||
|
||||
刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外,Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
|
||||
刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows 确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外,Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
|
||||
|
||||
不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训,与往年不同的是,今年的培训多了中国本地班(TWU-C)。作为本地班的第一期学员,说句心里话还是很不错。8周的培训,除了工作需要用到的基本技术比如ES6、SpringBoot等等之外,还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动,比如Weekend Trip、 City Tour、Cake time等等。最后三周还会有一个实际的模拟项目,这个项目基本和我们正式工作的实际项目差不多,我个人感觉很不错。目前这个项目已经正式完成了一个迭代,我觉得在做项目的过程中,收获最大的不是项目中使用的技术,而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
|
||||
不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训,与往年不同的是,今年的培训多了中国本地班(TWU-C)。作为本地班的第一期学员,说句心里话还是很不错。8 周的培训,除了工作需要用到的基本技术比如 ES6、SpringBoot 等等之外,还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动,比如 Weekend Trip、 City Tour、Cake time 等等。最后三周还会有一个实际的模拟项目,这个项目基本和我们正式工作的实际项目差不多,我个人感觉很不错。目前这个项目已经正式完成了一个迭代,我觉得在做项目的过程中,收获最大的不是项目中使用的技术,而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
|
||||
|
||||
ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责,Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责5-6个人。Trainer不定期都会给我们最近表现的 Feedback( 反馈) ,我个人觉得这个并不是这是走走形式,Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
|
||||
ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责,Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责 5-6 个人。Trainer 不定期都会给我们最近表现的 Feedback( 反馈) ,我个人觉得这个并不是这是走走形式,Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
|
||||
|
||||
另外,ThoughtWorks 也是一家非常提倡 Feedback( 反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。
|
||||
另外,ThoughtWorks 也是一家非常提倡 Feedback( 反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。
|
||||
|
||||

|
||||
|
||||
工作之后,平时更新公众号、专栏还有维护 Github 的时间变少了。实际上,很多时候下班回来后,都有自己的时间来干自己的事情,但是自己也总是找工作太累或者时间比较零散的接口来推掉了。到了今天,翻看 Github 突然发现 14 天前别人在 Github 上给我提的 pr 我还没有处理。这一点确实是自己没有做好的地方,没有合理安排好自己的时间。实际上自己有很多想写的东西,后面会慢慢将他们提上日程。工作之后,更加发现下班后的几个小时如何度过确实很重要 ,如果你觉得自己没有完成好自己白天该做的工作的话,下班后你可以继续忙白天没有忙完的工作,如果白天的工作对于你游刃有余的话,下班回来之后,你大可去干自己感兴趣的事情,学习自己感兴趣的技术。做任何事情都要基于自身的基础,切不可好高骛远。
|
||||
|
||||
工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController`、`@Autowried`、`@Pathvairable`、`@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
|
||||
工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController`、`@Autowried`、`@Pathvairable`、`@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
|
||||
|
||||
这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。
|
@ -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)
|
||||
- [JWT 身份认证优缺点分析以及常见问题解决方案](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485655&idx=1&sn=583eeeb081ea21a8ec6347c72aa223d6&chksm=cea2471cf9d5ce0aa135f2fb9aa32d98ebb3338292beaccc1aae43d1178b16c0125eb4139ca4&token=1737409938&lang=zh_CN#rd)
|
||||
|
@ -5,7 +5,7 @@ tag:
|
||||
- 个人经历
|
||||
---
|
||||
|
||||
2021-03-21,晚上12点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 Github 主页](https://github.com/Snailclimb)。
|
||||
2021-03-21,晚上 12 点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 Github 主页](https://github.com/Snailclimb)。
|
||||
|
||||
好家伙!几天没注意,[JavaGuide](https://github.com/Snailclimb/JavaGuide) 这个项目直接上了 100K star。
|
||||
|
||||
@ -15,7 +15,7 @@ tag:
|
||||
|
||||

|
||||
|
||||
维护这个项目的过程中,也被某些人 diss 过:“md项目,没啥含金量,给国人丢脸!”。
|
||||
维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。
|
||||
|
||||
对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎!
|
||||
|
||||
@ -23,13 +23,13 @@ tag:
|
||||
|
||||
我的公号的小伙伴都是通过这个项目关注我的,趁着午休,简单复盘一下,也算是对关注这个项目的小伙伴负责。
|
||||
|
||||
我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
|
||||
我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
|
||||
|
||||
到今天(2021-03-23)为止,这个仓库已经累计有 **2933** 次 commit,累计有 **207** 位朋友参与到了项目中来。
|
||||
|
||||

|
||||
|
||||
累计有 **511** 个 **issue** 和 **575** 个 **pr**。所有的 pr 都已经被处理,仅有15 个左右的 issue 我还未抽出时间处理。
|
||||
累计有 **511** 个 **issue** 和 **575** 个 **pr**。所有的 pr 都已经被处理,仅有 15 个左右的 issue 我还未抽出时间处理。
|
||||
|
||||

|
||||
|
||||
|
@ -5,7 +5,7 @@ tag:
|
||||
- 杂谈
|
||||
---
|
||||
|
||||
时间回到 2021-02-25,我在刷哔哩哔哩的时候发现,哔哩哔哩某UP主(某培训机构),擅自将我在知乎的一个回答做成了视频。
|
||||
时间回到 2021-02-25,我在刷哔哩哔哩的时候发现,哔哩哔哩某 UP 主(某培训机构),擅自将我在知乎的一个回答做成了视频。
|
||||
|
||||
原滋原味啊!我艹。甚至,连我开头的自我调侃还加上了!真的牛皮!
|
||||
|
||||
@ -31,7 +31,7 @@ tag:
|
||||
|
||||
其他的视频就不用多看了,是否还是剽窃别人的原创,原封不动地做成视频,大家心里应该有数。
|
||||
|
||||
他们这样做的目的就是一个:**引流到自己的QQ群,然后忽悠你买课程。**
|
||||
他们这样做的目的就是一个:**引流到自己的 QQ 群,然后忽悠你买课程。**
|
||||
|
||||
我并不认为是这完全都是培训机构的问题。培训机构的员工为了流量而做这种恶心的事情,也导致了现在这种事情被越来越频繁地发生。
|
||||
|
||||
|
@ -6,7 +6,7 @@ tag:
|
||||
- 个人经历
|
||||
---
|
||||
|
||||
> 关于初高中的生活,可以看 2020年我写的[我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager.html)这篇文章。
|
||||
> 关于初高中的生活,可以看 2020 年我写的[我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager.html)这篇文章。
|
||||
|
||||
2019 年 6 月份毕业,距今已经过去了 3 年。趁着高考以及应届生毕业之际,简单聊聊自己的大学生活。
|
||||
|
||||
|
@ -45,13 +45,13 @@ category: 走近作者
|
||||
|
||||

|
||||
|
||||
## 为什么自称 Guide哥?
|
||||
## 为什么自称 Guide 哥?
|
||||
|
||||
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide哥**。
|
||||
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide 哥**。
|
||||
|
||||
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide哥**。
|
||||
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide 哥**。
|
||||
|
||||
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思,给大家拆解一下就清楚了。SnailClimb=Snail(蜗牛)+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿😁
|
||||
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思,给大家拆解一下就清楚了。SnailClimb=Snail(蜗牛)+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁
|
||||
|
||||

|
||||
|
||||
|
@ -122,7 +122,7 @@ tag:
|
||||
|
||||
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
|
||||
|
||||
Markdown 规范请参考:**https://javaguide.cn/javaguide/contribution-guideline.html** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
|
||||
Markdown 规范请参考:**<https://javaguide.cn/javaguide/contribution-guideline.html>** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
|
||||
|
||||
## 有没有什么写作技巧分享?
|
||||
|
||||
|
@ -138,4 +138,3 @@ star: 2
|
||||
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
|
||||
|
||||
**星球提供的服务质量还是很高的,非常适合准备面试的同学。我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||
|
||||
|
@ -16,13 +16,11 @@ head:
|
||||
|
||||

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

|
||||
|
||||
Github上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom) 。
|
||||
Github 上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom) 。
|
||||
|
||||
除了这个用 Java 写的之外,**[db_tutorial](https://github.com/cstack/db_tutorial)** 这个项目是国外的一个大佬用 C 语言写的,朋友们也可以去瞅瞅。
|
||||
|
||||
@ -44,7 +42,7 @@ Github上也已经有大佬用 Java 实现过一个简易的数据库,介绍
|
||||
|
||||

|
||||
|
||||
不管是 MySQL 还是Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。
|
||||
不管是 MySQL 还是 Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。
|
||||
|
||||
这本书有些地方还是翻译的比较蹩脚,有能力看英文版的还是建议上手英文版。
|
||||
|
||||
|
@ -40,7 +40,7 @@ icon: "distributed-network"
|
||||
|
||||

|
||||
|
||||
**[《深入理解分布式事务》](https://book.douban.com/subject/35626925/)** 这本书是的其中一位作者是 Apache ShenYu(incubating)网关创始人、Hmily、RainCat、Myth等分布式事务框架的创始人。
|
||||
**[《深入理解分布式事务》](https://book.douban.com/subject/35626925/)** 这本书是的其中一位作者是 Apache ShenYu(incubating)网关创始人、Hmily、RainCat、Myth 等分布式事务框架的创始人。
|
||||
|
||||
学习分布式事务的时候,可以参考一下这本书。虽有一些小错误以及逻辑不通顺的地方,但对于各种分布式事务解决方案的介绍,总体来说还是不错的。
|
||||
|
||||
|
@ -34,7 +34,7 @@ icon: "java"
|
||||
|
||||
我第一次看的时候还觉得有点枯燥,那时候还在上大二,看了 1/3 就没看下去了。
|
||||
|
||||
**[《Java 8实战》](https://book.douban.com/subject/26772632/)**
|
||||
**[《Java 8 实战》](https://book.douban.com/subject/26772632/)**
|
||||
|
||||

|
||||
|
||||
@ -64,7 +64,7 @@ _这本书还是非常适合我们用来学习 Java 多线程的。这本书的
|
||||
|
||||
这本书的质量也是非常过硬!给作者们点个赞!这本书有统一的排版规则和语言风格、清晰的表达方式和逻辑。并且每篇文章初稿写完后,作者们就会互相审校,合并到主分支时所有成员会再次审校,最后再通篇修订了三遍。
|
||||
|
||||
在线阅读:[https://redspider.gitbook.io/concurrent/](https://redspider.gitbook.io/concurrent/ ) 。
|
||||
在线阅读:[https://redspider.gitbook.io/concurrent/](https://redspider.gitbook.io/concurrent/) 。
|
||||
|
||||
**[《Java 并发实现原理:JDK 源码剖析》](https://book.douban.com/subject/35013531/)**
|
||||
|
||||
|
@ -18,6 +18,6 @@ category: 计算机书籍
|
||||
|
||||
如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份书单,感谢!
|
||||
|
||||
本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github掘金计划**” 后台回复“**书籍**”获取到。
|
||||
本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github 掘金计划**” 后台回复“**书籍**”获取到。
|
||||
|
||||

|
@ -8,7 +8,7 @@ icon: "search"
|
||||
|
||||
Elasticsearch 在 Apache Lucene 的基础上开发而成,学习 ES 之前,建议简单了解一下 Lucene 的相关概念。
|
||||
|
||||
**[《Lucene实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。
|
||||
**[《Lucene 实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。
|
||||
|
||||

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

|
||||
|
||||
@ -140,7 +139,7 @@ CREATE TABLE `user` (
|
||||
```sql
|
||||
INSERT INTO `user` (`id`, `name`, `phone`, `password`)
|
||||
VALUES
|
||||
('A00003', 'guide哥😘😘😘', '181631312312', '123456');
|
||||
('A00003', 'guide哥😘😘😘', '181631312312', '123456');
|
||||
|
||||
```
|
||||
|
||||
@ -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
|
||||
- 十分钟搞清字符集和字符编码:http://cenalulu.github.io/linux/character-encoding/
|
||||
- Unicode-维基百科:https://zh.wikipedia.org/wiki/Unicode
|
||||
- GB2312-维基百科:https://zh.wikipedia.org/wiki/GB_2312
|
||||
- UTF-8-维基百科:https://zh.wikipedia.org/wiki/UTF-8
|
||||
- GB18030-维基百科: https://zh.wikipedia.org/wiki/GB_18030
|
||||
- 字符集和字符编码(Charset & Encoding): <https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html>
|
||||
- 十分钟搞清字符集和字符编码:<http://cenalulu.github.io/linux/character-encoding/>
|
||||
- Unicode-维基百科:<https://zh.wikipedia.org/wiki/Unicode>
|
||||
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
|
||||
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
|
||||
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>
|
||||
|
@ -19,16 +19,16 @@ NoSQL 数据库代表:HBase 、Cassandra、MongoDB、Redis。
|
||||
|
||||
## SQL 和 NoSQL 有什么区别?
|
||||
|
||||
| | SQL 数据库 | NoSQL 数据库 |
|
||||
| :----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档:JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
|
||||
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
|
||||
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档:MongoDB、CouchDB,键值:Redis 、DynamoDB,宽列:Cassandra 、 HBase,图表:Neo4j 、 Amazon Neptune、Giraph |
|
||||
| ACID 属性 | 提供原子性、一致性、隔离性和持久性 (ACID) 属性 | 通常不支持 ACID 事务,为了可扩展、高性能进行了权衡,少部分支持比如 MongoDB 。不过,MongoDB 对 ACID 事务 的支持和 MySQL 还是有所区别的。 |
|
||||
| 性能 | 性能通常取决于磁盘子系统。要获得最佳性能,通常需要优化查询、索引和表结构。 | 性能通常由底层硬件集群大小、网络延迟以及调用应用程序来决定。 |
|
||||
| 扩展 | 垂直(使用性能更强大的服务器进行扩展)、读写分离、分库分表 | 横向(增加服务器的方式横向扩展,通常是基于分片机制) |
|
||||
| 用途 | 普通企业级的项目的数据存储 | 用途广泛比如图数据库支持分析和遍历连接数据之间的关系、键值数据库可以处理大量数据扩展和极高的状态变化 |
|
||||
| 查询语法 | 结构化查询语言 (SQL) | 数据访问语法可能因数据库而异 |
|
||||
| | SQL 数据库 | NoSQL 数据库 |
|
||||
| :----------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档:JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
|
||||
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
|
||||
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档:MongoDB、CouchDB,键值:Redis 、DynamoDB,宽列:Cassandra 、 HBase,图表:Neo4j 、 Amazon Neptune、Giraph |
|
||||
| ACID 属性 | 提供原子性、一致性、隔离性和持久性 (ACID) 属性 | 通常不支持 ACID 事务,为了可扩展、高性能进行了权衡,少部分支持比如 MongoDB 。不过,MongoDB 对 ACID 事务 的支持和 MySQL 还是有所区别的。 |
|
||||
| 性能 | 性能通常取决于磁盘子系统。要获得最佳性能,通常需要优化查询、索引和表结构。 | 性能通常由底层硬件集群大小、网络延迟以及调用应用程序来决定。 |
|
||||
| 扩展 | 垂直(使用性能更强大的服务器进行扩展)、读写分离、分库分表 | 横向(增加服务器的方式横向扩展,通常是基于分片机制) |
|
||||
| 用途 | 普通企业级的项目的数据存储 | 用途广泛比如图数据库支持分析和遍历连接数据之间的关系、键值数据库可以处理大量数据扩展和极高的状态变化 |
|
||||
| 查询语法 | 结构化查询语言 (SQL) | 数据访问语法可能因数据库而异 |
|
||||
|
||||
## NoSQL 数据库有什么优势?
|
||||
|
||||
|
@ -24,7 +24,6 @@ icon: "configuration"
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
||||
|
||||
<div align="center">
|
||||
@ -33,7 +32,6 @@ icon: "configuration"
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||
|
||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
||||
@ -46,7 +44,6 @@ icon: "configuration"
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
||||
|
||||
<div align="center">
|
||||
|
@ -283,7 +283,7 @@ System.out.println("是否有第一个锁: " + lock1.isAcquiredInThisProcess());
|
||||
System.out.println("是否有第二个锁: " + lock2.isAcquiredInThisProcess());
|
||||
try {
|
||||
// 资源操作
|
||||
resource.use();
|
||||
resource.use();
|
||||
} finally {
|
||||
System.out.println("释放多个锁");
|
||||
lock.release();
|
||||
@ -394,6 +394,3 @@ private static class LockData
|
||||
## 总结
|
||||
|
||||
这篇文章我们介绍了分布式锁的基本概念以及实现分布式锁的两种常见方式。至于具体选择 Redis 还是 ZooKeeper 来实现分布式锁,还是要看业务的具体需求。如果对性能要求比较高的话,建议使用 Redis 实现分布式锁。如果对可靠性要求比较高的话,建议使用 ZooKeeper 实现分布式锁。
|
||||
|
||||
|
||||
|
||||
|
@ -21,7 +21,6 @@ category: 高可用
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
||||
|
||||
<div align="center">
|
||||
@ -30,7 +29,6 @@ category: 高可用
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||
|
||||
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
||||
@ -43,7 +41,6 @@ category: 高可用
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
|
||||
|
||||
<div align="center">
|
||||
|
@ -63,7 +63,7 @@ category: 高可用
|
||||
|
||||
**响应时间就是用户发出请求到用户收到系统处理结果所需要的时间。** 重要吗?实在太重要!
|
||||
|
||||
比较出名的 2-5-8 原则是这样描述的:通常来说,2到5秒,页面体验会比较好,5到8秒还可以接受,8秒以上基本就很难接受了。另外,据统计当网站慢一秒就会流失十分之一的客户。
|
||||
比较出名的 2-5-8 原则是这样描述的:通常来说,2 到 5 秒,页面体验会比较好,5 到 8 秒还可以接受,8 秒以上基本就很难接受了。另外,据统计当网站慢一秒就会流失十分之一的客户。
|
||||
|
||||
但是,在某些场景下我们也并不需要太看重 2-5-8 原则 ,比如我觉得系统导出导入大数据量这种就不需要,系统生成系统报告这种也不需要。
|
||||
|
||||
@ -85,15 +85,15 @@ category: 高可用
|
||||
理清他们的概念,就很容易搞清楚他们之间的关系了。
|
||||
|
||||
- **QPS(TPS)** = 并发数/平均响应时间
|
||||
- **并发数** = QPS*平均响应时间
|
||||
- **并发数** = QPS\*平均响应时间
|
||||
|
||||
书中是这样描述 QPS 和 TPS 的区别的。
|
||||
|
||||
> QPS vs TPS:QPS 基本类似于 TPS,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器2次,一次访问,产生一个“T”,产生2个“Q”。
|
||||
> QPS vs TPS:QPS 基本类似于 TPS,但是不同的是,对于一个页面的一次访问,形成一个 TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器 2 次,一次访问,产生一个“T”,产生 2 个“Q”。
|
||||
|
||||
### 3.4 性能计数器
|
||||
|
||||
**性能计数器是描述服务器或者操作系统的一些数据指标如内存使用、CPU使用、磁盘与网络I/O等情况。**
|
||||
**性能计数器是描述服务器或者操作系统的一些数据指标如内存使用、CPU 使用、磁盘与网络 I/O 等情况。**
|
||||
|
||||
### 四 几种常见的性能测试
|
||||
|
||||
@ -127,13 +127,13 @@ category: 高可用
|
||||
|
||||
1. Jmeter :Apache JMeter 是 JAVA 开发的性能测试工具。
|
||||
2. LoadRunner:一款商业的性能测试工具。
|
||||
3. Galtling :一款基于Scala 开发的高性能服务器性能测试工具。
|
||||
3. Galtling :一款基于 Scala 开发的高性能服务器性能测试工具。
|
||||
4. ab :全称为 Apache Bench 。Apache 旗下的一款测试工具,非常实用。
|
||||
|
||||
### 5.2 前端常用
|
||||
|
||||
1. Fiddler:抓包工具,它可以修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是Web 调试的利器。
|
||||
2. HttpWatch: 可用于录制HTTP请求信息的工具。
|
||||
1. Fiddler:抓包工具,它可以修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 Web 调试的利器。
|
||||
2. HttpWatch: 可用于录制 HTTP 请求信息的工具。
|
||||
|
||||
## 六 常见的性能优化策略
|
||||
|
||||
|
@ -38,7 +38,7 @@ category: 高可用
|
||||
|
||||
没有银弹!超时值具体该设置多大,还是要根据实际项目的需求和情况慢慢调整优化得到。
|
||||
|
||||
更上一层,参考[美团的Java线程池参数动态配置](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)思想,我们也可以将超时弄成可配置化的参数而不是固定的,比较简单的一种办法就是将超时的值放在配置中心中。这样的话,我们就可以根据系统或者服务的状态动态调整超时值了。
|
||||
更上一层,参考[美团的 Java 线程池参数动态配置](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)思想,我们也可以将超时弄成可配置化的参数而不是固定的,比较简单的一种办法就是将超时的值放在配置中心中。这样的话,我们就可以根据系统或者服务的状态动态调整超时值了。
|
||||
|
||||
## 重试机制
|
||||
|
||||
@ -68,4 +68,3 @@ category: 高可用
|
||||
|
||||
- 微服务之间调用超时的设置治理:https://www.infoq.cn/article/eyrslar53l6hjm5yjgyx
|
||||
- 超时、重试和抖动回退:https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/
|
||||
|
||||
|
@ -63,7 +63,7 @@ head:
|
||||
|
||||
### 如何找到最合适的 CDN 节点?
|
||||
|
||||
GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个CDN节点之间相互协作,最常用的是基于 DNS 的 GSLB。
|
||||
GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个 CDN 节点之间相互协作,最常用的是基于 DNS 的 GSLB。
|
||||
|
||||
CDN 会通过 GSLB 找到最合适的 CDN 节点,更具体点来说是下面这样的:
|
||||
|
||||
@ -92,15 +92,15 @@ CDN 服务提供商几乎都提供了这种比较基础的防盗链机制。
|
||||
|
||||
通常情况下,我们会配合其他机制来确保静态资源被盗用,一种常用的机制是 **时间戳防盗链** 。相比之下,**时间戳防盗链** 的安全性更强一些。时间戳防盗链加密的 URL 具有时效性,过期之后就无法再被允许访问。
|
||||
|
||||
时间戳防盗链的 URL 通常会有两个参数一个是签名字符串,一个是过期时间。签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。
|
||||
时间戳防盗链的 URL 通常会有两个参数一个是签名字符串,一个是过期时间。签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。
|
||||
|
||||
时间戳防盗链 URL示例:
|
||||
时间戳防盗链 URL 示例:
|
||||
|
||||
```
|
||||
http://cdn.wangsu.com/4/123.mp3? wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTime=1601026312
|
||||
```
|
||||
|
||||
- `wsSecret` :签名字符串。
|
||||
- `wsSecret` :签名字符串。
|
||||
- `wsTime`: 过期时间。
|
||||
|
||||

|
||||
@ -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://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw
|
||||
- 《透视 HTTP 协议》- 37 | CDN:加速我们的网络服务:http://gk.link/a/11yOG
|
||||
|
||||
|
||||
|
||||
- 时间戳防盗链 - 七牛云 CDN:<https://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention>
|
||||
- CDN 是个啥玩意?一文说个明白:<https://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw>
|
||||
- 《透视 HTTP 协议》- 37 | CDN:加速我们的网络服务:<http://gk.link/a/11yOG>
|
||||
|
@ -158,7 +158,7 @@ Nginx 就是最常用的反向代理服务器,它可以将接收到的客户
|
||||
|
||||
**Netflix Ribbon** 和 **Spring Cloud Load Balancer** 就是目前 Java 生态最流行的两个负载均衡组件。
|
||||
|
||||
Ribbon 是老牌负载均衡组件,由 Netflix 开发,功能比较全面,支持的负载均衡策略也比较多。 Spring Cloud Load Balancer 是 Spring 官方为了取代 Ribbon 而推出的,功能相对更简单一些,支持的负载均衡也少一些。
|
||||
Ribbon 是老牌负载均衡组件,由 Netflix 开发,功能比较全面,支持的负载均衡策略也比较多。 Spring Cloud Load Balancer 是 Spring 官方为了取代 Ribbon 而推出的,功能相对更简单一些,支持的负载均衡也少一些。
|
||||
|
||||
Ribbon 支持的 7 种负载均衡策略:
|
||||
|
||||
@ -170,7 +170,7 @@ Ribbon 支持的 7 种负载均衡策略:
|
||||
- `AvailabilityFilteringRule` :可用敏感性策略(先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例)
|
||||
- `ZoneAvoidanceRule` :区域敏感性策略(根据服务所在区域的性能和服务的可用性来选择服务实例)
|
||||
|
||||
Spring Cloud Load Balancer 支持的 2 种负载均衡策略:
|
||||
Spring Cloud Load Balancer 支持的 2 种负载均衡策略:
|
||||
|
||||
- `RandomLoadBalancer` :随机策略
|
||||
- `RoundRobinLoadBalancer`(默认) :轮询策略
|
||||
@ -189,7 +189,7 @@ public class CustomLoadBalancerConfiguration {
|
||||
}
|
||||
```
|
||||
|
||||
不过,Spring Cloud Load Balancer 支持的负载均衡策略其实不止这两种,`ServiceInstanceListSupplier` 的实现类同样可以让其支持类似于 Ribbon 的负载均衡策略。这个应该是后续慢慢完善引入的,不看官方文档还真发现不了,所以说阅读官方文档真的很重要!
|
||||
不过,Spring Cloud Load Balancer 支持的负载均衡策略其实不止这两种,`ServiceInstanceListSupplier` 的实现类同样可以让其支持类似于 Ribbon 的负载均衡策略。这个应该是后续慢慢完善引入的,不看官方文档还真发现不了,所以说阅读官方文档真的很重要!
|
||||
|
||||
这里举两个官方的例子:
|
||||
|
||||
@ -211,9 +211,9 @@ 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 都支持自定义负载均衡策略。
|
||||
|
||||
个人建议如非必需 Ribbon 某个特有的功能或者负载均衡策略的话,就优先选择 Spring 官方提供的 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
|
||||
- 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
|
||||
- 干货 | 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/>
|
||||
- 深入浅出负载均衡 - vivo 互联网技术:<https://www.cnblogs.com/vivotech/p/14859041.html>
|
||||
|
@ -159,7 +159,7 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
|
||||
分片算法主要解决了数据被水平分片之后,数据究竟该存放在哪个表的问题。
|
||||
|
||||
- **哈希分片** :求指定 key(比如 id) 的哈希,然后根据哈希值确定数据应被放置在哪个表中。哈希分片比较适合随机读写的场景,不太适合经常需要范围查询的场景。
|
||||
- **范围分片** :按照特性的范围区间(比如时间区间、ID区间)来分配数据,比如 将 `id` 为 `1~299999` 的记录分到第一个库, `300000~599999` 的分到第二个库。范围分片适合需要经常进行范围查找的场景,不太适合随机读写的场景(数据未被分散,容易出现热点数据的问题)。
|
||||
- **范围分片** :按照特性的范围区间(比如时间区间、ID 区间)来分配数据,比如 将 `id` 为 `1~299999` 的记录分到第一个库, `300000~599999` 的分到第二个库。范围分片适合需要经常进行范围查找的场景,不太适合随机读写的场景(数据未被分散,容易出现热点数据的问题)。
|
||||
- **地理位置分片** :很多 NewSQL 数据库都支持地理位置分片算法,也就是根据地理位置(如城市、地域)来分配数据。
|
||||
- **融合算法** :灵活组合多种分片算法,比如将哈希分片和范围分片组合。
|
||||
- ......
|
||||
@ -210,4 +210,3 @@ ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere
|
||||
- **分库** 就是将数据库中的数据分散到不同的数据库上。**分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
|
||||
- 引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
|
||||
- ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。另外,ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
|
||||
|
||||
|
@ -8,7 +8,7 @@ head:
|
||||
content: 分页优化,索引,Show Profile,慢 SQL
|
||||
- - meta
|
||||
- name: description
|
||||
content: SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 优化,因为它的改造成本相对于代码来说也要小得多。
|
||||
content: SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 优化,因为它的改造成本相对于代码来说也要小得多。
|
||||
---
|
||||
|
||||
**常见 SQL 优化手段总结** 相关的内容为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
# 程序人生
|
||||
|
||||
::: tip 这是一则或许对你有用的小广告
|
||||
@ -32,9 +31,9 @@
|
||||
- [斩获 20+ 大厂 offer 的面试经验分享](./interview/the-experience-of-get-offer-from-over-20-big-companies.md)
|
||||
- [一位大龄程序员所经历的面试的历炼和思考](./interview/the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer.md)
|
||||
- [从面试官和候选者的角度谈如何准备技术初试](./interview/technical-preliminary-preparation.md)
|
||||
- [包装严重的IT行业,作为面试官,我是如何甄别应聘者的包装程度](./interview/screen-candidates-for-packaging.md)
|
||||
- [普通人的春招总结(阿里、腾讯offer)](./interview/summary-of-spring-recruitment.md)
|
||||
- [2021校招我的个人经历和经验](./interview/my-personal-experience-in-2021.md)
|
||||
- [包装严重的 IT 行业,作为面试官,我是如何甄别应聘者的包装程度](./interview/screen-candidates-for-packaging.md)
|
||||
- [普通人的春招总结(阿里、腾讯 offer)](./interview/summary-of-spring-recruitment.md)
|
||||
- [2021 校招我的个人经历和经验](./interview/my-personal-experience-in-2021.md)
|
||||
- [如何在技术初试中考察程序员的技术能力](./interview/how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology.md)
|
||||
- [阿里技术面试的一些秘密](./interview/some-secrets-about-alibaba-interview.md)
|
||||
|
||||
|
@ -54,4 +54,3 @@ category: 知识星球
|
||||
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
@ -71,7 +71,7 @@ Github 或者码云上面有很多实战类别项目,你可以选择一个来
|
||||
|
||||
## 有没有还不错的项目推荐?
|
||||
|
||||
**[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的「面试准备篇」中有一篇文章专门整理了一些比较高质量的实战项目,非常适合用来学习或者作为项目经验。
|
||||
**[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的「面试准备篇」中有一篇文章专门整理了一些比较高质量的实战项目,非常适合用来学习或者作为项目经验。
|
||||
|
||||

|
||||
|
||||
@ -111,4 +111,3 @@ Github 或者码云上面有很多实战类别项目,你可以选择一个来
|
||||
并且,你还可以自定义检查规则。
|
||||
|
||||

|
||||
|
||||
|
@ -67,9 +67,9 @@ category: 知识星球
|
||||
- **宣讲会** :宣讲会也是一个不错的途径,不过,好的企业通常只会去比较好的学校,可以留意一下意向公司的宣讲会安排或者直接去到一所比较好的学校参加宣讲会。像我当时校招就去参加了几场宣讲会。不过,我是在荆州上学,那边没什么比较好的学校,一般没有公司去开宣讲会。所以,我当时是直接跑到武汉来了,参加了武汉理工大学以及华中科技大学的几场宣讲会。总体感觉还是很不错的!
|
||||
- **其他** :校园就业信息网、学校论坛、班级 or 年级 QQ 群。
|
||||
|
||||
校招的话,建议以官网为准,有宣讲会、靠谱一点的内推的话更好。社招的话,可以多留意一下各大招聘网站比如 BOSS直聘、拉勾上的职位信息,也可以找被熟人内推,获得面试机会的概率更大一些,进度一般也更快一些。
|
||||
校招的话,建议以官网为准,有宣讲会、靠谱一点的内推的话更好。社招的话,可以多留意一下各大招聘网站比如 BOSS 直聘、拉勾上的职位信息,也可以找被熟人内推,获得面试机会的概率更大一些,进度一般也更快一些。
|
||||
|
||||
一般是只能投递一个岗位,不过,也有极少数投递不同部门两个岗位的情况,这个应该不会有影响,但你的前一次面试情况可能会被记录,也就是说就算你投递成功两个岗位,第一个岗位面试失败的话,对第二个岗位也会有影响,很可能直接就被pass。
|
||||
一般是只能投递一个岗位,不过,也有极少数投递不同部门两个岗位的情况,这个应该不会有影响,但你的前一次面试情况可能会被记录,也就是说就算你投递成功两个岗位,第一个岗位面试失败的话,对第二个岗位也会有影响,很可能直接就被 pass。
|
||||
|
||||
## 多花点时间完善简历
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 贡献指南
|
||||
title: 贡献指南
|
||||
category: 走近项目
|
||||
---
|
||||
|
||||
|
@ -40,4 +40,3 @@ 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/5a5f8ccb3bfb8d6ba8ac41295f1a1e4555395260) : vuepress-theme-hope 主题更新升级(比较重要的一次主题更新,从 1.x 版本升级到 2.x 版本,网站性能提升)。
|
||||
- [2021-11-09](https://github.com/Snailclimb/JavaGuide/commit/dc45389934b7763f4f9789168f71c72ef303d3c4) : 基于 vuepress 重构整个项目,提升阅读体验。
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 项目介绍
|
||||
title: 项目介绍
|
||||
category: 走近项目
|
||||
---
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 项目待办
|
||||
title: 项目待办
|
||||
category: 走近项目
|
||||
---
|
||||
|
||||
@ -11,4 +11,3 @@ category: 走近项目
|
||||
- [ ] 分布式常见理论和算法总结完善
|
||||
|
||||
欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](./contribution-guideline.md) 。
|
||||
|
||||
|
@ -9,4 +9,3 @@ icon: big-data
|
||||
- **[HBase](https://hbase.apache.org/)**: HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
|
||||
- **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
|
||||
- **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。
|
||||
|
||||
|
@ -8,4 +8,3 @@ icon: a-MachineLearning
|
||||
- **[Smile](https://github.com/haifengl/smile)** :基于 Java 和 Scala 的机器学习库。
|
||||
|
||||
相关阅读:[Java 能用于机器学习和数据科学吗?-InfoQ](https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph)
|
||||
|
||||
|
@ -8,9 +8,9 @@ icon: project
|
||||
|
||||
- [Snowy](https://gitee.com/xiaonuobase/snowy):国内首个国密前后端分离快速开发平台,定位不是深度封装的框架,也不是无代码平台,更不是某个领域的产品。详细介绍:[5.1k!这是我见过最强的前后端分离快速开发脚手架!!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247534316&idx=1&sn=69938397674fc33ecda43c8c9d0a4039&chksm=cea10927f9d68031bc862485c6be984ade5af233d4d871d498c38f22164a84314678c0c67cd7&token=1464380539&lang=zh_CN#rd)。
|
||||
- [RuoYi](https://gitee.com/y_project/RuoYi) :RuoYi 一款基于基于 SpringBoot 的权限管理系统 易读易懂、界面简洁美观,直接运行即可用 。
|
||||
- [AgileBoot-Back-End](https://github.com/valarchie/AgileBoot-Back-End) :基于Ruoyi做了大量重构优化的基础快速开发框架。
|
||||
- [AgileBoot-Back-End](https://github.com/valarchie/AgileBoot-Back-End) :基于 Ruoyi 做了大量重构优化的基础快速开发框架。
|
||||
- [RuoYi-Vue-Pro](https://github.com/YunaiV/ruoyi-vue-pro) : RuoYi-Vue 全新 Pro 版本,优化重构所有功能。
|
||||
- [Guns](https://gitee.com/stylefeng/guns) : 现代化的Java应用开发基础框架。
|
||||
- [Guns](https://gitee.com/stylefeng/guns) : 现代化的 Java 应用开发基础框架。
|
||||
- [JeecgBoot](https://github.com/zhangdaiscott/jeecg-boot):一款基于代码生成器的 J2EE 低代码快速开发平台,支持生成前后端分离架构的项目。
|
||||
- [Erupt](https://gitee.com/erupt/erupt) : 低代码全栈类框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。
|
||||
- [SmartAdmin](https://gitee.com/lab1024/smart-admin) : 一套简洁、易用的低代码中后台解决方案。
|
||||
|
@ -21,8 +21,8 @@ icon: codelibrary-fill
|
||||
### Excel
|
||||
|
||||
- [easyexcel](https://github.com/alibaba/easyexcel) :快速、简单避免 OOM 的 Java 处理 Excel 工具。
|
||||
- [excel-streaming-reader](https://github.com/monitorjbl/excel-streaming-reader):Excel 流式代码风格读取工具(只支持读取 XLSX 文件),基于 Apache POI 封装,同时保留标准 POI API 的语法。
|
||||
- [myexcel](https://github.com/liaochong/myexcel):一个集导入、导出、加密Excel等多项功能的工具包。
|
||||
- [excel-streaming-reader](https://github.com/monitorjbl/excel-streaming-reader):Excel 流式代码风格读取工具(只支持读取 XLSX 文件),基于 Apache POI 封装,同时保留标准 POI API 的语法。
|
||||
- [myexcel](https://github.com/liaochong/myexcel):一个集导入、导出、加密 Excel 等多项功能的工具包。
|
||||
|
||||
### JSON
|
||||
|
||||
|
@ -45,7 +45,7 @@ icon: "book"
|
||||
|
||||
### Nginx
|
||||
|
||||
- **[nginx-tutorial](https://github.com/dunwu/nginx-tutorial)** :一系列 Nginx 极简教程,包含HTTP 反向代理、HTTPS 反向代理、负载均衡、静态站点、文件服务器搭建等实战内容。
|
||||
- **[nginx-tutorial](https://github.com/dunwu/nginx-tutorial)** :一系列 Nginx 极简教程,包含 HTTP 反向代理、HTTPS 反向代理、负载均衡、静态站点、文件服务器搭建等实战内容。
|
||||
|
||||
## 大数据
|
||||
|
||||
|
@ -1,61 +1,34 @@
|
||||
点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
|
||||
## Servlet 总结
|
||||
|
||||
<!-- MarkdownTOC -->
|
||||
在 Java Web 程序中,**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数,供 Servlet 内部使用。一个 Servlet 类只会有一个实例,在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet 需要在 web.xml 中配置(MyEclipse 中创建 Servlet 会自动配置),**一个 Servlet 可以设置多个 URL 访问**。**Servlet 不是线程安全**,因此要谨慎使用类变量。
|
||||
|
||||
- [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的的区别)
|
||||
## 阐述 Servlet 和 CGI 的区别?
|
||||
|
||||
<!-- /MarkdownTOC -->
|
||||
### CGI 的不足之处:
|
||||
|
||||
## Servlet总结
|
||||
1,需要为每个请求启动一个操作 CGI 程序的系统进程。如果请求频繁,这将会带来很大的开销。
|
||||
|
||||
在Java Web程序中,**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet需要在web.xml中配置(MyEclipse中创建Servlet会自动配置),**一个Servlet可以设置多个URL访问**。**Servlet不是线程安全**,因此要谨慎使用类变量。
|
||||
|
||||
## 阐述Servlet和CGI的区别?
|
||||
|
||||
### CGI的不足之处:
|
||||
|
||||
1,需要为每个请求启动一个操作CGI程序的系统进程。如果请求频繁,这将会带来很大的开销。
|
||||
|
||||
2,需要为每个请求加载和运行一个CGI程序,这将带来很大的开销
|
||||
2,需要为每个请求加载和运行一个 CGI 程序,这将带来很大的开销
|
||||
|
||||
3,需要重复编写处理网络协议的代码以及编码,这些工作都是非常耗时的。
|
||||
|
||||
### Servlet的优点:
|
||||
### Servlet 的优点:
|
||||
|
||||
1,只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销
|
||||
1,只需要启动一个操作系统进程以及加载一个 JVM,大大降低了系统的开销
|
||||
|
||||
2,如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销
|
||||
|
||||
3,所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。
|
||||
|
||||
4,Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。
|
||||
4,Servlet 能直接和 Web 服务器交互,而普通的 CGI 程序不能。Servlet 还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。
|
||||
|
||||
补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。通常一个Servlet会关联一个或多个JSP页面。以前CGI经常因为性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题,所以面试的时候大可不必信口开河的诟病CGI,事实上有很多你熟悉的网站都使用了CGI技术。
|
||||
补充:Sun Microsystems 公司在 1996 年发布 Servlet 技术就是为了和 CGI 进行竞争,Servlet 是一个特殊的 Java 程序,一个基于 Java 的 Web 应用通常包含一个或多个 Servlet 类。Servlet 不能够自行创建并执行,它是在 Servlet 容器中运行的,容器将用户的请求传递给 Servlet 程序,并将 Servlet 的响应回传给用户。通常一个 Servlet 会关联一个或多个 JSP 页面。以前 CGI 经常因为性能开销上的问题被诟病,然而 Fast CGI 早就已经解决了 CGI 效率上的问题,所以面试的时候大可不必信口开河的诟病 CGI,事实上有很多你熟悉的网站都使用了 CGI 技术。
|
||||
|
||||
参考:《javaweb整合开发王者归来》P7
|
||||
参考:《javaweb 整合开发王者归来》P7
|
||||
|
||||
## Servlet接口中有哪些方法及Servlet生命周期探秘
|
||||
Servlet接口定义了5个方法,其中**前三个方法与Servlet生命周期相关**:
|
||||
## Servlet 接口中有哪些方法及 Servlet 生命周期探秘
|
||||
|
||||
Servlet 接口定义了 5 个方法,其中**前三个方法与 Servlet 生命周期相关**:
|
||||
|
||||
- `void init(ServletConfig config) throws ServletException`
|
||||
- `void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException`
|
||||
@ -63,43 +36,46 @@ Servlet接口定义了5个方法,其中**前三个方法与Servlet生命周期
|
||||
- `java.lang.String getServletInfo()`
|
||||
- `ServletConfig getServletConfig()`
|
||||
|
||||
**生命周期:** **Web容器加载Servlet并将其实例化后,Servlet生命周期开始**,容器运行其**init()方法**进行Servlet的初始化;请求到达时调用Servlet的**service()方法**,service()方法会根据需要调用与请求对应的**doGet或doPost**等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的**destroy()方法**。**init方法和destroy方法只会执行一次,service方法客户端每次请求Servlet都会执行**。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
|
||||
**生命周期:** **Web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始**,容器运行其**init()方法**进行 Servlet 的初始化;请求到达时调用 Servlet 的**service()方法**,service()方法会根据需要调用与请求对应的**doGet 或 doPost**等方法;当服务器关闭或项目被卸载时服务器会将 Servlet 实例销毁,此时会调用 Servlet 的**destroy()方法**。**init 方法和 destroy 方法只会执行一次,service 方法客户端每次请求 Servlet 都会执行**。Servlet 中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入 init 方法中,销毁资源的代码放入 destroy 方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
|
||||
|
||||
参考:《javaweb整合开发王者归来》P81
|
||||
参考:《javaweb 整合开发王者归来》P81
|
||||
|
||||
## get和post请求的区别
|
||||
## get 和 post 请求的区别
|
||||
|
||||
get和post请求实际上是没有区别,大家可以自行查询相关文章(参考文章:[https://www.cnblogs.com/logsharing/p/8448446.html](https://www.cnblogs.com/logsharing/p/8448446.html),知乎对应的问题链接:[get和post区别?](https://www.zhihu.com/question/28586791))!
|
||||
get 和 post 请求实际上是没有区别,大家可以自行查询相关文章(参考文章:[https://www.cnblogs.com/logsharing/p/8448446.html](https://www.cnblogs.com/logsharing/p/8448446.html),知乎对应的问题链接:[get 和 post 区别?](https://www.zhihu.com/question/28586791))!
|
||||
|
||||
可以把 get 和 post 当作两个不同的行为,两者并没有什么本质区别,底层都是 TCP 连接。 get请求用来从服务器上获得资源,而post是用来向服务器提交数据。比如你要获取人员列表可以用 get 请求,你需要创建一个人员可以用 post 。这也是 Restful API 最基本的一个要求。
|
||||
可以把 get 和 post 当作两个不同的行为,两者并没有什么本质区别,底层都是 TCP 连接。 get 请求用来从服务器上获得资源,而 post 是用来向服务器提交数据。比如你要获取人员列表可以用 get 请求,你需要创建一个人员可以用 post 。这也是 Restful API 最基本的一个要求。
|
||||
|
||||
推荐阅读:
|
||||
|
||||
- https://www.zhihu.com/question/28586791
|
||||
- https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
|
||||
|
||||
## 什么情况下调用doGet()和doPost()
|
||||
Form标签里的method的属性为get时调用doGet(),为post时调用doPost()。
|
||||
## 什么情况下调用 doGet()和 doPost()
|
||||
|
||||
Form 标签里的 method 的属性为 get 时调用 doGet(),为 post 时调用 doPost()。
|
||||
|
||||
## 转发(Forward)和重定向(Redirect)的区别
|
||||
|
||||
**转发是服务器行为,重定向是客户端行为。**
|
||||
|
||||
**转发(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
|
||||
request.getRequestDispatcher("login_success.jsp").forward(request, response);
|
||||
```
|
||||
**重定向(Redirect)** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse` 的 `setStatus(int status)` 方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。
|
||||
|
||||
**重定向(Redirect)** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse` 的 `setStatus(int status)` 方法设置状态码。如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源。
|
||||
|
||||
1. **从地址栏显示来说**
|
||||
|
||||
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
|
||||
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
|
||||
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
|
||||
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL.
|
||||
|
||||
2. **从数据共享来说**
|
||||
|
||||
forward:转发页面和转发到的页面可以共享request里面的数据.
|
||||
forward:转发页面和转发到的页面可以共享 request 里面的数据.
|
||||
redirect:不能共享数据.
|
||||
|
||||
3. **从运用地方来说**
|
||||
@ -113,66 +89,71 @@ forward:高.
|
||||
redirect:低.
|
||||
|
||||
## 自动刷新(Refresh)
|
||||
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新例如:
|
||||
|
||||
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:
|
||||
|
||||
```java
|
||||
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
|
||||
```
|
||||
其中5为时间,单位为秒。URL指定就是要跳转的页面(如果设置自己的路径,就会实现每过5秒自动刷新本页面一次)
|
||||
|
||||
其中 5 为时间,单位为秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会实现每过 5 秒自动刷新本页面一次)
|
||||
|
||||
## Servlet与线程安全
|
||||
**Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
|
||||
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。
|
||||
## Servlet 与线程安全
|
||||
|
||||
参考:《javaweb整合开发王者归来》P92
|
||||
**Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet()和 doPost()方法内。虽然使用 synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
|
||||
注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。
|
||||
|
||||
参考:《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是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
|
||||
工程JspLoginDemo下有一个名为login.jsp的Jsp文件,把工程第一次部署到服务器上后访问这个Jsp文件,我们发现这个目录下多了下图这两个东东。
|
||||
.class文件便是JSP对应的Servlet。编译完毕后再运行class文件来响应客户端请求。以后客户端访问login.jsp的时候,Tomcat将不再重新编译JSP文件,而是直接调用class文件来响应客户端请求。
|
||||
## JSP 工作原理
|
||||
|
||||
JSP 是一种 Servlet,但是与 HttpServlet 的工作方式不太一样。HttpServlet 是先由源代码编译为 class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
|
||||
工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。
|
||||
.class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候,Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。
|
||||
|
||||

|
||||
|
||||
由于JSP只会在客户端第一次请求的时候被编译 ,因此第一次请求JSP时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的class文件删除,服务器也会重新编译JSP。
|
||||
由于 JSP 只会在客户端第一次请求的时候被编译 ,因此第一次请求 JSP 时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的 class 文件删除,服务器也会重新编译 JSP。
|
||||
|
||||
开发Web程序时经常需要修改JSP。Tomcat能够自动检测到JSP程序的改动。如果检测到JSP源代码发生了改动。Tomcat会在下次客户端请求JSP时重新编译JSP,而不需要重启Tomcat。这种自动检测功能是默认开启的,检测改动会消耗少量的时间,在部署Web应用的时候可以在web.xml中将它关掉。
|
||||
开发 Web 程序时经常需要修改 JSP。Tomcat 能够自动检测到 JSP 程序的改动。如果检测到 JSP 源代码发生了改动。Tomcat 会在下次客户端请求 JSP 时重新编译 JSP,而不需要重启 Tomcat。这种自动检测功能是默认开启的,检测改动会消耗少量的时间,在部署 Web 应用的时候可以在 web.xml 中将它关掉。
|
||||
|
||||
参考:《javaweb整合开发王者归来》P97
|
||||
参考:《javaweb 整合开发王者归来》P97
|
||||
|
||||
## JSP有哪些内置对象、作用分别是什么
|
||||
[JSP内置对象 - CSDN博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849 )
|
||||
## JSP 有哪些内置对象、作用分别是什么
|
||||
|
||||
JSP有9个内置对象:
|
||||
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
|
||||
[JSP 内置对象 - CSDN 博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
||||
|
||||
JSP 有 9 个内置对象:
|
||||
|
||||
- request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
|
||||
- response:封装服务器对客户端的响应;
|
||||
- pageContext:通过该对象可以获取其他对象;
|
||||
- session:封装用户会话的对象;
|
||||
- application:封装服务器运行环境的对象;
|
||||
- out:输出服务器响应的输出流对象;
|
||||
- config:Web应用的配置对象;
|
||||
- page:JSP页面本身(相当于Java程序中的this);
|
||||
- config:Web 应用的配置对象;
|
||||
- page:JSP 页面本身(相当于 Java 程序中的 this);
|
||||
- exception:封装页面抛出异常的对象。
|
||||
|
||||
## Request 对象的主要方法有哪些
|
||||
|
||||
## Request对象的主要方法有哪些
|
||||
- setAttribute(String name,Object):设置名字为name的request 的参数值
|
||||
- getAttribute(String name):返回由name指定的属性值
|
||||
- getAttributeNames():返回request 对象所有属性的名字集合,结果是一个枚举的实例
|
||||
- getCookies():返回客户端的所有 Cookie 对象,结果是一个Cookie 数组
|
||||
- getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body的长度
|
||||
- getHeader(String name) :获得HTTP协议定义的文件头信息
|
||||
- getHeaders(String name) :返回指定名字的request Header 的所有值,结果是一个枚举的实例
|
||||
- getHeaderNames() :返回所以request Header 的名字,结果是一个枚举的实例
|
||||
- setAttribute(String name,Object):设置名字为 name 的 request 的参数值
|
||||
- getAttribute(String name):返回由 name 指定的属性值
|
||||
- getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
|
||||
- getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
|
||||
- getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body 的长度
|
||||
- getHeader(String name) :获得 HTTP 协议定义的文件头信息
|
||||
- getHeaders(String name) :返回指定名字的 request Header 的所有值,结果是一个枚举的实例
|
||||
- getHeaderNames() :返回所以 request Header 的名字,结果是一个枚举的实例
|
||||
- getInputStream() :返回请求的输入流,用于获得请求中的数据
|
||||
- getMethod() :获得客户端向服务器端传送数据的方法
|
||||
- getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值
|
||||
- getParameter(String name) :获得客户端传送给服务器端的有 name 指定的参数值
|
||||
- getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
|
||||
- getParameterValues(String name):获得有name指定的参数的所有值
|
||||
- getParameterValues(String name):获得有 name 指定的参数的所有值
|
||||
- getProtocol():获取客户端向服务器端传送数据所依据的协议名称
|
||||
- getQueryString() :获得查询字符串
|
||||
- getRequestURI() :获取发出请求字符串的客户端地址
|
||||
@ -185,6 +166,7 @@ JSP有9个内置对象:
|
||||
- removeAttribute(String name):删除请求中的一个属性
|
||||
|
||||
## request.getAttribute()和 request.getParameter()有何区别
|
||||
|
||||
**从获取方向来看:**
|
||||
|
||||
`getParameter()`是获取 POST/GET 传递的参数值;
|
||||
@ -193,55 +175,64 @@ JSP有9个内置对象:
|
||||
|
||||
**从用途来看:**
|
||||
|
||||
`getParameter()`用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或url重定向传值时接收数据用。
|
||||
`getParameter()`用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或 url 重定向传值时接收数据用。
|
||||
|
||||
`getAttribute()` 用于服务器端重定向时,即在 sevlet 中使用了 forward 函数,或 struts 中使用了
|
||||
mapping.findForward。 getAttribute 只能收到程序用 setAttribute 传过来的值。
|
||||
|
||||
另外,可以用 `setAttribute()`,`getAttribute()` 发送接收对象.而 `getParameter()` 显然只能传字符串。
|
||||
`setAttribute()` 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样`getAttribute()`就能取得你所设下的值,当然这种方法可以传对象。session也一样,只是对象在内存中的生命周期不一样而已。`getParameter()`只是应用服务器在分析你送上来的 request页面的文本时,取得你设在表单或 url 重定向时的值。
|
||||
`setAttribute()` 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样`getAttribute()`就能取得你所设下的值,当然这种方法可以传对象。session 也一样,只是对象在内存中的生命周期不一样而已。`getParameter()`只是应用服务器在分析你送上来的 request 页面的文本时,取得你设在表单或 url 重定向时的值。
|
||||
|
||||
**总结:**
|
||||
|
||||
`getParameter()`返回的是String,用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)
|
||||
`getParameter()`返回的是 String,用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)
|
||||
|
||||
`getAttribute()`返回的是Object,需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
|
||||
`getAttribute()`返回的是 Object,需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
|
||||
|
||||
## include指令include的行为的区别
|
||||
**include指令:** JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。 语法格式如下:
|
||||
## include 指令 include 的行为的区别
|
||||
|
||||
**include 指令:** JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。 语法格式如下:
|
||||
<%@ include file="文件相对 url 地址" %>
|
||||
|
||||
i**nclude动作:** `<jsp:include>`动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式如下:
|
||||
i**nclude 动作:** `<jsp:include>`动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式如下:
|
||||
<jsp:include page="相对 URL 地址" flush="true" />
|
||||
|
||||
## JSP九大内置对象,七大动作,三大指令
|
||||
[JSP九大内置对象,七大动作,三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
||||
## JSP 九大内置对象,七大动作,三大指令
|
||||
|
||||
[JSP 九大内置对象,七大动作,三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
|
||||
|
||||
## 讲解 JSP 中的四种作用域
|
||||
|
||||
JSP 中的四种作用域包括 page、request、session 和 application,具体来说:
|
||||
|
||||
## 讲解JSP中的四种作用域
|
||||
JSP中的四种作用域包括page、request、session和application,具体来说:
|
||||
- **page**代表与一个页面相关的对象和属性。
|
||||
- **request**代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
|
||||
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
|
||||
- **application**代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
|
||||
- **request**代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
|
||||
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
|
||||
- **application**代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
|
||||
|
||||
## 如何实现JSP或Servlet的单线程模式
|
||||
对于JSP页面,可以通过page指令进行设置。
|
||||
## 如何实现 JSP 或 Servlet 的单线程模式
|
||||
|
||||
对于 JSP 页面,可以通过 page 指令进行设置。
|
||||
`<%@page isThreadSafe="false"%>`
|
||||
|
||||
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
|
||||
对于 Servlet,可以让自定义的 Servlet 实现 SingleThreadModel 标识接口。
|
||||
|
||||
说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
|
||||
说明:如果将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
|
||||
|
||||
## 实现会话跟踪的技术有哪些
|
||||
1. **使用Cookie**
|
||||
|
||||
向客户端发送Cookie
|
||||
1. **使用 Cookie**
|
||||
|
||||
向客户端发送 Cookie
|
||||
|
||||
```java
|
||||
Cookie c =new Cookie("name","value"); //创建Cookie
|
||||
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
|
||||
response.addCookie(c); //把Cookie放入到HTTP响应中
|
||||
```
|
||||
从客户端读取Cookie
|
||||
|
||||
从客户端读取 Cookie
|
||||
|
||||
```java
|
||||
String name ="name";
|
||||
Cookie[]cookies =request.getCookies();
|
||||
@ -257,37 +248,39 @@ if(cookies !=null){
|
||||
}
|
||||
|
||||
```
|
||||
**优点:** 数据可以持久保存,不需要服务器资源,简单,基于文本的Key-Value
|
||||
|
||||
**缺点:** 大小受到限制,用户可以禁用Cookie功能,由于保存在本地,有一定的安全风险。
|
||||
**优点:** 数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value
|
||||
|
||||
**缺点:** 大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。
|
||||
|
||||
2. URL 重写
|
||||
|
||||
在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。
|
||||
在 URL 中添加用户会话的信息作为请求的参数,或者将唯一的会话 ID 添加到 URL 结尾以标识一个会话。
|
||||
|
||||
**优点:** 在Cookie被禁用的时候依然可以使用
|
||||
**优点:** 在 Cookie 被禁用的时候依然可以使用
|
||||
|
||||
**缺点:** 必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问。
|
||||
**缺点:** 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。
|
||||
|
||||
3.隐藏的表单域
|
||||
|
||||
```html
|
||||
<input type="hidden" name ="session" value="..."/>
|
||||
<input type="hidden" name="session" value="..." />
|
||||
```
|
||||
|
||||
**优点:** Cookie被禁时可以使用
|
||||
**优点:** Cookie 被禁时可以使用
|
||||
|
||||
**缺点:** 所有页面必须是表单提交之后的结果。
|
||||
|
||||
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 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
|
||||
|
||||
**Cookie 一般用来保存用户信息** 比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
|
||||
**Cookie 一般用来保存用户信息** 比如 ① 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;② 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③ 登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
|
||||
|
||||
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。
|
||||
|
||||
Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。
|
||||
Cookie 存储在客户端中,而 Session 存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 代码命名指南
|
||||
title: 代码命名指南
|
||||
category: 代码质量
|
||||
---
|
||||
|
||||
@ -17,7 +17,7 @@ category: 代码质量
|
||||
|
||||
据说之前在 Quora 网站,由接近 5000 名程序员票选出来的最难的事情就是“命名”。
|
||||
|
||||
大名鼎鼎的《重构》的作者老马(Martin Fowler)曾经在[TwoHardThings](https://martinfowler.com/bliki/TwoHardThings.html)这篇文章中提到过CS 领域有两大最难的事情:一是 **缓存失效** ,一是 **程序命名** 。
|
||||
大名鼎鼎的《重构》的作者老马(Martin Fowler)曾经在[TwoHardThings](https://martinfowler.com/bliki/TwoHardThings.html)这篇文章中提到过 CS 领域有两大最难的事情:一是 **缓存失效** ,一是 **程序命名** 。
|
||||
|
||||

|
||||
|
||||
@ -233,8 +233,8 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
|
||||
|
||||
1. 《阿里巴巴 Java 开发手册》
|
||||
2. 《Clean Code》
|
||||
3. Google Java 代码指南:https://google.github.io/styleguide/javaguide.html
|
||||
4. 告别编码5分钟,命名2小时!史上最全的Java命名规范参考:https://www.cnblogs.com/liqiangchn/p/12000361.html
|
||||
3. Google Java 代码指南:<https://google.github.io/styleguide/javaguide.html>
|
||||
4. 告别编码 5 分钟,命名 2 小时!史上最全的 Java 命名规范参考:<https://www.cnblogs.com/liqiangchn/p/12000361.html>
|
||||
|
||||
## 总结
|
||||
|
||||
@ -247,4 +247,3 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
|
||||
另外,国人开发的一个叫做 Codelf 的网站被很多人称为“变量命名神器”,当你为命名而头疼的时候,你可以去参考一下上面提供的一些命名示例。
|
||||
|
||||
最后,祝愿大家都不用再为命名而困扰!
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 代码重构指南
|
||||
title: 代码重构指南
|
||||
category: 代码质量
|
||||
---
|
||||
|
||||
|
@ -15,7 +15,7 @@ category: 系统设计
|
||||
|
||||
简单来说,软件危机描述了当时软件开发的一个痛点:我们很难高效地开发出质量高的软件。
|
||||
|
||||
Dijkstra(Dijkstra算法的作者) 在 1972年图灵奖获奖感言中也提高过软件危机,他是这样说的:“导致软件危机的主要原因是机器变得功能强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题。当我们有一些弱小的计算机时,编程成为一个温和的问题,而现在我们有了庞大的计算机,编程也同样成为一个巨大的问题”。
|
||||
Dijkstra(Dijkstra 算法的作者) 在 1972 年图灵奖获奖感言中也提高过软件危机,他是这样说的:“导致软件危机的主要原因是机器变得功能强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题。当我们有一些弱小的计算机时,编程成为一个温和的问题,而现在我们有了庞大的计算机,编程也同样成为一个巨大的问题”。
|
||||
|
||||
**说了这么多,到底什么是软件工程呢?**
|
||||
|
||||
@ -34,7 +34,7 @@ Dijkstra(Dijkstra算法的作者) 在 1972年图灵奖获奖感言中也提
|
||||
- 需求分析 :分析用户的需求,建立逻辑模型。
|
||||
- 软件设计 : 根据需求分析的结果对软件架构进行设计。
|
||||
- 编码 :编写程序运行的源代码。
|
||||
- 测试 : 确定测试用例,编写测试报告。
|
||||
- 测试 : 确定测试用例,编写测试报告。
|
||||
- 交付 :将做好的软件交付给客户。
|
||||
- 维护 :对软件进行维护比如解决 bug,完善功能。
|
||||
|
||||
@ -44,15 +44,13 @@ Dijkstra(Dijkstra算法的作者) 在 1972年图灵奖获奖感言中也提
|
||||
|
||||
## 软件开发模型
|
||||
|
||||
软件开发模型有很多种,比如瀑布模型(Waterfall Model)、快速原型模型(Rapid Prototype Model)、V模型(V-model)、W模型(W-model)、敏捷开发模型。其中最具有代表性的还是 **瀑布模型** 和 **敏捷开发** 。
|
||||
软件开发模型有很多种,比如瀑布模型(Waterfall Model)、快速原型模型(Rapid Prototype Model)、V 模型(V-model)、W 模型(W-model)、敏捷开发模型。其中最具有代表性的还是 **瀑布模型** 和 **敏捷开发** 。
|
||||
|
||||
**瀑布模型** 定义了一套完成的软件开发周期,完整地展示了一个软件的的生命周期。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**敏捷开发模型** 是目前使用的最多的一种软件开发模型。[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/软件开发过程)
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: 单元测试到底是什么?应该怎么做?
|
||||
title: 单元测试到底是什么?应该怎么做?
|
||||
category: 代码质量
|
||||
---
|
||||
|
||||
@ -113,7 +113,7 @@ JUnit 几乎是默认选择,但是其不支持 Mock,因此我们还需要选
|
||||
|
||||
究竟是选择 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 的代码要更简洁。
|
||||
- Mockito 使用的人群更广泛,稳定可靠。并且,Mockito 是 SpringBoot Test 默认集成的 Mock 工具。
|
||||
|
||||
|
@ -8,7 +8,7 @@ head:
|
||||
content: 设计模式,单例模式,责任链模式,适配器模式,工厂模式,代理模式
|
||||
- - meta
|
||||
- name: description
|
||||
content: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象 的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临 的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当⻓的 一段时间的试验和错误总结出来的。
|
||||
content: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象 的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临 的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当⻓的 一段时间的试验和错误总结出来的。
|
||||
---
|
||||
|
||||
**设计模式** 相关的面试题已经整理到了 PDF 手册中,你可以在我的公众号“**JavaGuide**”后台回复“**PDF**” 获取。
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
title: MyBatis常见面试题总结
|
||||
title: MyBatis常见面试题总结
|
||||
category: 框架
|
||||
icon: "database"
|
||||
tag:
|
||||
|
@ -8,7 +8,7 @@ head:
|
||||
content: 定时任务,Quartz,Elastic-Job,XXL-JOB,PowerJob
|
||||
- - meta
|
||||
- name: description
|
||||
content: XXL-JOB 2015 年推出,已经经过了很多年的考验。XXL-JOB 轻量级,并且使用起来非常简单。虽然存在性能瓶颈,但是,在绝大多数情况下,对于企业的基本需求来说是没有影响的。PowerJob 属于分布式任务调度领域里的新星,其稳定性还有待继续考察。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库,性能方面的话,ElasticJob 略胜一筹。
|
||||
content: XXL-JOB 2015 年推出,已经经过了很多年的考验。XXL-JOB 轻量级,并且使用起来非常简单。虽然存在性能瓶颈,但是,在绝大多数情况下,对于企业的基本需求来说是没有影响的。PowerJob 属于分布式任务调度领域里的新星,其稳定性还有待继续考察。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库,性能方面的话,ElasticJob 略胜一筹。
|
||||
---
|
||||
|
||||
## 为什么需要定时任务?
|
||||
|
@ -57,10 +57,10 @@ Web 端消息推送示例:
|
||||
setInterval(() => {
|
||||
// 方法请求
|
||||
messageCount().then((res) => {
|
||||
if (res.code === 200) {
|
||||
this.messageCount = res.data
|
||||
}
|
||||
})
|
||||
if (res.code === 200) {
|
||||
this.messageCount = res.data;
|
||||
}
|
||||
});
|
||||
}, 1000);
|
||||
```
|
||||
|
||||
@ -151,7 +151,7 @@ public class AsyncRequestTimeoutHandler {
|
||||
|
||||
iframe 流就是在页面中插入一个隐藏的`<iframe>`标签,通过在`src`中请求消息数量 API 接口,由此在服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。
|
||||
|
||||
传输的数据通常是 HTML、或是内嵌的JavaScript 脚本,来达到实时更新页面的效果。
|
||||
传输的数据通常是 HTML、或是内嵌的 JavaScript 脚本,来达到实时更新页面的效果。
|
||||
|
||||

|
||||
|
||||
@ -183,7 +183,7 @@ public class IframeController {
|
||||
}
|
||||
```
|
||||
|
||||
iframe 流的服务器开销很大,而且IE、Chrome等浏览器一直会处于 loading 状态,图标会不停旋转,简直是强迫症杀手。
|
||||
iframe 流的服务器开销很大,而且 IE、Chrome 等浏览器一直会处于 loading 状态,图标会不停旋转,简直是强迫症杀手。
|
||||
|
||||

|
||||
|
||||
@ -437,14 +437,11 @@ MQTT 协议为什么在物联网(IOT)中如此受偏爱?而不是其它协
|
||||
|
||||
> 以下内容为 JavaGuide 补充
|
||||
|
||||
| | 介绍 | 优点 | 缺点 |
|
||||
| --------- | ------------------------------------------------------------ | ---------------------- | ---------------------------------------------------- |
|
||||
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
|
||||
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
|
||||
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
|
||||
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
|
||||
| | 介绍 | 优点 | 缺点 |
|
||||
| --------- | ------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------- |
|
||||
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
|
||||
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
|
||||
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
|
||||
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
|
||||
| WebSocket | 除了最初建立连接时用 HTTP 协议,其他时候都是直接基于 TCP 协议进行通信的,可以实现客户端和服务端的全双工通信。 | 性能高、开销小 | 对开发人员要求更高,实现相对复杂一些 |
|
||||
| MQTT | 基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |
|
||||
|
||||
|
||||
|
||||
| MQTT | 基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |
|
||||
|
@ -18,7 +18,7 @@ tag:
|
||||
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
|
||||
- Docker 可以**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
|
||||
|
||||
官网地址:https://www.docker.com/ 。
|
||||
官网地址:<https://www.docker.com/> 。
|
||||
|
||||

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