写在前面
最近几天看到一篇博文,说解析 JSP 的文章,文章作者从接触开发一直到现在,将 JSP 分析有条有理,而且文章中还有一部分是回忆过往的回想,让本作者看到以后十分感慨。结合这些年一路走来,让自己也陷入沉思。
回忆
作者是一位10+年时间的老码农,回忆了一下第一次接触所谓的计算机语言那是上大学的时候。那个时候对于自己来说,这些所谓的计算机语言,那是它们认识我,我却不认识它们。记得学习第一门语言是 Pascal 这门课,记忆最深的就是老师课堂上说的那句话“Pascal 语言是一切语言的基础,学会它再学别的语言就简单”。至于我为什么记着这句话,一会再说。面对黑板上密密麻麻的指令,我当时只能说一句“这都是些什么东西”。转眼间第二个学期,又一门语言,C 语言,然后就提到刚才那句记忆尤新的话“C 语言是一切语言的基础,学会它再学别的语言就简单”。好吧,幸亏上学期没好好学 Pascal,转眼一年过去了,一切计算机语言的基础一下子换了个主。说到了这里了,有人就想问作者,你什么时候上的大学?!我只能说我上大学的时候,手机都不普及,上网都是64k猫拨号,大二的时候才刚普及网吧。不多说了,再多说就可以穿越了。
正题
第一次接触 JSP 的时候,仔细的回忆了一下,应该是在2004年 - 2005年之间吧,具体的实在想不起来了。那个时候就感觉这个 JSP 好强大。当时也不懂什么 MVC,甚至就连数据库的 JDBC 连接都写在 JSP 页面中。当初在页面中又是读数据库又是定义 List 集合,然后各种处理,写出一个分页来,那是多么无比牛X外加炫酷,为了这个历史时刻,还特意的分享到了 QQ 空间炫耀了一把(到现在我还能找到这篇QQ文章)。
然后用 JSP 做的第一个项目就是给一个政府机构做一个网站,当初自己技术不好,为了能拿下这个政府网站的项目,公司特意和一个专门从事这个行业的公司合作做的,为了是以后能开拓这个行业的行业项目。那时候我就奔波与本地与北京之间(那个时候去北京记得好像就两趟快车,早晚各一趟,单程需要5个半小时),话说一个网站有什么复杂的,如果用现在的思维定论去看当时的那个网站,感觉那个时候自己太low了。这个项目是真学到东西了,MVC ?原来是这么回事,从控制器里取数据传递到 JSP 中。晕?Servlet ?什么什么 doGet 和 doPost,emm。啥?Struts 框架?Winform?为什么是这样?除了网站还有一部分行业项目。各种疑惑与疑虑,各种怀疑人生,当时就想还是人家技术牛。勉强跟着人家终于学了些东西,之后把人家的另外一个行业项目拿下,然后终于可有自己去完成这个项目。后来离开了这个公司,至于为什么离开,原因很简单,公司有一个做 PB 和 Delphi 的元老,当时很谦虚的和他一起搞项目,但是他的编程思想实在是不敢恭维,他实在是接受不了我们这些 B/S 架构的软件开发模式。成天把一句话挂自己嘴边“我有10年开发软件的经验…”,您自己慢慢10年吧,我不干了。
辞职换了一个公司,接触了风靡一时的 SSH 框架,然后再接触到 ExtJS,当时为了能做出一个效果,那是真绞尽脑汁,到处问,到处搜,那个时候有关于 ExtJS 的文章还不多。后来还碰见公司一个 ExtJS 牛人,问他为何这么精通 ExtJS,得知他是按照 ExtJS 的 API 一点一点的试的。然后就是更高级点的 Web 服务器,WebLogic 和 WebSphere等吧,然后跟着学各种配置,那是超级晕菜啊。
当时就抱着 JSP 就没放过,记得当初另外一个项目现场用的是 FreeMarker 模板做页面,要把我派到那个现场做开发,实在不爱学也不爱搞,就特意给领导申请不去那里。
时间变迁
这些年过来,随着时间的推移,技术的更新换代,不管你是在学校学的,还是在培训机构培训的,JSP 应该一下子就带过了。一个现代主流 Java Web 应用,不管前端、后端、还是微服务架构,都在淘汰 JSP。如果还埋怨以前的开发前后端不好分离的话,而现在前后端分离已经不是什么趋势了,而是当前 B/S 架构开发的主流模式了。前端框架已经非常成熟和稳定,不需要 JSP。前后端分离之后,前端只负责展现和交互,后端负责核心业务逻辑。前后端通过 API 进行交互,并且最好符合 RESTful 风格。服务器端把数据返回给前端就不再关心这些数据用在哪里、如何布局、什么样式。
服务器端的 Spring MVC/WebFlux 和 Spring Boot 已经开始抛弃 JSP。从 Spring 5 开始,在原有的基于 Servlet 技术的 Spring MVC 之外增加了一个新的编程模型,就是 Spring WebFlux。Spring WebFlux 是响应式非阻塞的,而且不支持 Servlet API,所以也就不支持 JSP了。至少 Spring MVC 还是支持 JSP 的,个人认为现在已经快是 Spring Boot 的天下了,Spring MVC 都快渐行渐远了。有人说了 Spring Boot 是支持 JSP 的,是的是支持的。
其实用 Spring Boot 的人都知道,它默认的模板引擎是什么?先不管是什么,肯定不是 JSP。是的, Spring Boot 是支持 JSP的,但是 Spring Boot 对 JSP 是有限制的,只能凑合着用 JSP。这里就不去研究到底有什么限制,官方文档里都有说明,而且网上一搜一大把。
好吧,我们继续说一下 Spring Cloud。因为有 Spring Boot 对 JSP 的限制,而 Spring Cloud 的组成部分是 Spring Boot 应用,所以 Spring Cloud 也对 JSP 有限制。其实不仅仅是表面上这个原因,咱们继续分析。
如果强行继续在Spring Cloud环境中继续使用JSP,那么JSP放在哪里?有两种方案吧:
- API Gateway 和每个 MicroService 里面都有 @Controller 以及对应的 JSP。那么这种方案下,不同微服务中的 JSP 如何通信?用户访问的时候,同一个应用下的所有 JSP 页面会在不同 IP 和端口下来回变换。一会是 ip0:8081/xxx/xxx.jsp,一会是 ip1:8082/xxx/xxx.jsp,点个连接又跳转到 ip2:8080/xxx/xxx.jsp.
- 把整个微服务应用下的所有 @Controller 和 JSP 都放在 API Gateway 里面,其他 Microservice 中只有提供 REST API 的 @Controller 和 @Service。这种方案并不算理想的微服务架构,因为 Gateway 没有解耦,里面的所有 @Controller 不能拆分部署。这样就相当于在 MicroService 架构下有了一个局部的 Monolithic(单体应用)。
以上的方案实在不愿去继续思考了,用一句现在流行的话说就是“太蛋疼了”。其实都已经 Spring Cloud 了,前后端分离开发势在必行了,再用 JSP 就无法完美拆分微服务,无法利用微服务本应带来的各种优势。
就这么多吧
文中的内容有摘抄,有自己叙述,有自己见解,不代表任何一方,个人想法而已。现在 JSP 处于被前后端夹击的状态,生存空间越来越小了。就算你不打算管前端,只想在服务器端有所建树。微服务的前提也必须前后端分离。如果你还继续 JSP(别闹好吗),服务器端只能停留在 SSH/SSM 阶段,用 Spring Boot + Spring MVC 已经最高领域了。