SpringBoot不推荐使用jsp
更新日期:
关于Springboot不推荐使用Jsp的讨论
springboot不推荐使用jsp,如果使用了jsp会失去一些springboot的特性,这是为什么呢?jsp和其他模板引擎FreeMarker,thymeleaf有什么区别呢?
回答1
原因简单,就因为它叫 JSP (Java Server Page)
Java社区的领导者JCP 制定JSP规则就是专门为了给 JavaServer 用的, 所以 JSP 的定义里就指定了它是运行在容器里的.
里面最最重要的就是第一条.
(使用jsp的项目 部署时) 把war包放到 tomcat或者其他 java 容器;或者用 java -jar 启一个可执行的 war包 时 是可以正常工作的, 但 直接执行 jar包是不支持的。
也就是说打包方式不一样同样的代码运行结果就是不一样:
“java -jar app.jar” 不可以解析jsp
“java -jar app.war” 正常解析
剩余几个限制也多少都是因为jsp的规范/法律层面上的原因联锁引起的,或者导致开发者修复/额外考虑的兴致不大。
至于从技术层面的开发使用上 用 JSP当模板 和 用其他模板引擎支持的文件没有任何本质的区别。
差别仅存在于开发书写效率和程序解析运行效率。
比如 jsp 和 freemarker 的解析执行效率都是很高的,
而thymeleaf的书写效率高并且与前端模板语法很相似,学习成本很低。
回答2
springboot 是内嵌web容器的,推荐打成jar包不是war包
你如果想使用jsp也可以啊,自建WEB-INF web.xml 然后像往常一样使用jsp
打成war包使用外部容器即可,这就相当于失去了一些springboot的特性了
至于模板引擎其实都差不多,jsp也可以算是模板引擎,springboot推荐的thymeleaf主要嵌入到html的标签属性,这样对前端很友好,有一些优点,但和jsp,FreeMarker比起来也没什么绝对性的优势。
现在web前端技术飞一样的发展,前后端分离才是主流,模板引擎说白了还是给后端人员用的东西,早就不符合现代的前端思想了,而且和React、Vue这类的前端框架比起来又是连提鞋都不配,所以放弃这些模板引擎改用RestController吧。
springboot官方说明jsp限制
官方:
28.4.5 JSP Limitations
When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations in the JSP support.
- With Jetty and Tomcat, it should work if you use war packaging. An executable war will work when launched with
java -jar
, and will also be deployable to any standard container. JSPs are not supported when using an executable jar. - Undertow does not support JSPs.
- Creating a custom
error.jsp
page does not override the default view for error handling. Custom error pages should be used instead.
There is a JSP sample so that you can see how to set things up.
翻译:28.4.5 JSP的局限性
在运行使用嵌入式servlet容器(并打包为可执行归档文件)的Spring引导应用程序时,JSP支持存在一些限制。
对于Jetty和Tomcat,如果使用war打包,它应该可以工作。一个可执行的war在使用java -jar启动时可以工作,并且也可以部署到任何标准容器中。使用可执行jar时不支持jsp。
Undertow不支持jsp。
创建自定义error.jsp页面不会覆盖用于错误处理的默认视图。应该使用自定义错误页面。
这里有一个JSP示例,以便您了解如何进行设置。