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。

  1. 我正在使用Tomcat 7,这是一个符合Servlet 3.0的服务器。

  2. 如果你想使用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"> 
  3. 如果你使用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先生提供的这些见解 。

  4. 最后,如果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 
  5. 请注意! 这个确切的configuration只适用于如果你正在使用魔术组合:

    1. 一个Servlet 3.0兼容的应用服务器,如Tomcat 7

    2. 您的web.xml具有Servlet 3.0规范的正确命名空间

    3. 你的类path中有三个JARS,没有其他的JSTL或Servlet JARS。

  6. 确保不要将这些JAR的副本放在WEB-INF / lib目录中,因为在这种情况下,它们会被发送到服务器,从而导致链接错误。

  7. 在你的JSP中,你需要有这个PRECISE行,格式与我的一样,否则Eclipse会抱怨它不能识别c:blah标签:

     <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
  8. 多么危险的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.jarjstl.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标签