【问题标题】:Unable to execute JSTL XML ForEach statements无法执行 JSTL XML ForEach 语句
【发布时间】:2021-09-15 10:04:25
【问题描述】:

我是 J2EE 新手。我创建了动态 web 项目并创建了 JSP 文件以使用 JSTL XML 标记来解析简单的 xml 并使用 forEach 循环读取节点。我正在使用 Tomcat 9 版本。 我已将 JSTL-1.2 复制到 WEB-INF/LIB 文件夹中,并且在我的 JSP 代码中识别出 JSTL Core/Function/XML 标签,但是当我为 JSTL XML forEach 功能编写代码时,我开始出现错误。

我添加了 Tomcat 9 中的 servlet-api.jar、jsp-api.jar 作为构建路径的一部分。

JSP 代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>  
    <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>  
    
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>XML Parse and forEach</title>
</head>
<body>
    <c:import url="/Users.xml" var="XMLFile"/> 
    <x:parse xml="${XMLFile }" var="XMLdoc"/>

    <x:forEach var="usr" select="$XMLdoc/users/user">
        <x:out select="name"/>
        <x:out select="gender"/>
        <x:out select="age"/>
    </x:forEach>
    
</body>
</html>

HTTP Status 500 – Internal Server Error


Type Exception Report

Message An exception occurred processing [XMLForEach.jsp] at line [17]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception
org.apache.jasper.JasperException: An exception occurred processing [XMLForEach.jsp] at line [17]

14:     <c:import url="/Users.xml" var="XMLFile"/> 
15:     <x:parse xml="${XMLFile }" var="XMLdoc"/>
16: 
17:     <x:forEach var="usr" select="$XMLdoc/users/user">
18:         <x:out select="name"/>
19:         <x:out select="gender"/>
20:         <x:out select="age"/>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:610)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499)
    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)


Root Cause
java.lang.IllegalArgumentException: UnSupported Return Type : {http://www.w3.org/1999/XSL/Transform}OBJECT
    java.xml/com.sun.org.apache.xpath.internal.jaxp.XPathImplUtil.isSupported(XPathImplUtil.java:248)
    java.xml/com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:127)
    org.apache.taglibs.standard.tag.common.xml.XPathUtil.selectNodes(XPathUtil.java:258)
    org.apache.taglibs.standard.tag.common.xml.ForEachTag.prepare(ForEachTag.java:59)
    javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)
    org.apache.jsp.XMLForEach_jsp._jspx_meth_x_005fforEach_005f0(XMLForEach_jsp.java:261)
    org.apache.jsp.XMLForEach_jsp._jspService(XMLForEach_jsp.java:159)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
    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)


Note The full stack trace of the root cause is available in the server logs.


Apache Tomcat/9.0.48

---------------------------------------------------------------------------------------------
Jul 04, 2021 2:02:26 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/S08LAL_-_JSTLXMLTags] threw exception [An exception occurred processing [XMLForEach.jsp] at line [17]

14:     <c:import url="/Users.xml" var="XMLFile"/> 
15:     <x:parse xml="${XMLFile }" var="XMLdoc"/>
16: 
17:     <x:forEach var="usr" select="$XMLdoc/users/user">
18:         <x:out select="name"/>
19:         <x:out select="gender"/>
20:         <x:out select="age"/>


Stacktrace:] with root cause
java.lang.IllegalArgumentException: UnSupported Return Type : {http://www.w3.org/1999/XSL/Transform}OBJECT
    at java.xml/com.sun.org.apache.xpath.internal.jaxp.XPathImplUtil.isSupported(XPathImplUtil.java:248)
    at java.xml/com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:127)
    at org.apache.taglibs.standard.tag.common.xml.XPathUtil.selectNodes(XPathUtil.java:258)
    at org.apache.taglibs.standard.tag.common.xml.ForEachTag.prepare(ForEachTag.java:59)
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)
    at org.apache.jsp.XMLForEach_jsp._jspx_meth_x_005fforEach_005f0(XMLForEach_jsp.java:261)
    at org.apache.jsp.XMLForEach_jsp._jspService(XMLForEach_jsp.java:159)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:831)


[Build path][1]


  [1]: https://i.stack.imgur.com/vCSzu.png

【问题讨论】:

  • 我强烈怀疑您正在 Java 16 上运行 tomcat 9?它是否正确?如果您尝试在 Java 15 上运行 Tomcat 9,该错误仍然会发生吗?

标签: jsp servlets jstl


【解决方案1】:

我找到了解决这个问题的方法。

可能的原因是您正在使用 Java 16 的 Tomcat 9 上使用旧的 jstl 库运行您的应用程序。有趣的是,旧的库非常适合使用 Java 15 的 Tomcat 9。但不适用于 Java 16!也许在 Java 16 中对 XPath 的支持有所改变。

您的异常可能如下所示:

08-Sep-2021 20:43:34.213 SEVERE [http-nio-8888-exec-10] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet [jsp] threw exception
    java.lang.IllegalArgumentException: UnSupported Return Type : {http://www.w3.org/1999/XSL/Transform}OBJECT
        at org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:276)
        at org.apache.taglibs.standard.tag.common.xml.XPathUtil.selectNodes(XPathUtil.java:258)
        at org.apache.taglibs.standard.tag.common.xml.ForEachTag.prepare(ForEachTag.java:59)
        at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)

首先:从https://tomcat.apache.org/download-taglibs.cgi下载新的jstl库

第二:下载此处列出的依赖项:https://downloads.apache.org/tomcat/taglibs/taglibs-standard-1.2.5/README_bin.txt

  • xalan-2.7.1.jar
  • serializer-2.7.1.jar

第三:确保在 Tomcat 类路径或 Web 应用程序类路径中没有旧的 jstl 和标准 jar 文件。

经过测试

  • apache-tomcat-9.0.52:服务器版本名称:Apache Tomcat/9.0.52
  • Java 16.0.2:JVM 版本:16.0.2+7-67

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2019-11-28
    • 2013-06-28
    • 2016-03-28
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多