【问题标题】:NullPointerException when add custom taglib in JSP在 JSP 中添加自定义标记库时出现 NullPointerException
【发布时间】:2015-04-02 12:12:57
【问题描述】:

我需要为 JSP 页面实现一些自定义功能,为此我需要创建自定义标记库。这应该是一个简单的操作,但是当我只添加空的 taglib 时,我在第一步遇到了问题。我有一个例外:

java.lang.NullPointerException
    at org.apache.tomcat.util.descriptor.tld.TldResourcePath.hashCode(TldResourcePath.java:156)
    at java.util.HashMap.hash(HashMap.java:338)
    at java.util.HashMap.get(HashMap.java:556)
    at org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:95)
    at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:179)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:411)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:469)
    at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1428)
    at org.apache.jasper.compiler.Parser.parse(Parser.java:139)
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
    ...

我的自定义 tld(放在 webapp/custom.tld 中):

<?xml version="1.0">
<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/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <tlib-version>1.0</tlib-version>
    <short-name>MyLibrary</short-name>
    <uri>myTagLib</uri>

</taglib>

JSP:

<%@ taglib prefix="myTag" uri="myTagLib" %>

另外,我尝试在 custom.tld 中添加一些功能,但没有任何更改。

有人可以帮助我吗?我做错了什么?

【问题讨论】:

  • TldResourcePath.156 中的 NullPointerException 指向 RldResourcePath 对象中缺少的 URL 对象。您的 URI 定义可能有问题。

标签: java jsp tomcat jsp-tags


【解决方案1】:

您需要将custom.tld 文件移动到/WEB-INF 目录中的某个位置,以便容器找到并将其映射到/&lt;taglib&gt;/&lt;uri&gt; 提供的值。

如果由于某种原因你不能,你应该在你的 web.xml 文件中添加一个&lt;taglib&gt; 映射。

<jsp-config>
  <taglib>
    <taglib-uri>myTagLib<taglib-uri>
    <taglib-location>/webportal/custom.tld<taglib-location>
  </taglib>
</jsp-config>

&lt;taglib-location&gt; 是相对于您的 Web 应用程序根目录指定的。如果需要,请修改。

【讨论】:

  • 我在我的问题中发现了一个小错误,我的 tld 放在 webapp/custom.tld 中(而不是 webportal)。但无论如何,当我在 WEB-INF 中替换它并更改 uri 时,它开始工作了!我确定我之前尝试过,但我想我没有做一些重要的事情(可能是我没有改变 uri ...)。所以,谢谢你的帮助!
  • 谢谢你这在 tomcat 8 中工作,因为 tomcat 8 需要在 jar 或 web.xml 中为自定义 tlds 输入名称
【解决方案2】:

我花了 4 个小时来解决这个问题。我已经从 Tomcat 6 切换到 Tomcat 8 并开始获得相同的 NPE。我最终发现问题在于导入我的 taglib

<%@ taglib uri="/includes/tt.tld" prefix="tt" %>

结果证明 Tomcat 8 Jasper 在使用相对路径的导入时失败。我把它改成

<%@ taglib uri="myTagLib" prefix="tt" %>

并在我的 web.xml 中定义 taglib 为

<jsp-config>
    <taglib>
        <taglib-uri>myTagLib</taglib-uri>
        <taglib-location>/includes/tt.tld</taglib-location>
    </taglib>
</jsp-config>

【讨论】:

  • 将 更改为 根据你所说的相对路径为我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2012-06-19
  • 1970-01-01
  • 2018-07-10
  • 2016-11-04
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多