为什么 forEach 标记不适用于 Tomcat 但 Jetty 一切正常?
Why is the forEach tag not working with Tomcat but all is fine with Jetty?
这些是我在 pom.xml
中的依赖项
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.13</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.13</version>
</dependency>
以及我使用的 Jetty 插件:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.1.v20140609</version>
</plugin>
我使用的 Tomcat 是:8.5.4.
这是我的看法:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:head>
<title>Student List</title>
</h:head>
<h:body>
<c:forEach items="#{studentBean.studentList}"
var="student">
#{student.fullname}
<br/>
</c:forEach>
</h:body>
</html>
当我 运行 这个应用程序是这样的:
mvn clean install
mvn jetty:start
并访问 localhost:8080,我会在我的浏览器上看到列表。
Koray Tugay
Mick Jagger
现在,如果我复制创建的 .war 文件并将其部署到 Tomcat,我将看到:
type Exception report
message javax/servlet/jsp/jstl/core/LoopTagStatus
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: javax/servlet/jsp/jstl/core/LoopTagStatus
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
javax.faces.view.facelets.FaceletException: javax/servlet/jsp/jstl/core/LoopTagStatus
com.sun.faces.facelets.tag.AbstractTagLibrary$UserComponentHandlerFactory.createHandler(AbstractTagLibrary.java:344)
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTagStatus
(完整堆栈跟踪 here..)
现在您可能想说 Tomcat 没有随 JSTL 一起提供,您应该将它作为依赖项添加到您的 pom.xml 中! 但是,在这个点我就问你:
为什么它在 Jetty 上运行良好?
此外,当我浏览 Maven 下载的 jsf-impl-2.2.13.jar 时,我发现文件名为:jstl -core.taglib 在 com/sun/faces/metadata/taglib.
下
在这个文件中,我看到了这个标签声明:
<tag>
<description><![CDATA[
The basic iteration tag, accepting many different
collection types and supporting subsetting and other
functionality
]]></description>
<tag-name>forEach</tag-name>
<handler-class>com.sun.faces.facelets.tag.jstl.core.ForEachHandler</handler-class>
<attribute>
<description><![CDATA[
Collection of items to iterate over.
]]></description>
<name>items</name>
<required>false</required>
<type>java.lang.Object</type>
</attribute>
</tag>
而且,class com.sun.faces.facelets.tag.jstl.core.ForEachHandler 已经包含在 jsf-impl-2.2.13.jar.
所以我的理解是,c:forEach 应该包含在 JSF 实现中。为什么 Tomcat 不喜欢这种情况?
如果我包含这个依赖项:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
在pom.xml中for循环也会在Tomcat中愉快的循环。这是如何工作或不工作的?
class com.sun.faces.facelets.tag.jstl.core.ForEachHandler
has via its dependency com.sun.faces.facelets.tag.jstl.core.JstlIterationStatus
对 javax.servlet.jsp.jstl.core.LoopTagStatus
的依赖。
Tomcat 不附带。因此需要 JSTL 依赖。
Jetty 显然提供了自己的 JSTL 库。所以你不需要通过 webapp 包含它。你至少应该标记它 <scope>provided</scope>
.
这些是我在 pom.xml
中的依赖项<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.13</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.13</version>
</dependency>
以及我使用的 Jetty 插件:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.1.v20140609</version>
</plugin>
我使用的 Tomcat 是:8.5.4.
这是我的看法:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:head>
<title>Student List</title>
</h:head>
<h:body>
<c:forEach items="#{studentBean.studentList}"
var="student">
#{student.fullname}
<br/>
</c:forEach>
</h:body>
</html>
当我 运行 这个应用程序是这样的:
mvn clean install
mvn jetty:start
并访问 localhost:8080,我会在我的浏览器上看到列表。
Koray Tugay
Mick Jagger
现在,如果我复制创建的 .war 文件并将其部署到 Tomcat,我将看到:
type Exception report
message javax/servlet/jsp/jstl/core/LoopTagStatus
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: javax/servlet/jsp/jstl/core/LoopTagStatus
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
javax.faces.view.facelets.FaceletException: javax/servlet/jsp/jstl/core/LoopTagStatus
com.sun.faces.facelets.tag.AbstractTagLibrary$UserComponentHandlerFactory.createHandler(AbstractTagLibrary.java:344)
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTagStatus
(完整堆栈跟踪 here..)
现在您可能想说 Tomcat 没有随 JSTL 一起提供,您应该将它作为依赖项添加到您的 pom.xml 中! 但是,在这个点我就问你:
为什么它在 Jetty 上运行良好?
此外,当我浏览 Maven 下载的 jsf-impl-2.2.13.jar 时,我发现文件名为:jstl -core.taglib 在 com/sun/faces/metadata/taglib.
下在这个文件中,我看到了这个标签声明:
<tag>
<description><![CDATA[
The basic iteration tag, accepting many different
collection types and supporting subsetting and other
functionality
]]></description>
<tag-name>forEach</tag-name>
<handler-class>com.sun.faces.facelets.tag.jstl.core.ForEachHandler</handler-class>
<attribute>
<description><![CDATA[
Collection of items to iterate over.
]]></description>
<name>items</name>
<required>false</required>
<type>java.lang.Object</type>
</attribute>
</tag>
而且,class com.sun.faces.facelets.tag.jstl.core.ForEachHandler 已经包含在 jsf-impl-2.2.13.jar.
所以我的理解是,c:forEach 应该包含在 JSF 实现中。为什么 Tomcat 不喜欢这种情况?
如果我包含这个依赖项:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
在pom.xml中for循环也会在Tomcat中愉快的循环。这是如何工作或不工作的?
class com.sun.faces.facelets.tag.jstl.core.ForEachHandler
has via its dependency com.sun.faces.facelets.tag.jstl.core.JstlIterationStatus
对 javax.servlet.jsp.jstl.core.LoopTagStatus
的依赖。
Tomcat 不附带。因此需要 JSTL 依赖。
Jetty 显然提供了自己的 JSTL 库。所以你不需要通过 webapp 包含它。你至少应该标记它 <scope>provided</scope>
.