当前位置: 首页 > 科技观察

真的,Java的JSP已经死了吗?

时间:2023-03-21 11:46:41 科技观察

之前的项目大多是当爹当妈的java程序员,从事前端(ajax/jquery/js/html/css等),后端(java/mysql/Oracle等).)。随着时代的发展,渐渐的很多大中小公司开始把前后端的界限划分的越来越清晰。前端工程师只管前端的事,后端工程师只管后端的事。好吧,那他终究什么都不擅长。大中型公司需要专业人才,小公司需要多面手,但是为了个人的职业发展,我建议分开。如果这辈子只吃java,就别去研究css,js之类的了。把精力集中在java、jvm原理、spring原理、mysql锁、事务、多线程、大并发、分布式架构、微服务以及相关项目管理等方面,这样你的核心竞争力就会越来越强。你越高,正所谓你为生活付出了什么,生活就会回报你。满满的正能量:一旦你成为一个行业的精英,相信我,那个时候,车子、房子、女人、钱、机会都会来找你,不用担心,真的。成为一名java程序员真的很简单。你拥有的知识越多,你赚的钱就越多。当然,你需要有一定的情商。..你的能力越强,你创造的价值就比别人多,你为公司创造价值,公司给你各种福利,双赢!)曾几何时,我们的javaweb项目用了几个后台框架,springmvc/struts+spring+springjdbc/hibernate/mybatis等大多数项目在java后端分为三层,控制层(controller/action),业务层(service/manage),持久层(dao)。控制层负责接收参数,调用相关业务层,封装数据,路由到jsp页面。然后在jsp页面使用各种标签(jstl/el)或者手写java(<%=%>)来显示后台数据。正确的?我们先来看这种情况。需求确定了,代码写好了,测试完了,然后呢?它会被释放吗?你需要用maven或者eclipse等工具把你的代码打包成一个war包,然后把这个war包发布到你生产环境的web容器(tomcat/jboss/weblogic/websphere/jetty/resin),对吧?发布后,您需要启动您的Web容器并开始提供服务。这时候你通过配置域名、dns等,就可以访问你的网站了(假设你是一个网站)。那我们看看,你的前后端代码都在那个war包里吗?包括你的js,css,图片,还有各种第三方库是吧?OK,在下面的浏览器中输入你的网站域名(www.xxx.com),之后发生了什么?(这道题也是很多公司的面试题。)我捡起来说了算。底子不好的童鞋请自行搜索。浏览器正在通过ip路由到您的服务。tcp3握手后,它开始通过tcp协议访问你的web服务器。你的web服务器收到请求后,开始提供服务,接收请求,然后通过response返回给浏览器你的response。那么大家看看,假设你首页有100张图片,单表查询。这时候用户的http请求好像是一次性的,其实不是一次性的。当用户第一次访问时,浏览器中不会有缓存。你的100张图片,浏览器会接连发出100个http请求(有人会跟我说http长链和短链的问题,这里不讨论),你的web服务器接收到这些请求。都需要消耗内存来创建socket来玩tcp传输。重要的一点来了。这种情况下你的web服务器的压力会很大,因为页面中的所有请求都只向你的服务器请求。一个人还好,如果10000人并发访问(先不说)web服务器集群,这里是单实例web服务器),你的服务器能hold住多少个tcp连接?你的服务器有多少内存?你能抵抗多少IO?您为网络服务器分配了多少内存?会停机吗?这就是为什么,越是大中型的Web应用,越是需要解耦。理论上,你可以把你的数据库+应用服务+消息队列+缓存+用户上传文件+日志+等放在一台主机上,但这就像把所有的鸡蛋都放在一个篮子里,存在隐患。很大。一个正常的分布式架构一定要拆,你的应用服务器集群(前后台)+文件服务器集群+数据库服务器集群+消息队列集群+缓存集群等等,前戏太长了。下面进入MVC下的正题。首先,我们以后的javaweb项目尽量避免使用jsp,前后端解耦,玩分布式架构,这样我们的应用架构才会更强大。使用jsp的痛点:动态资源和静态资源全部耦合在一起,无法实现真正??的动静分离。服务器压力很大,因为服务器会收到各种http请求,比如http请求css、js、图片、动态代码等等。一旦服务器出现问题,前后端一起玩,用户体验极差。前端工程师完成html后,java工程师需要将html修改成jsp页面,错误率高(因为页面中经常有很多js代码),需要双方配合修改问题的时候去开发,效率低下。jsp必须运行在支持java的web服务器上(比如tomcat等),不能使用nginx等(据说nginx的单实例http并发可达5w,这个优势要用),并且性能无法提高。第一次请求jsp必须在web服务器编译成servlet,第一次运行会比较慢。每次请求jsp都是通过访问servlet然后使用输出流来访问html页面,效率不如直接使用html。jsp中有很多标签和表达式,前端工程师在修改页面时会捉襟见肘,遇到很多痛点。如果jsp内容很多,页面响应会很慢,因为是同步加载的。基于以上的一些痛点,我们应该将整个项目的开发重心前移,实现前后端真正的解耦!老办法是:客户端请求服务端的servlet或者controller接收请求(路由规则由后端制定,整个项目开发的权重大部分在后端)调用service,dao代码来完成业务逻辑并返回jspjsp显示一些动态代码新的方式是:浏览器直接向html页面发送请求(路由规则由前端制定,整个项目开发权重前移)html页面负责调用服务端接口生成数据(通过ajax等方式)填充html展示动态效果。(有兴趣的童鞋可以访问阿里巴巴等大型网站,然后按F12监控一下你怎么刷新一次页面,他的http是怎么工作的,大部分都是单独请求后台数据,用json传输数据,而不是一大堆完整的http请求返回整个页面包括动态+静态)这样做的好处是:可以实现真正的前后端解耦,前端服务器使用nginx。前端服务器放css、js、图片等一系列静态资源,控制页面的引用、跳转、调用后端接口。后端服务器使用tomcat。(这里需要用到nodejs、react、router、react、redux、webpack等一些前端工程框架)发现bug可以快速定位问题,不会出现踢皮球的现象。页面逻辑、跳转错误、浏览器兼容性问题、脚本错误、页面样式等问题都由前端工程师负责。接口数据错误、数据未提交成功、响应超时等问题均由后端工程师解决。双方互不干涉,前后端是恩爱一家。在大并发的情况下,我可以同时横向扩展前后端服务器。比如淘宝首页,需要2000台前端服务器集群,才能抵挡日均上亿+的PV。(去了阿里的技术峰会,听说他们的web容器都是自己写的,就算单实例能抗10万http并发,2000台就是2亿http并发,而且还可以按照预测的峰值无限扩展。吓死人了,就一个首页。。。)为了降低后端服务器的并发压力,除了接口之外的其他所有http请求都转到了前端nginx。即使后台服务暂时超时或宕机,也能正常访问前台页面,但无法刷新数据。或许你还需要有微信相关的轻应用,让你的接口完全共享。如果你也有app相关的服务,只要重构一些代码,也可以复用大量的接口来提高效率。页面显示再多的东西也不怕,因为是异步加载的。注意:召开需求会议时,前后端工程师必须全部参加,需要制定接口文档。后端工程师必须编写测试用例。不要让前端工程师充当您团队的专职测试人员。推荐使用chrome插件postman。服务层的测试用例是用junit写的。上面的接口不是java中的接口。说白了,调用接口就是调用你控制器中的方法。它增加了前端团队的工作量,减少了后端团队的工作量,提高了性能和可扩展性。我们需要一些前端框架来解决页面嵌套、分页、页面跳转控制等功能。(上面提到的那些前端框架)。如果你的项目比较小,或者是纯内网项目,那你大可放心,不需要任何架构,但是如果你的项目是外网项目,嘿嘿嘿。以前有人用velocity/freemarker等模板框架生成静态页面,现在这种做法也被淘汰了。最后:本文的主要目的是说jsp在大型外网javaweb项目中被淘汰,但并不是说jsp完全不能学。对于一些同学朋友来说,jsp/servlet等相关的javaweb基础还是需要学习掌握的,不然你以为SpringMVC框架是基于什么的?