1.前言
近期接触到公司一个jsp项目,用到了jstl1.2,着实踩了一把坑,在这简单记录一下排雷经过。
2.jstl使用
2.1 简介
jstl是jsp标准标签库,支持SQL、XML标签,需要安装,与web.xml的设置有关系,不同版本安装不一样。可参见:stackoverflow关于jstl的介绍。
jstl1.2 比之前版本的安装简化了很多,有关资料:jstl的maven依赖,jstl教程,standard jar包下载。
2.2 环境
本机环境是:Mac,Idea,Tomcat 8.5.54,Maven 3.6.3,JDK8,jstl1.2
pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
jsp中taglib使用如下
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2.3 问题
如果你看过上文2.1 简介
中提供的资料,那么关于jstl是怎么回事、各版本之间的差异,想必你已经心中有数了。下面介绍我碰到的问题。
我拿到的是公司线上运营的项目,帮忙改bug,代码肯定是没有问题的,项目中关于jstl的配置在上文2.2 环境
中已经介绍到了,但当我在Idea中配置好Tomcat,尝试启动项目时,得到错误信息如下:
- 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core];
- java.lang.ClassNotFoundException: org.apache.jsp.views.login_jsp;
2.4 错误排查
在网上各种百度,基本上都是说jstl的jar包在Tomcat编译时没用用到。
通过「jstl教程」的介绍,可知,jstl各版本在安装时是不一样的,所以得按照自己的情况进行排查。
- 首先,确认项目中使用的jstl的配置没有问题,我这里使用的是jstl1.2,只需要添加依赖即可;
- 根据你使用的项目构建工具,添加依赖到对应文件,我这里使用的是maven,添加依赖到pom.xml
- 检查jsp中taglib
- web.xml ,version的版本与jstl要对应
温馨提示,若使用jstl1.2之前版本,需要下载对应jstl版本的standard的压缩包,解压后将 jstl.jar 与 standard.jar 添加到项目 WEB-INF/lib下,启动项目即可
-
其次,file -> project struct -> artifacts -> output layout ,在 WEB-INF/lib 下看看有没有你使用的jstl的jar包,如果没有说明Tomcat在编译时没有把jar包加载进来,那么需要手动添加。
上述检查都没有问题,而且因为我这个项目是公司线上项目,不存在是代码问题,只可能是环境问题。再三检查自己机器上的Tomcat、maven配置等,都没有问题。最后跟其他可以成功运行该项目的同事对比了本机使用环境的区别,发现是Tomcat版本的问题,切换成Tomcat 8.5.50即可正常启动,原因未知。Tomcat版本相差无几,这个结果也是我万万没有想到的!