对于语言之间优势的问题,可以写几本书来阐述。我试着简单地说点什么。可能不正确,也可能不完整,仅供参考。随着互联网的兴起,静态页面已经不能满足复杂的交互需求。动态技术已经出现。在史前时代,动态Web开发大多是使用CGI技术实现的。CGI将脚本作为单独的进程运行,每个请求都使用环境变量、标准输入和标准输出与其“通信”。这是一种相互低效的运行方式。isapi和ASP等技术已经出现(ASP1.0于1996年12月发布,作为IIS3.0的一部分)。它更方便,具有会话管理和内置对象。但是也有明显的缺点,代码和页面混在一起。接下来提出Servlet标准,参考实现是Tomcat。Tomcat是Servlet规范的开源参考实现。最初由Sun于1998年11月发布,核心人物是JamesDuncanDavidson。Tomcat3.0合并了Sun捐赠的JavaWebServer代码。该版本实现了Servlet2.2和JSP1.1规范。它目前由Apache软件基金会维护。它是一种开放标准,在当时引发了一些开发热潮,产生了大量的中间件,也就是应用服务器,如WebSphere、WebLogic、GlassFish、JBoss、Jetty、Resin、金蝶的Apusic。其中一些完全实现了J2EE标准。比如WebLogic:标准具体包括Servlet、JSP、EJB、JDBC、JavaMessageService、JTA、XML相关、JAAS等,有些只是实现的一小部分,比如Tomcat:只有Servlet、JSP、JavaEL,JNDI等。对于企业开发来说,这样的标准有很多好处,它解决了很多需要反复解决的问题,比如消息队列,分布式事务等,应用程序只需要根据接口进行开发,而实现由应用服务器完成。因为复杂、重,适合中层以上团队开发。Tomcat/Servlet系统之所以这样设计,是基于几个方面的考虑:方便扩展,遵循标准化定义,保持版本间的兼容性。与nodejs社区的快速发展相比,Java显得沉重而缓慢。但这不是坏事。对于开发者来说,这是一项非常好的长期投资。确保工作经验的积累是有效的,而不是忽视业务追求技术来适应铺天盖地的新版本。从Python2到Python3的过渡是间歇性的。Java最早的代码在今天的虚拟机上仍然可以运行。Node.js版本之间也有很多问题,但是因为是脚本,不是编译。出错的时候不会告诉你是版本的问题,而是报各种奇怪的异常。当然,这是题外话。Tomcat的内部架构Tomcat有一个非常好的结构定义。核心部分是:Catalina——实现ServletAPICoyote——HTTP协议栈Jasper——JSP动态编译器和加载器,负责编译JSP页面可见,以上所有的核心都是Servlet规范。Tomcat作为互联网的基础设施,走过了20年,没有发生本质的变化,足见当初设计的高瞻远瞩。估计只有网口的设计才能与之相提并论。HTTPTCP/IP的设计,USB接口的设计。Tomcat的配置项与代码隔离。我个人认为这是Tomcat最精致的设计。您可以在不更改代码的情况下配置Tomcat的所有方面。为了实现多协议和多特性的支持,相对于Python和Nodejs的WebServer,它遵循HTTP/1.0和HTTP/1.1协议,但是用Java编写的Web应用支持更高级的Servlet接口和可以运行在不同的应用服务器上,无需调整代码。Python和Nodejs都有很多WebServer的实现,但是这些Server之间显然没有更高层次的抽象。如果需要切换,需要做大量的改动和测试。假设你在服务器A上做开发,突然发现服务器B有你想要的功能,你只需要进行大的改动。Python下的Web服务器,核心标准WSGIPython也有很多WebServer软件,比如CherryPyWSGIServer、Gunicorn、Tornado、TwistedWeb、uWSGI、WaitressWSGIServer等,该服务器支持[WSGI]2规范。需要指出的是,WSGIv1.0.1出现于2010年9月26日,比Java对应的规范晚了十几年。出来的时候已经是领导者混战,已经很难统一,这也让WSGI成为一个相对简单易实现的规范来吸引服务器开发者。之前是CGI、FastCGI、mod_python三分天下的局面。Node.jsWebserver下:light-server、live-server、lite-server、http-server基本都是轻量级的静态文件服务器主要概括名称JavaPythonNode.js典型WebServerTomcatTornadohttp-serverStandardServletWSGI无服务器端模板JSP,Freemarkertornado.templateCoffeKup,Swig,Jade典型Web框架SpringMVCFlask,DjangoExpress数据库相关JDBC,HibernateSQLAlchemyMoogoose多线程和分布式很容易搞不清楚Ajax在某些场景下作为一种数据格式是很有吸引力的。Python还有很多算法库,可以直接用于数据分析和人工智能。Java的优点是包罗万象。优秀的元器件处处可见。但开发起来比较复杂,更适合有一定规模的团队采用。
