有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在JSP中添加自定义标记库时出现java NullPointerException

我需要为JSP页面实现一些自定义函数,为此我需要创建自定义taglib。这应该是一个简单的操作,但我在第一步添加空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,但没有任何变化

有人能帮我吗?我做错了什么


共 (2) 个答案

  1. # 1 楼答案

    您需要将custom.tld文件移动到/WEB-INF目录中的某个位置,容器才能找到并将其映射到/<taglib>/<uri>提供的值

    如果由于某种原因不能,你应该在你的网站上添加一个<taglib>映射。xml文件

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

    <taglib-location>是相对于web应用程序根指定的。如果需要,请进行修改

  2. # 2 楼答案

    我花了4个小时来修好这个。我已经从Tomcat 6切换到Tomcat 8,并开始获得相同的NPE。最后我发现问题出在导入taglib上

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

    事实证明,Tomcat 8 Jasper在具有相对路径的导入上失败。我把它改成了

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

    并在myweb.xml中将taglib定义为

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