Tomcat 7和JSTL

sti*_*vlo 44 java tomcat jstl tomcat7

我用Eclipse Tomcat编写了一个Web应用程序,它可以在我的本地Tomcat 7上运行,当我尝试在Tomcat 7上在线发布时,我遇到以下错误:

严重:servlet [obliquid.servlet.Index]的Servlet.service()在路径[/ cp]的上下文中引发异常[绝对uri:http://java.sun.com/jsp/jstl/core无法在web.xml或使用此应用程序部署的jar文件中解析]

Tomcat 7有"Spec版本:Servlet 3.0,JSP 2.2,EL 2.2",所以JSTL不包括在内?

当我尝试上传standard.jar和jstl.jar时,我遇到以下错误:

org.apache.jasper.JasperException:/jsp/index.jsp(line:3,column: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

我做了一些谷歌搜索,但我无法解决,有些人说这可能是由于罐子的冲突版本造成的.也许我不应该包括那些罐子并使用不同的JSTL网址?我认为是JSTL 1.1,JSTL 1.2是否有新的URL?

我该怎么做才能解决问题并使这个应用程序运行?

小智 54

我一直在与这个斗争几个小时.这是一个完整的解决方案.

  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"> 
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

    这些依赖关系非常重要.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变得高兴 - 尽管Maven应该采用关心它.

    javax.servlet-api-3.0.1.jar
    javax.servlet.jsp.jstl-1.2.1.jar
    javax.servlet.jsp.jstl-api-1.2.1.jar
    
    Run Code Online (Sandbox Code Playgroud)
  5. 请注意!这种确切的配置仅适用于以下魔术组合:

    1. 符合Servlet 3.0的应用程序服务器,例如Tomcat 7

    2. 您的web.xml具有适用于Servlet 3.0规范的命名空间

    3. 您的类路径中有这三个JARS,没有其他JSTL或Servlet JARS.

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

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

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    Run Code Online (Sandbox Code Playgroud)
  8. 多么危险的PITA!这比任何其他版本的JSTL都难以实现.这是在以后的迭代中变得更复杂而不是更简单的事情的唯一例子.

  • 谢谢!我经历了同样的问题......它让我的日子过得很快,感谢让它知道! (4认同)
  • 如果有人认为该解决方案对他们不起作用,请检查EL是否被忽略.将以下行添加到JSP页面.这需要注意不要忽略EL.<%@ page isELIgnored ="false"%> (2认同)

Boz*_*zho 45

Tomcat从未包含JSTL.

您应该将jstl和标准罐放入WEB-INF/lib(您已经完成),并确保您具有读取它们的权限(chmod)

你的URI是正确的,它应该工作(在这里工作)

  • 好的,所以这里是更新:我安装了新服务器中的所有内容,一切正常.不同之处在于我之前以root用户身份进行过rsyncing,现在我将其作为tomcat发布.我认为这应该意味着它确实是一个许可问题. (7认同)

小智 14

你的uri对JSTL 1.2是正确的.你需要做两件事:

更改您web.xml的使用最新的网络应用程序版本.

它应该看起来像这样或更高版本;

<?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">
Run Code Online (Sandbox Code Playgroud)

其次在你的代码中放入正确版本的jstl jar.对于1.2您可以在这里下载它们.

这应该给你两个罐子:

  • JSTL-api.jar文件
  • JSTL-impl.jar中

使用这些,而不是standard.jarjstl.jar它是为以前的版本.

让我们知道这对您有何帮助.


K.N*_*las 5

对于在apache tomcat 7上运行,将这些添加到POM中可能是合适的.这些罐子不像glafish那样引用javax.servlet罐子,因此不需要排除.

<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>
Run Code Online (Sandbox Code Playgroud)