【问题标题】:Java custom tag don't work / problem with usageJava 自定义标签不起作用/使用问题
【发布时间】:2020-04-14 23:30:52
【问题描述】:

JSP 中的自定义标签有很大的问题。我在 WEB-INF/tlds 中创建了一个名为“decorate”的标签库描述符文件。我将前缀设置为“d”。然后我创建了名为“decorateHandler”的标记处理程序类。

我想用简单的方式装饰我的 JSP 标题页中的文本,但我得到一个错误...

我的 decorate.tld 文件:

<tlib-version>1.0</tlib-version>
  <short-name>l</short-name>
  <uri>/WEB-INF/tlds/decorate</uri>
  <tag>
    <name>decorate</name>
    <tag-class>decorateHandler</tag-class>
    <body-content>JSP</body-content> 
    <attribute>
        <name>value</name>
    </attribute>
  </tag>
</taglib>

在 decorateHandler.java 我尝试这样做:

private String value;

    private void writeTagBodyContent(JspWriter out, BodyContent bodyContent) throws IOException {

        out.println("<font color='"+value+"'>");
        bodyContent.writeOut(out);
        out.println("</font>");

        bodyContent.clearBody();
    }

当然,我已经为 String 值变量创建了 getter 和 setter。

在 index.jsp 中,我已经像这样包含了 taglib:

<%@taglib uri="/WEB-INF/tlds/decorate.tld" prefix="d" %>

我尝试过这样的事情:

 <d:decorate value="red">Lorem ipsum</d:decorate>

但我有一个例外:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: [112] in the jsp file: [/index.jsp]
decorateHandler cannot be resolved to a type
109:                         <li class="nav-item">
110:                             <a class="nav-link" href="index.jsp">
111:                                 <img src="logo.png" height="20px" width="20px">
112:                                 <d:decorate value="red">Lorem ipsum</d:decorate>
113:                             </a>
114:                         </li>
115:                     </ul>      


An error occurred at line: [112] in the jsp file: [/index.jsp]
decorateHandler cannot be resolved to a type
109:                         <li class="nav-item">
110:                             <a class="nav-link" href="index.jsp">
111:                                 <img src="logo.png" height="20px" width="20px">
112:                                 <d:decorate value="red">Lorem ipsum</d:decorate>
113:                             </a>
114:                         </li>
115:                     </ul>      


An error occurred at line: [112] in the jsp file: [/index.jsp]
The method get(Class<? extends Tag>) in the type TagHandlerPool is not applicable for the arguments (Class<decorateHandler>)
109:                         <li class="nav-item">
110:                             <a class="nav-link" href="index.jsp">
111:                                 <img src="logo.png" height="20px" width="20px">
112:                                 <d:decorate value="red">Lorem ipsum</d:decorate>
113:                             </a>
114:                         </li>
115:                     </ul>      


An error occurred at line: [112] in the jsp file: [/index.jsp]
decorateHandler cannot be resolved to a type
109:                         <li class="nav-item">
110:                             <a class="nav-link" href="index.jsp">
111:                                 <img src="logo.png" height="20px" width="20px">
112:                                 <d:decorate value="red">Lorem ipsum</d:decorate>
113:                             </a>
114:                         </li>
115:                     </ul>      


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:212)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:549)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:350)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    Filtr2.doFilter(Filtr2.java:67)

我不知道是什么问题...:/

【问题讨论】:

    标签: java jsp


    【解决方案1】:

    首先,我认为您应该检查您的 Web 容器(例如 Tomcat、Glassfish?)的日志。该错误的堆栈跟踪将在那里可用,并提示您实际原因是什么。无论如何,乍一看,很明显错误是由自定义装饰器标签库引起的,它似乎在最后做了一个bodyContent.clearBody()。我认为这里不允许这样做,也许您打算改为使用bodyContent.flush()

    Here 一个关于如何创建自定义 jsp 标签的教程。

    【讨论】:

    • 伙计,感谢您的回答,但将其更改为 bodyContent.flush() 什么也没做。我正在尝试将它标记用于我的 IT 项目,但即使我使用教程它也不起作用,所以我真的很困惑。
    • 你在哪个容器上运行了这个项目?我想它是 tomcat,因为我看到它使用 Jasper。您是否设法检查了服务器日志?否则,您可以在您的问题中添加堆栈跟踪。
    • 标签类也正确吗?我看到你指定了 decorateHandler,你确定它不在包下吗?也许发布标签的完整源代码? tld 是否也以 标记开头,因为它在您的帖子中丢失?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2018-12-04
    相关资源
    最近更新 更多