对于SpringBoot是否支持JSP简单理解的知识总结

1. SpirngBoot并不是不支持JSP,而是在某些情况下不支持JSP,对于JSP有一些限制。在其官网上写明了使用JSP的限制有4点

如果在SpringBoot中使用JSP作为渲染引擎,方法有2种。第一种,引入Jasper包,并且需要构建一种传统的web结构,最终以war包的形式发布。运行的时候,以 java -jar xxx.war的方式运行。第二种,引入Jasper包,并且把web文件夹映射到发布后jar包的META-INF/resources,运行的时候,以java -jar xxx.jar的方式运行。

在maven-release-plugin插件对项目进行打包的时候,会调用spring-boot-maven-plugin插件,而这个插件,会根据pom.xml文件中<packaging>pom</packaging>设置,根据jar与war不同,进行不同方式的打包,相应的包中的META-INF/MANIFEST.MF有所不同,SpringBoot classloader也会用相应的调整。这样使得java -jar的方式,既能运行war包,也能运行jar包。

2. Thymleaf, Freemarker与JSP相比,是JSP的性能最好。因为JSP在运行的时候,是先编译成class字节码文件,然后直接调用字节码文件输出,而Thymleaf等都是读取HTML页面然后分析,速度明显会低很多。 Jasper是用来编译jsp文件的,在运行的时候,classloader是直接读取文本编译成的字节码,然后加载的内存。SpringBoot中内嵌的tomcat,在启动的时候,会在System.getProperty("java.io.tmpdir") 临时目录中生成一个文件夹,然后在第一次接到对于某个jsp页面的请求的时候,会编译这个jsp文件,然后把字节码文件放到临时目录中。当第二次请求这个jsp页面的时候,就会直接执行编译好的jsp文件。

我本机中的临时目录中的相关文件夹

 

 

在Docker环境中,临时目录中的相关文件夹如下

在Docker环境中,如果没有外挂磁盘的话,一般来讲分配给临时目录的空间都很小,如果这个临时目录满了,就可能出问题,所以这也是为什么在Docker环境中不要使用JSP.

3. 在SpringBoot的MVC中,是如何选择渲染引擎的?它有一个ViewResovler的list,这个list中有先后顺序。那么它又是如何把相应的引擎放到这个list中的呢?以Thymleaf为例。在web项目的pom.xml文件夹中需要引入spring-boot-starter-thymeleaf包。我们来一起看一看这里面的逻辑。

spring-boot-starter-thymeleaf这个jar包不包含任何的class文件,它包含的pom.xml文件内容如下

所以可以看出来,spring-boot-starter-thymeleaf它的作用就是引入相关的其他jar包。

Thymeleaf-layout-dialect包最终引入了最重要的包-thymeleaf.jar.

在启动的时候,auto-config中,SpringBoot会把这个ThymeleaftViewResolver放到Spirng容器中。在Spring启动阶段,在DispatchServlet初始化的时候,会调用initViewResolvers方法,遍历所有的bean,如果是实现了ViewResolver接口,则放到ViewResolver的list中。

 

这种方式下,就能够按照classpath中有没有引入相关的jar包,来判定是否要使用某个渲染引擎了。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值