jstl 无法自动加载c.tld文件

使用JSTL标签出现问题

HTTP状态 500 - 内部服务器错误
类型 异常报告

消息 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jstl/core]

描述 服务器遇到一个意外的情况,阻止它完成请求。

例外情况

org.apache.jasper.JasperException: 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jstl/core]
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:54)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:294)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:81)
	org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:251)
	org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:122)
	org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:435)
	org.apache.jasper.compiler.Parser.parseDirective(Parser.java:493)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1450)
	org.apache.jasper.compiler.Parser.parse(Parser.java:144)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:105)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:206)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:391)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:367)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:351)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:605)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	com.controller.ChoiceServlet.service(ChoiceServlet.java:64)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
):注意 主要问题的全部 stack 信息可以在 server logs 里查看

Apache Tomcat/9.0.56

jstl 无法自动加载c.tld文件

阅读了以下资料,引用于博客园凝荷的文章

JSTL配置:

主要牵涉到两个jar包

standward.jar和jstl.jar包 (两个包1.0和1.2版本的下载以及TLD下载路径如下:下载路径)

加载方式包括两种

1,非自动加载

a,将tld文件copy到WEB-INFO下的tld目录下,没有就创建之

b,修改web.xml文件配置,添加配置如下

 <jsp-config>
   <taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
   </taglib>
   <taglib>
    <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
    <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
   </taglib>
   <taglib>
    <taglib-uri>http://java.sun.com/jstl/fn</taglib-uri>
    <taglib-location>/WEB-INF/tld/fn.tld</taglib-location>
   </taglib>
  </jsp-config>

复制代码
  c,jsp中引用taglib

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

2,自动加载

Servlet2.4规范提供了对tld文件的自动加载,tld文件在standard.jar的META-INF文件夹中。

如:c.tld文件提供了对核心jstl标签的描述

<taglib 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-jsptaglibrary_2_0.xsd"
    version="2.0">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>c</short-name>
  <uri>http://java.sun.com/jsp/jstl/core</uri>

可以看到其引用的uri为http://java.sun.com/jsp/jstl/core

则在jsp中引用taglib为:

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

三,JSTL核心标签库的使用

JSTL 核心标签库标签共有13个,功能上分为4类:

1.表达式控制标签:out、set、remove、catch

2.流程控制标签:if、choose、when、otherwise

3.循环标签:forEach、forTokens

4.URL操作标签:import、url、redirect

使用标签时,一定要在jsp文件头加入以下代码:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

============================================================================

我的情况:

使用maven导入以下包

jstl 无法自动加载c.tld文件

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>



    <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>


  </dependencies>

JSP也使用了taglib自动加载c.tld文件

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

鼠标放到标签上也能自动识别jar包
CTRL+鼠标左键会自动跳转到jar包WEB-INF的c.tld文件中
jstl 无法自动加载c.tld文件

但是运行就是出错

查看自己的代码没有发现任何问题,并且根据另一篇文章所说方法修改

手动将
jstl 无法自动加载c.tld文件
c.tld文件复制到webapp的WEB-INF目录下
jstl 无法自动加载c.tld文件

此时可以正常运行

疑惑这个问题产生的原因,应该是自动加载到c.tld文件的却找不到c.tld文件,不知道是maven的问题还是IDEA的问题,不知道有没有更好的办法让程序自动找到正确的c.tld文件。

上一篇:java获取jar包执行路径


下一篇:C语言 define 定义函数(多行书写) - C语言零基础入门教程