Tomcat 7和JSTL
我用Eclipse Tomcat编写了一个Web应用程序,它在我的本地Tomcat 7上工作,当我尝试在Tomcat 7上在线发布它时,出现以下错误:
SEVERE:Servlet.service()为servlet [obliquid.servlet.Index]与上下文中的path[/ cp]抛出exception[绝对的uri:
http://java.sun.com/jsp/jstl/core
:http://java.sun.com/jsp/jstl/core
无法parsingweb.xml或使用此应用程序部署的jar文件]
Tomcat 7有“规格版本:Servlet 3.0,JSP 2.2,EL 2.2”,所以不包括JSTL?
当我试图上传standard.jar和jstl.jar我有以下错误:
org.apache.jasper.JasperException:/jsp/index.jsp(行:3,列:62)无法从JAR文件“jndi:/ localhost / cp / WEB-INF”读取TLD“META-INF / c.tld” /lib/standard.jar“:org.apache.jasper.JasperException:无法加载或实例化TagLibraryValidator类:org.apache.taglibs.standard.tlv.JstlCoreTLV
我做了一些Googlesearch,但是我不能把它整理出来,有人说这可能是由于jar子版本冲突造成的。 也许我不应该包括这些jar子,并使用不同的JSTLurl? 我的是JSTL 1.1我认为,JSTL 1.2有没有新的URL?
我应该怎么做来解决这个问题,并使这个应用程序运行?
Tomcat从未包含JSTL。
你应该把jstl和标准jar放入WEB-INF/lib
(你已经这样做了),并且确保你有权限读取它们(chmod)
你的URI是正确的,它应该工作(在这里工作)
我已经与这个战斗了几个小时。 这是一个完整的解决scheme。
-
我正在使用Tomcat 7,这是一个符合Servlet 3.0的服务器。
-
如果你想使用Servlet 3.0规范,你必须有你的web.xml如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
-
如果你使用Maven,你的pom.xml应该有这些行。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jstl-impl</artifactId> <version>1.2</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> <exclusion> <artifactId>jstl-api</artifactId> <groupId>javax.servlet.jsp.jstl</groupId> </exclusion> </exclusions> </dependency>
这些依赖关系非常重要。 JSTL 2.1 + Tomcat 7 + Servlet 3.0是非常糟糕的,除非通过使用这些行来修复它,特别是排除部分。 现在发生的事情是JSTL 2.1 Jars实际上拉错了Servlet规范的错误版本 – 2.5。 除非你停止发生,否则你将处于一个痛苦的世界。 特别感谢Murray Todd Williams先生提供的这些见解 。
-
最后,如果Maven找不到这些JARS,可以通过在项目中包含三个JARS并执行通常的Project – > Properties – > Java Build Path来包含它们,从而使Eclipse变得快乐 – 尽pipeMaven应该关心它。
javax.servlet-api-3.0.1.jar javax.servlet.jsp.jstl-1.2.1.jar javax.servlet.jsp.jstl-api-1.2.1.jar
-
请注意! 这个确切的configuration只适用于如果你正在使用魔术组合:
-
一个Servlet 3.0兼容的应用服务器,如Tomcat 7
-
您的web.xml具有Servlet 3.0规范的正确命名空间
-
你的类path中有三个JARS,没有其他的JSTL或Servlet JARS。
-
-
确保不要将这些JAR的副本放在WEB-INF / lib目录中,因为在这种情况下,它们会被发送到服务器,从而导致链接错误。
-
在你的JSP中,你需要有这个PRECISE行,格式与我的一样,否则Eclipse会抱怨它不能识别c:blah标签:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-
多么危险的PITA! 这比任何其他版本的JSTL都要难得多。 这是在后面的迭代中变得更复杂而不是更简单的唯一例子。
你的uri对于JSTL 1.2是正确的。 你需要做两件事情:
更改您的web.xml
以使用最新的Web应用程序版本。
它应该看起来像这样或更新的版本;
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
其次把正确版本的JSTL JAR放在你的代码中。 对于1.2你可以在这里下载。
这应该给你两个jar子:
- JSTL-api.jar文件
- JSTL-impl.jar中
使用这些,而不是以前版本的standard.jar
和jstl.jar
。
让我们知道这是如何工作的。
对于在Apache Tomcat 7上运行,将这些添加到您的POM可能是适当的。 这些jar子不像Glassfish那样引用javax.servletjar子,所以不需要排除。
<dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.1</version> </dependency>
对于Tomcat,JSTL 1.1.2有一个更简单的依赖解决scheme:
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <!-- Apache Taglibs does not implement version 1.2 --> <version>1.1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>c</artifactId> <version>1.1.2</version> <type>tld</type> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>fmt</artifactId> <version>1.1.2</version> <type>tld</type> </dependency> <dependency>
在这里看到更多的细节(个人博客)。
REM:按照要求提供更多细节,必须包含JSTL依赖关系,以使它们在Tomcat上可用。 然而,版本1.2并不是必须的,因为版本1.1.2(由Apache提供,如Tomcat)也能完成这项工作。 它唯一的要求是Servlet 2.4和JSP 2.2,而OP提到Servlet 3.0和JSP 2.0,这足够好。
这里有两个答案,在处理这个问题时如何使用Maven解决这个问题大部分是正确的。 但是,两者都不是100%完整的。
根据@Tom Hunter的回答使用排除
这个答案的作品。 但是,仍然会有来自Tomcat的关于重复TLD定义的日志消息。 这是因为jstl和jstl-impl构件都包含TLD定义。 要删除这些消息,我认为更好的Maven设置是这样的:
<dependency> <version>1.2</version> <scope>runtime</scope> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jstl-impl</artifactId> <version>1.2</version> <scope>runtime</scope> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> <exclusion> <artifactId>jstl-api</artifactId> <groupId>javax.servlet.jsp.jstl</groupId> </exclusion> </exclusions> </dependency>
这只包括jstl api类和必要的排除,以避免在答案的其余部分解释的问题。
根据@ George的答案使用更新的POM版本
我花了一段时间才意识到这一点,但是有更新版本的JSTL pom可用。 这真是令人困惑,因为这些较新的软件包使用类似的命名规则,但略有不同。 这些较新的版本将javax.servlet,javax.jsp等依赖项标记为提供的范围,以便不需要排除它们。 1.2.1版本依赖于jstl-api的1.2.1版本。 所以这将工作以及以上答案:
<dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.servlet.jsp.jstl</artifactId> <version>1.2.1</version> <scope>runtime</scope> </dependency>
这与George的答案略有不同,因为我将范围更改为运行时。 乔治指定范围提供。 使用提供的范围,jar将不得不手动复制到Tomcat lib目录中,否则其他一些依赖项必须包含必要的实现。
但是,我找不到maven central,jboss repo或其他回购版中的impl的1.2.1版本。 我结束了围绕圈子,最后只是使用本地文件回购存储jar子。 依赖和jar在这里描述:
这些都没有为我工作,我只是创build该项目,而不使用Maven和直接添加JAR文件。
我遭受了以下错误:SEVERE:Servlet [servlet.service()for servlet [obliquid.servlet.Index]与上下文中的path[/ cp]抛出exception[The absolute uri: http : //java.sun.com/jsp/jstl / core无法在Tomcat 7上的web.xml或使用此应用程序部署的jar文件中parsing]
解决scheme:直接将jar文件jstl-1.2.jar和javax.servlet.jsp.jstl-api-1.2.1.jar复制到Tomcat库目录。 再次在Eclipse中重新部署Tomcat库。
以下的依赖在pom.xml中似乎解决了这个问题:
<dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.servlet.jsp.jstl</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>javax.servlet.jsp.jstl-api</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency>
这是一个奇怪的组合 – 两个不同的groupIds – 但它确实工作:)。 我的期望是看到两个jar子相同的组ID。 我设法在没有问题的情况下重新部署到Tomcat 7。
另外,如果你看到“Unkown标签