我们上文说到直接在bootstrap里面启动tomcat的main函数会报jsp无法解析的错误,有兴趣的小伙伴可以把ROOT目录下的index.jsp 换成index.html,这样访问是可以的,今天我们就来聊一聊这个jsp解析器

以前的启动方法

tomcat官网从来没有推荐过用bootstrap的main函数启动,而是用的bin目录下的startup.sh来启动,我们在第一篇文章寻找main函数也是从startup.sh来入手的,那main函数启动和startup.sh启动有什么区别呢

先附图一张: 用bootstrap启动之后的报错信息

图说tomcat(四):加载jsp解析器

在这个错误中,我们可以看到一个关键信息: NullPointerException 报了一个空指针异常,我们很容易就可以猜到应该是缺少了什么配置,但是我们用在源码根目录执行 ant deploy即打包tomcat之后的bin目录去启动的时候又是可以正常解析jsp的,那我们就来看看这个ant deploy做了哪些事情

ant deploy

我们在源码根目录找到build.xml打开,找到其中target=deploy

图说tomcat(四):加载jsp解析器

如上图所示,可以看到在执行deploy前会先执行package,build-docs,build-tomcat-jdbc,compile-webapp-examples,通过名字,我们可以大致猜出来,执行了打包,构建文档,构建jdbc,编译web示例。因此最有可能的差别就在于package这一步了,我们跟着找到 target name = "package"

图说tomcat(四):加载jsp解析器

会发现,这个target的作用就是打jar包,而且我们通过对比已引入的jar包,可以看到,还缺了一个jsp的jar包,那我们在项目的Libbraries中把jasper这个依赖给加上再启动,就能看到我们熟悉的tomcat界面啦,如下图所示:

图说tomcat(四):加载jsp解析器

直接改代码

我们并没有改源码,只是加了jar包就可以运行,而且这个jar包还是从源码中打的包,那么我们猜测,肯定是这个jar包里面写了static方法进行了初始化,顺着这个思路,我们找到了org.apache.jasper.servlet.JasperInitializer这个类,仿照jdbc的写法,我们用Class.forName在tomcat load结束的时候加上这段代码,如下图所示:

图说tomcat(四):加载jsp解析器

这样也可以启动之后访问localhost:8080得到我们常看到的页面

总结

排错能力是编程能力的很大一部分,而且在工作中,大多数时间都在改bug , 找问题,这就需要我们从报错信息一步步的进行分析,并编码验证,最终并解决问题!在开始遇到这个问题的时候,我就直接复制去百度,去谷歌,但收效甚微,因为大家的环境什么的都不一样,然后关于tomcat导入idea中,以及源码运行其实就那几篇博客,其他的都是复制的,还是要多靠自己去分析。

相关文章:

  • 2021-12-05
  • 2022-12-23
  • 2022-12-23
  • 2021-05-19
  • 2022-12-23
猜你喜欢
  • 2021-07-27
  • 2021-05-20
  • 2021-06-03
  • 2022-12-23
  • 2021-05-22
  • 2021-08-30
  • 2022-02-11
相关资源
相似解决方案