大学毕业往后,开始用Java做的第一个实际项目是对日外包,是2001年。
日方有一套很老的系统,想用Java重构一下,哀求用JSP
我放工就跑去西单图书大厦,创造那里的书都还是Servlet的, 没有JSP的!

还好,当时的公司同时进行的一项业务便是代理BEA的Weblogic(BEA是三个从SUN出来的人创建的,后来被Oracle收购)。
Weblogic的产品文档里包含非常全面的JSP先容,以是起初对JSP的学习都是从Weblogic开始的。

那时候还没听说过什么Struts。
自己在SUN的官网创造了WAF的文档,全称是Web Application Framework,算是最早MVC模式的先容。
这个WAF不算是框架,只是先容了MVC模式该当是个什么样子,如何用Servlet+JSP实现MVC模式。
SUN的官网供应了少量的样例代码,剩下的都是我们根据文档自己搭建和实践。

jsp吧废弃JSP吧不然你无路可走 Python

在项目的中后期(02年下半年吧),有一次坐班车,听到后面座位上两个人在说话。
一个人问:你知道Struts吗?其余一个人说:不知道。
问的那个人说:便是S T R U T S这几个字母,开拓Java的。
我偷偷记在心里,然后第二天上网查了一下(当时没有智能机,家里也没有WIFI),才算开启了Apache这扇大门。
后来在ASF上又学习了Cocoon、pluto、turbine等等很多框架。

大概02年底,对日外包项目顺利完成了,我公司开始接海内的项目。
第一个海内项目是东北一所大学的科研经费审批项目。
记得去给人家支配和演示的时候特殊故意思。
我们用了半天韶光在做事器上支配好,然后去给客户演示。
打开浏览器,输入ip+端口,开始操作。
操作了十几分钟,所有的客户没有说一个字。
越演示心里越没底,不知道客户啥反应。
大概又过了几分钟,客户的主任发话了:你们的软件呢?

我们的软件呢?我给你演示了半天,这不便是我们的软件吗?末了才明白,用户认为只有下载一个类似叫setup.exe或install.exe的程序,双击,然后下一步下一步,末了桌面上涌现一个快捷办法,那才算是软件!
在经由少焉的不可思议之后,我认为实际用户的理念总是掉队于研发职员的理念,这个我很随意马虎想明白。
但后来创造,我那些学PB、Delphi的师兄弟也不是一时半会能接管B/S构造的运用算是软件的...他们认为:你不便是写个网页吗???

再后来,从03-08年,长期从事企业运用开拓,紧张是基于Weblogic Platform,包括Server、Integration、Portal,个中在Portal上事情的韶光最多。

个中04-05年用Weblogic Portal做深圳市最大的电子政务项目,06-07年用Weblogic平台做广东省电信的3G业务平台,08-09年用Aqualogic做南方电网的SOA。

Weblogic Server中集成了Struts,没记错的话当时是1.1版本。
BEA把Struts做了升级和改造,可以在Weblogic Workshop中可视化开拓,便是下面这样:

个中圆形代表Action,有Begin Action,End Action,还有普通的中间节点Action。
BEA把Struts的这个升级称作Java Page Flow(Java 页面流)。
一组这样的图形当中包含的Action和JSP,会定义在一个扩展名是.jpf的文件中。

后来,BEA把JPF捐献给了Apache,成为ASF下的一个开源项目Apache Beehive。

Welcome to Apache Beehivebeehive.apache.org

这个项目现在已经停滞更新了。

大概从06年开始,打仗到了YUI,也便是Yahoo User Interface,Yahoo开源的一套前端JS组件库。
从此算是开启了我的前端之路。

07-08年开始用Extjs,作者说Ext便是Extension(扩展)的意思,扩展了YUI,供应了更丰富的适宜企业开拓的前端组件。
但这时候,Extjs还仅仅是丰富的UI组件库,算不上框架。
便是在JSP天生的HTML里面嵌入Extjs的组件。

09-11年用GWT,便是Google Web Toolkits。
Google当时的想法很前辈,用Java开拓前端UI,终极编译成JS。
有点类似于现在TS编译成JS的过程,便是打算利用上Java的强类型、面向工具等特点。
这时候就已经完备前后端分离了。
可以说从08年之后我就再也没写过JSP,一个页面也没写过。

10年开始用Bootstrap。
这时候GWT的缺陷就暴露出来了,CSS非常难改。
直到13年初,开始用上了Angularjs。
记得当时在智联招聘上发布职位的时候搜了一下,北京市只有用友和我们公司招聘Angularjs开拓。
后来就从Angularjs用到React,又用回Angular4,一贯到现在都以最新版本的Angular为主,企业运用和互联网运用都有开拓。
移动开拓紧张用Ionic,React Native也用过。

为什么要详细先容我过去和JSP以及前端框架干系的开拓经历呢?是由于我想表达一个不雅观点:如果要客不雅观公道评价JSP是否还有必要用,特殊是还有必要学,须要一个真正长期用过JSP(前后端不分离)开拓,也真正长期用前端框架(前后端分离)开拓的人才可以。

就像我在有些知乎答案下评论的那样:

碰着这种情形,我总想起福特的名言:“如果我当年去问顾客他们想要什么,他们肯定会见告我:‘一匹更快的马。
’”

满大街跑马车的时期,福特问顾客须要什么,顾客就说须要一匹更快的马。
他们不知道汽车时期会给生活带来若何革命性的变革。

在BP机时期,大家认为有人戴BP机已经很牛了。
满大街诺基亚摩托罗拉功能机的时期,大家也都以为够用了。
问他们须要什么,他们估计会回答:充一次电能不能待机一个月?能不能把自己喜好的MP3当彩铃?

我以为要比拟评价两代产品,该当给两代产品都闇练体验过的人去判断。
从功能机时期过来的人,现在iphone都已经用到第三部了,你再问他功能机够不足用。
就拿一个两代产品都具有的功能(比如都可以QQ谈天)比拟,你乐意回到功能机时期还是连续用智能机。

一贯抱定JSP不撒手,没动力、没能力学习前端技能,没有真正理解前后端分离开拓模式的人,不可能得出公道全面的评价。

在校期间或参加培训班就学习了前端框架,参加事情后就开始前后端分离的人,也无法理解老人只用JSP或用JSP+JS前端UI组件的开拓模式是个怎么回事。

上面两种人,据我实际打仗中理解,大部分都认为自己的开拓模式是天经地义的。
就像我之前描述自己刚毕业时候的经历一样。
大部分客户和我的一些同学,天经地义认为双击setup.exe,然后下一步下一步才是软件。
而我天经地义认为B/S架构的也是软件,只是更便于开拓和操作。

JSP为什么不适宜现在的主流开拓,为什么正在被抛弃

过去一年多,陆陆续续在知乎上回答了一些关于JSP的问题。
当然,我的回答都是建议淘汰JSP,新人小白一定不要再学JSP了。
我现在集中把这些技能成分归纳一下。

一个当代主流Java Web运用,不管前端、后端、还是微做事架构,都在淘汰JSP。

个中,我认为Java做事器端主流技能还是Spring(Spring Boot + Spring MVC + Spring Cloud)。

下面三点,第一点险些尽人皆知,第二点有一部分人清楚,第三点却很少有人意识到。

前端框架已经非常成熟和稳定,不须要JSP前后端分离已经不是什么趋势了,而是当前B/S架构开拓的主流模式。
前后端分离之后,前端只卖力展现和交互,后端卖力核心业务逻辑。
前后端通过API进行交互,并且最好符合RESTful风格。
做事器端把数据返回给前端就不再关心这些数据用在哪里、如何布局、什么样式。

这个层面的缘故原由非常随意马虎理解,也是绝大多数谈论JSP是否还有必要学的时候里都会提到的。

做事器真个Spring MVC/WebFlux 和 Spring Boot已经开始抛弃JSP从Spring 5开始,在原有的基于Servlet技能的Spring MVC之外增加了一个新的编程模型,便是Spring WebFlux。
Spring WebFlux是相应式非壅塞的,而且不支持Servlet API,以是也就不支持JSP!

上图左侧是Spring 5新引入的Spring WebFlux,右侧是大家熟习的Spring MVC,两者并列,Spring同时支持。

关于这一点,可以看Stack Overflow上面来自Spring Framework和Spring Boot团队成员Brian Clozel的回答:

Spring WebFlux - no JSP support?​stackoverflow.com

新的Spring WebFlux不支持JSP,那咱们不用就好了,至少Spring MVC还是支持JSP的啊。
那我们连续看。

如果我们连续利用Spring Boot+Spring MVC开拓,那么Spring Boot对JSP是有限定的,看官方文档怎么说的:

链接在这里:

Spring Boot Reference Guide​docs.spring.io

个中那行备注:

If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers.尽可能避免用JSP。
当利用嵌入式Servlet容器时,有一些已知的限定。

关于这些限定和如何连续在Spring Boot中利用JSP,可以自己查一下,知乎里就有好多文章

Spring Boot对JSP有限定,那咱们就凑合用呗,反正我是写Java的,我的发展方向是架构师,我正打算学习微做事,正在看Spring Cloud。
那咱们就连续看看Spring Cloud吧。

微做事架构下更没有JSP的用武之地首先要明白Spring Boot和Spring Cloud的关系。
可以先看我的这个回答:

Spring boot与Spring cloud 是什么关系?​www.zhihu.com

还是看这张图吧:

右侧绿色的部分都是Spring Cloud的组成部分,不管是API Gateway、Config Dashboard,Service Registry,还是多个MicroServices,他们都是Spring Boot运用!
或者说Spring Boot是全体Spring Cloud的基石(实在也是Spring Cloud Data Flow的基石)。

哦,你明白了,由于有Spring Boot对JSP的限定,而Spring Cloud的组成部分都是Spring Boot运用,以是Spring Cloud也对JSP有限定。
实在不仅仅是表面上这个缘故原由,咱们连续剖析。

如果强行连续在Spring Cloud环境中连续利用JSP,那么JSP放在哪里?有两种方案。

API Gateway和每个MicroService里面都有@Controller以及对应的JSP。
那么这种方案下,不同微做事中的JSP如何通信?用户访问的时候,同一个运用下的所有JSP页面会在不同IP和端口下来回变换。
一会是http://ip0:8081/xxx/xxx.jsp,一会是http://ip1:8082/xxx/xxx.jsp,点个连接又跳转到http://ip2:8080/xxx/xxx.jsp....把全体微做事运用下的所有@Controller和JSP都放在API Gateway里面,其他Microservice中只有供应REST API的@Controller和@Service。
这种方案并不算空想的微做事架构,由于Gateway没有解耦,里面的所有@Controller不能拆分支配。
这样就相称于在MicroService架构下有了一个局部的Monolithic(单体运用)。

那怎么才算是利用Spring Cloud的精确姿势?还是看上面那幅图,这次关注左侧三个灰色的部分。
IoT(物联网 Internet of Things)、Mobile(移动运用)、Browser(浏览器端),这三个也是运用啊。

我们再看一幅图:

全体Spring体系的图出来了。
还是看左侧,Your App,也便是IoT(物联网 Internet of Things)、Mobile(移动运用)、Browser(浏览器端)这三类!

Browser便是前后端分离之后的前端运用,独立开拓、独立支配、只和做事器端有HTTP RESTful通信。

我们看看Spring官方给出的Spring Cloud例子,链接在这里:

Spring Projects​spring.io

customers-stores-ui是前端运用,用Angularjs实现的。
例子是便于学习的,不应该引入额外的太多其他技能!
为什么Spring官方的例子非要用上前端技能?不能只用做事器端开拓职员熟习的模板引擎解(包括JSP)来演示Spring Cloud吗?

我们再看其余一个例子,Spring的Petclinic大家都熟习吧?Spring 官方例子:

spring-projects/spring-petclinic​github.com

官方的是Monolithic(单体)运用,模板用的是Thymeleaf,自己去看代码。

用Spring Cloud实现的版本:

Spring Petclinic community​github.com

前端有Angular和React两种实现,做事器端有Java和Kotlin两种实现,都没有用做事器端模板。

同样的问题。
为什么演示Spring Cloud的开拓,要引入额外的前端技能?

答案都是同样的,Spring Cloud就必须前后端分离开拓!
用JSP就无法完美拆分微做事,无法利用微做事本应带来的各种上风。

总结:

我曾经在知乎某一个问题下总结过:现在JSP处于被前后端夹击的状态,生存空间越来越小了。
就算你不打算管前端,只想在做事器端有所建树。
微做事的条件也必须前后端分离。

放弃JSP吧,让自己的路走的宽一些。
如果去世守JSP不放,做事器端只能勾留在SSH/SSM阶段,用Spring Boot+Spring MVC已经是你的天花板了。