java吧 关注:1,216,515贴子:12,664,127

[个人看法] JSP 的落日

只看楼主收藏回复

JSP 是 Java 大分支、Web 方向小分支中一种基于 Servlet 的模板式页面输出技术;早期,Web 服务器对应的客户端一般只是浏览器,而用户则是真正的肉人,JSP 早期根本目的是把服务器端数据套在模板中生成 HTML 输出给浏览器、由浏览器排版成类似图表的界面,直接给肉人看。
下文的“JSP 页”指用 JSP 技术编写的、常规以 .jsp 为后缀名的、看起来由 Java 代码和 HTML 混合而成的服务器端模板文件。
根据浏览器请求的查询范围不同、或者服务器本身的数据的变化,同样的 JSP 页每次输出的 HTML 界面上展示的数据都有可能不同,根据查询状况动态变化的。
在某个蛮荒年代,这种动态生成 HTML 界面的特性被滥用了,大量不太合格的编码人员、被进度催逼的编码人员、或者更早期摸索前行的前辈把本地文件读写、数据库读写、网络接口通讯、业务流程控制等和界面显示无直接关系的重量级复杂操作也写在 JSP 页中;在这个情况下还要求网页美观好看,还要有弹框、动画等发生在浏览器端、由 JavaScript 控制的特效,导致美工人员、JavaScript 编程人员和 JSP 编程人员需要共同参与;Java 代码、JavaScript 代码和 HTML 混乱交织的情况导致开发进展缓慢、人员矛盾激化等问题。
后来有人推出了 el 表达式和 jstl 等技术,试图用类似 HTML 的标签取代 Java 代码,以从视觉上取悦美工人员;但但些技术不能包办一切、或者包办一切时过于繁琐,有时仍然需要出动 Java 代码,导致同一个 JSP 页上同时出现 HTML 、JavaScript 、Java 、el 和 jstl 等多种语法和作用范围各不相同的语言混合交织;不说增加了维护和开发难度,但至少没有从根本上降低维护和开发难度。
真正解决这种矛盾的是 MVC 概念,落实到 Java Web 上,一次典型的请求过程如下:
1 . 浏览器的请求发给一个控制器程序 (C/Controller) ;大多数情况下控制器由 Servlet 充当,懒狗作死的情况下可能用 JSP + 自定义 Java 程序充当;大多数情况下控制器只管干活,不管对浏览器的输出。
2 . 控制器固定地调用一组 Java 程序、或者根据某种配置按请求的不同而动态地调用不同的 Java 程序,根据用户请求做文件读写、数据库读写、网络接口通讯、数据组合加工等一系列处理,产生结果;在不进一步细分的情况下,这些被调用的程序可以笼统地被看作内部服务层 (S/Service) 。
3 . 控制器固定地、或者按用户请求、或者根据处理结果中的某些要素跳转到某单个 JSP 页、或者嵌套的 JSP 页组合,这个、或者这些 JSP 页拿到处理结果,直接将数据套在模板中生成 HTML ,或者做一些轻量级的判断和循环、将特定的数据合理地套在模板的特定部位、生成合理的 HTML ;在这种体系中,JSP 不再做重量级操最,一切工作只围绕生成 HTML 界面进行,所以归为视图层 (V/View) 。
时代在发展,网页要呈现的内容越来越复杂,页面本身的数据量也越来越大,但有时用户的某个操作真正需要变更的只是页面上某个很小的区域、很少的内容,每次请求都都由服务器生成完整的 HTML 界面变得越来越没必要,对于只需要更新页面上特定区域的请求,JSP 也可以只生成 XML 或 JSON 内容,由浏览器在更早的请求中加载的 JavaScript 解析和对页面做变更;而一些新场景下,客户端和用户也不再是浏览器和肉人,而是上游业务系统,它们只需要服务器返回 XML 或 JSON 数据,完全不需要 HTML 和基于 HTML 的用户界面。
进一步发展之下,在针对浏览器和肉人的场合已经有了比 JSP 更好的模板技术和框架,也有了更新的 MVVM 概念;在不需要用户界面的场合,也有了用控制器或服务层直接输出 XML 和 JSON 的技术;JSP 的用武之地已经被大大压缩了,目前大概就剩这三个用途了:
1 . 在不想为了一点点事情大费周章地搞前后端彻底分离、搞大前端、也无须华丽界面的旧风格小规模站点上作为视图层把控制器或服务层生成的结果数据变成 HTML 、XML 和 JSON 内容,响应给客户端。
2 . 作为报错页为前序处理过程遗漏的异常或错误兜底。
3 . 懒狗作死不想在 web.xml 里配 Servlet 时直接用 JSP 把控制器拉起来。
基于剩下的这点用途,基本上只要知道堆“<%……%>”就行了,学习成本很低,能搞定控制器和服务层的人学 JSP 基本上也是“分分钟”的事;至于 el 、jstl ,都没必要再花时间去学了,毕竟都已经用 JSP 了,也就不指望现代前端人员和美工人员会加入这个任务了。


IP属地:湖北1楼2023-06-26 23:30回复
    很不巧,工作十年了,项目里还是jsp多。个人体会,用什么技术,取决于现有信息化系统的结构和新项目预算,客户不傻,100万能做的事不会花200万,何况软件的定位就是辅助工具,增加利润才是目的。模板技术不止jsp一种,没必要纠结哪一种,毕竟这是老板和架构师考虑的内容。


    IP属地:四川来自Android客户端2楼2023-06-28 11:38
    收起回复
      我们单位也是jsp


      IP属地:辽宁来自Android客户端3楼2023-06-28 15:07
      回复
        现在的前端用nextjs又开始用服务端渲染了


        IP属地:浙江来自iPhone客户端4楼2023-06-28 16:38
        回复
          符合需求的就是最好的 什么都要最后的下场就是什么都没有 啥也不是


          IP属地:湖北来自Android客户端5楼2023-06-28 16:42
          回复
            jsp下面没有什么模版框架吗?PHP可是好多。


            IP属地:辽宁来自iPhone客户端6楼2023-06-28 17:00
            回复
              这东西不都被淘汰了吗


              IP属地:江苏7楼2023-06-28 17:09
              收起回复
                老项目还是jsp


                IP属地:广东来自Android客户端9楼2023-06-28 18:43
                回复
                  jsp忘完了且早不用了,但你自己看看你举的jsp的例子,都是些前端问题和非技术问题,其本质是一种服务端渲染模板,别把所有问题怪到它头上,指望它变成一个银弹解决所有问题?需要服务端渲染时如果团队技术栈老旧,不还得用jsp?自有历史因素在这。


                  IP属地:贵州来自Android客户端10楼2023-06-28 20:07
                  回复
                    很正常啊,能盈利就不要动,国外有案列啊


                    IP属地:云南来自Android客户端11楼2023-06-28 20:55
                    回复
                      springboot之类不是Java?


                      IP属地:湖南来自Android客户端13楼2023-06-28 21:10
                      回复
                        有用过vm文件的吗?


                        IP属地:广东来自Android客户端14楼2023-06-28 22:05
                        收起回复
                          为什么我们的jsp就是单纯的页面,里面几乎没有java代码和什么表达式,就是前端框架js css什么,jsp页面里面也可以发异步请求啊,好像也没那么不堪吧


                          IP属地:上海来自iPhone客户端15楼2023-06-28 23:48
                          收起回复
                            菜鸟有个问题,html里面通过js或jquery发异步请求,不是能拿动态数据吗,为什么说html不能拿动态数据,为什么要通过嵌套java代码的方式来拿数据


                            IP属地:上海来自iPhone客户端16楼2023-06-29 00:01
                            收起回复