我正在尝试在Jetty中运行一个在Tomcat 5.5中正常运行的应用程序。该应用程序使用servlet 2.4和JSP 2.0。
Jetty / Jasper抛出了这个例外:
org.apache.jasper.JasperException: /WEB-INF/tiles/layout/main.jsp(85,55) PWC6340: According to the TLD, rtexprvalue is true, and deferred-value is specified for the attribute items of the tag handler org.apache.taglibs.standard.tag.rt.core.ForTokensTag, but the argument for the setter method is not a java.lang.Object
奇怪的是,我无法在任何地方找到TLD。它似乎是通过魔法获得它,我不明白。是否可能出现错误的TLD?
从org.apache.taglibs.standard.tag.rt.core.ForTokensTag加载的位置也很难说清楚。 Eclipse没有在项目的加载路径中找到它。
任何提示都欢迎......
答案 0 :(得分:6)
Jetty包含他们自己的JSTL库,不需要包含jakrta taglib的标准和核心jar。
如果您确实将jakartat taglib的jar放入您的Web应用程序中,那么forTokens标记中存在冲突,导致此错误,而其他标记运行良好。我建议从您的网络应用程序中删除jakarta taglib实现并依赖Jetty,或者停止使用forTokens。
答案 1 :(得分:4)
@Guss是正确的,唯一的出路似乎是避免使用c:forTokens
。
使用c:forTokens
替代c:forEach
的示例:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<c:forTokens items="${input}" delims="," var="i">
<!-- do stuff with ${i} -->
</c:forTokens>
<c:forEach items="${fn:split(input,',')}" var="i">
<!-- do stuff with ${i} -->
</c:forEach>