![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
javaWeb进阶
文章平均质量分 89
smart哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
封装ThreadLocal
之前有一次面试时,我提到项目中使用了BaseController,里面封装了ThreadLocal,可以获取Interceptor中存入的用户信息,然后面试官问我是否了解分布式场景下ThreadLocal导致的用户信息混乱的问题。另外,之前在知乎专栏讨论过,ThreadLocalMap是定义在ThreadLocal内部的,由于包权限问题,我们无法直接使用。比如,在Interceptor创建的对象是紫霞,而Service创建的是青霞,紫霞在至尊宝存入的东西,后面的青霞可没办法。思路分析到这,我们开始写代码。原创 2023-12-06 08:55:36 · 1183 阅读 · 0 评论 -
再谈谈ThreadLocal
大部分面试官喜欢问ThreadLocal,却错误地以为东西是存在ThreadLocal中,并且笃定key是当前线程...东西实际被存在每一个Thread的ThreadLocalMap中,所以广义上可以理解为东西是存在Thread中。关于三者的关系,急性子的朋友可以直接先拉到文章末尾看看那张图。原创 2023-12-06 08:40:33 · 925 阅读 · 0 评论 -
封装PoiExcelUtils
上面的工具类封装具有一定难度,尽量理解即可。网络上还有一种封装方式,需要调用者自己在外部组装好各个字段对应的Map传入Util。但个人认为POI本身效率就不高,所以这点性能提升可有可无,用起来还麻烦。至此,对POI的学习告一段落,请不要在生产环境使用PoiExcelUtils(可能发生OOM),推荐使用EasyExcel。作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2023-12-06 08:35:55 · 1277 阅读 · 0 评论 -
POI Excel导入导出(下)
上一篇通过四个简单的小例子,我们已经初步体会了POI导入导出Excle的便捷,但都是测试案例,并不是实际的开发场景。所以,这一篇我们来模拟一下web场景下的Excel上传及下载。原创 2023-12-05 08:25:21 · 416 阅读 · 0 评论 -
POI Excel导入导出(上)
常见的Excel操作工具有JXL、POI等。JXL只能对Excel进行操作,属于比较老的框架,而且只支持到Excel95-2000版本,现在已经停止更新和维护,这里不做过多介绍。POI是Apache的项目,可以对微软/WPS的Word、Excel、PPT甚至OutLook进行操作。说这句话目的只有一个,就是告诉大家POI不仅仅只能处理Excel,Word、PPT这些办公组件也同样适用。但实际开发中处理Excel的场景几乎占了95%以上,所以我们只介绍POI处理Excel的部分。原创 2023-12-05 08:18:52 · 984 阅读 · 0 评论 -
同源策略与跨域
不论个人练习还是实际开发,我们都不可避免地会遇到跨域问题,而造成跨域的罪魁祸首就是浏览器的同源策略。要解决跨域,首先要了解同源策略。主要内容。原创 2023-12-04 08:56:20 · 1003 阅读 · 0 评论 -
前后端数据传输格式(下)
上篇主要复习了HTTP以及POST相关的几种传参形式,这一篇来讲讲和实际开发更为紧密的内容:JSON。这三个能力,其实都依赖于你对JSON的理解(本文主要讨论JSON,不涉及表单请求和文件上传类型)。原创 2023-12-04 08:24:50 · 1182 阅读 · 0 评论 -
前后端数据传输格式(上)
作为后端,写完接口一定要自测,而Postman可以说是最常用的接口测试工具了。但是在介绍Postman的使用之前,我们需要复习一下GET/POST请求的一些细节。原创 2023-12-03 09:07:23 · 1340 阅读 · 0 评论 -
深入理解Servlet(下)
web.xml知道了映射器的映射规则后,我们来分析下上图中三种拦截方式会发生什么。但在此之前,我必须再次强调,我从没说我现在写的是SpringMVC的DispatcherServlet,这是我自己自定义的一个普通Servlet,恰好名字叫DispatcherServlet而已。所以,下面的内容,请当做一个普通Servlet的映射分析。*.do:拦截.do结尾此时,各个Servlet和谐相处,没问题。/*:拦截所有拦截localhost:8080拦截localhost:8080/index.html。原创 2023-12-03 08:41:46 · 995 阅读 · 0 评论 -
深入理解Servlet(中)
这一篇,我们打算换种形式,将上面的那张图用Java代码重新“画”一遍,造一个山寨版的Tomcat容器来初始化山寨版的Servlet。由于现在Java开发都是以注解形式为主导,所以我们打算抛弃传统的标签,使用自定义的@MyWebServlet注解标识Servlet类(Servlet3.0开始推出@WebServlet标注Servlet)。借助这张图,我们能够大致了解Tomcat作为web容器是如何创建和管理web组件的(Filter、Servlet、Listener)。原创 2023-12-02 10:42:40 · 371 阅读 · 0 评论 -
深入理解Servlet(上)
但是针对每一种请求,业务逻辑代码是不同的,HttpServlet无法知晓子类想干嘛,所以就抽出七个方法,并且提供了默认实现:报405、400错误,提示请求不支持。五个方法,最难的地方在于形参,然而Tomcat会事先把形参对象封装好传给我...除此以外,既不需要我写TCP连接数据库,也不需要我解析HTTP请求,更不需要我把结果转成HTTP响应,request对象和response对象帮我搞定了。如果你观察培训班的教材,会发现进入Tomcat阶段后,我们开始全面面向接口编程,而且最早出现在JDBC阶段。原创 2023-12-02 10:36:05 · 1150 阅读 · 0 评论 -
谈谈Listener
只有当在Servlet中调用request.getSession(),且根据JSESSIONID找不到对于的Session时,才会创建新的Session对象,才会被监听到。所谓生命周期监听器,就是监听三大域对象的创建和销毁。每当Tomcat创建或销毁三大域对象,都会被这些监听器察觉,然后它们会做相应的操作(调用自身的特定方法)。每当我们给域对象设置值或者从里面取值,都会被它们监听到,然后还是触发它们特定的方法。监听器肯定不是通过定时任务实现的,毕竟它的方法调用时机是在“被监听对象特定行为发生时”。原创 2023-12-02 10:27:26 · 841 阅读 · 0 评论 -
Tomcat外传
其实对于何谓动态资源,我也没有很精准的概念。要讲清楚一个东西是什么,有时是比较难的事。不如先说它不是什么。动态资源不等同于动态页面。所谓动态页面,就是页面会动,而会动的页面不一定是动态资源。比如我可以用JQuery执行一段代码,让一个Div不断放大缩小,但是很显然它还是一个HTML页面。所谓动态资源,其实最显著的特征就是它能动态地生成HTML!比如JSP。动态资源有个“特色”:它的数据是“可拼装”的、而且“可以随时间变化”。原创 2023-12-01 09:31:12 · 1220 阅读 · 0 评论