jstl 使用踩坑

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;
运行效果截图

idea错误信息截图

2.4 错误排查

在网上各种百度,基本上都是说jstl的jar包在Tomcat编译时没用用到。
通过「jstl教程」的介绍,可知,jstl各版本在安装时是不一样的,所以得按照自己的情况进行排查。

  1. 首先,确认项目中使用的jstl的配置没有问题,我这里使用的是jstl1.2,只需要添加依赖即可;
    • 根据你使用的项目构建工具,添加依赖到对应文件,我这里使用的是maven,添加依赖到pom.xml
    • 检查jsp中taglib
    • web.xml ,version的版本与jstl要对应

温馨提示,若使用jstl1.2之前版本,需要下载对应jstl版本的standard的压缩包,解压后将 jstl.jar 与 standard.jar 添加到项目 WEB-INF/lib下,启动项目即可

  1. 其次,file -> project struct -> artifacts -> output layout ,在 WEB-INF/lib 下看看有没有你使用的jstl的jar包,如果没有说明Tomcat在编译时没有把jar包加载进来,那么需要手动添加。


    image.png
  2. 上述检查都没有问题,而且因为我这个项目是公司线上项目,不存在是代码问题,只可能是环境问题。再三检查自己机器上的Tomcat、maven配置等,都没有问题。最后跟其他可以成功运行该项目的同事对比了本机使用环境的区别,发现是Tomcat版本的问题,切换成Tomcat 8.5.50即可正常启动,原因未知。Tomcat版本相差无几,这个结果也是我万万没有想到的!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。