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
我一直在与这个斗争几个小时.这是一个完整的解决方案.
我使用的是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">
Run Code Online (Sandbox Code Playgroud)如果你正在使用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先生的这些见解.
最后,如果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)请注意!这种确切的配置仅适用于以下魔术组合:
符合Servlet 3.0的应用程序服务器,例如Tomcat 7
您的web.xml具有适用于Servlet 3.0规范的命名空间
您的类路径中有这三个JARS,没有其他JSTL或Servlet JARS.
确保不要将这些JAR的副本放在WEB-INF/lib目录中,因为在这种情况下它们会被发送到服务器,从而导致LinkageErrors.
在你的JSP中,你需要有这个PRECISE行,格式与我一样,否则Eclipse会抱怨它不能识别c:blah标签:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Run Code Online (Sandbox Code Playgroud)多么危险的PITA!这比任何其他版本的JSTL都难以实现.这是在以后的迭代中变得更复杂而不是更简单的事情的唯一例子.
Boz*_*zho 45
Tomcat从未包含JSTL.
您应该将jstl和标准罐放入WEB-INF/lib(您已经完成),并确保您具有读取它们的权限(chmod)
你的URI是正确的,它应该工作(在这里工作)
小智 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您可以在这里下载它们.
这应该给你两个罐子:
使用这些,而不是standard.jar和jstl.jar它是为以前的版本.
让我们知道这对您有何帮助.
对于在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)
| 归档时间: |
|
| 查看次数: |
95854 次 |
| 最近记录: |