我一直在努力研究Jetty 7及其对JSP和JSTL的支持。
我的JSP文件:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<head>
<title>blah</title>
</head>
<body>
<table id="data">
<tr class="columns">
<td>Hour</td>
<c:forEach var="campaign" items="${campaigns}">
<td>${campaign}</td>
</c:forEach>
</tr>
<c:forEach var="hour" items="${results}">
<tr>
<td class="hour">${hour.key}</td>
<c:forEach var="campaign" items="${campaigns}">
<td>${hour[campaign]}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
上面的JSP部分按预期工作。然而,JSTL没有。广告系列和结果变量是servlet设置的请求属性。
我收到以下错误:
WARN: ... compiler.TagLibraryInfoImpl: Unknown element (deferred-value) in attribute
WARN: ... compiler.TagLibraryInfoImpl: Unknown element (deferred-value) in attribute
WARN: ... compiler.TagLibraryInfoImpl: Unknown element (deferred-value) in attribute
ERROR: ... javax.servlet.ServletException: java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
类路径:
/usr/local/jetty/lib/jetty-xml-7.0.1.v20091125.jar:/usr/local/jetty/lib/servlet-api-2.5.jar:/usr/local/jetty/lib/jetty-http-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-continuation-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-server-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-security-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-servlet-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-webapp-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-deploy-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-servlets-7.0.1.v20091125.jar:/usr/local/jetty/lib/jsp/ant-1.6.5.jar:/usr/local/jetty/lib/jsp/core-3.1.1.jar:/usr/local/jetty/lib/jsp/jetty-jsp-2.1-7.0.1.v20091125.jar:/usr/local/jetty/lib/jsp/jsp-2.1-glassfish-9.1.1.B60.25.p2.jar:/usr/local/jetty/lib/jsp/jsp-api-2.1-glassfish-9.1.1.B60.25.p2.jar:/usr/local/jetty/resources:/usr/local/jetty/lib/jetty-util-7.0.1.v20091125.jar:/usr/local/jetty/lib/jetty-io-7.0.1.v20091125.jar
非常感谢任何帮助。
提前致谢,
利奥尔。
答案 0 :(得分:7)
对于Jetty 8,情况有点不同,以防万一。
对于JSTL 1.2,相当令人惊讶的是,taglib必须是:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
来自(mavenishly)的JSTL 1.2:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
我无法解释为什么URL缺少'jsp',但它的工作原理是这样的。
答案 1 :(得分:4)
tsk ...我没有权利发表评论。我正在使用Jetty 7.1.6和bmargulies提供的答案。
基本上,从
更改URI<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
到
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
使taglibs在Jetty 7中工作。
-Nishant
答案 2 :(得分:2)
java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
此异常基本上意味着在运行时类路径中找不到所提到的方法,而它在类或其依赖项之一的compiletime类路径中可用。
这个method是在JSP 2.1中引入的,它与Servlet 2.5密切相关。由于Jetty 7应该支持Servlet 2.5,因此不是这里的嫌疑人,唯一的原因可能是web.xml
被声明为Servlet 2.4或更低而不是Servlet 2.5。因此,要解决此特定问题,您需要将web.xml
声明为至少Servlet 2.5。 <web-app>
标记应如下所示:
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="YourWebAppID"
version="2.5">
如果这不能解决问题,那么另一个原因是/WEB-INF/lib
或更糟糕的/JRE/lib
或/JRE/lib/ext
与包含较旧Servlet的appserver特定库混杂在一起API版本。例如。来自Tomcat的servlet-api.jar
或来自Glassfish的j2ee.jar
或javaee.jar
等。您需要从不属于那里的任何库中清除这些类路径文件夹,因为它们在类加载中优先,并将覆盖appserver自己的库。特定于Appserver的库属于有问题的appserver,而不属于webapp或JRE。
这就是说,除了实际问题之外,@page
属性language="java" contentType="text/html; charset=utf-8"
都是多余的。如果设置language
,则contentType
已默认为Java,text/html
已默认为charset
,UTF-8
已设置为pageEncoding="UTF-8"
。所以以下内容已足够:
<%@page pageEncoding="UTF-8" %>
答案 3 :(得分:1)
import org.apache.jasper.runtime.TldScanner;
import java.util.Set;
Field field = TldScanner.class.getDeclaredField("systemUris");
field.setAccessible(true);
((Set<?>)field.get(null)).clear();
field.setAccessible(false);