Java Jetty 7 hightide分发、JSP和JSTL支持
我一直在努力使用Jetty 7及其对JSP和JSTL的支持 我的JSP文件:Java Jetty 7 hightide分发、JSP和JSTL支持,java,jsp,jetty,jstl,Java,Jsp,Jetty,Jstl,我一直在努力使用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
<%@ 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>
- 我没有将任何jar文件捆绑到部署到jetty的.war文件中
- 我使用的jetty版本是:jetty-hightide-7.0.1.v20091125
/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
任何帮助都将不胜感激
提前感谢,
莱奥
此异常基本上意味着在运行时类路径中找不到提到的方法,而该方法在类或其依赖项之一的compiletime类路径中可用
这是在JSP2.1中引入的,它与Servlet2.5齐头并进。由于Jetty 7应该支持Servlet 2.5,因此在这里不是可疑的,唯一的原因可能是web.xml
被声明为Servlet 2.4或更低版本,而不是Servlet 2.5。因此,要解决这个特殊问题,您需要将web.xml
声明为至少Servlet 2.5。
标记应如下所示:
<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">
对于Jetty 8,情况有所不同,以防这对任何人都有帮助 对于JSTL 1.2,相当令人惊讶的是,taglib必须是:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
JSTL 1.2来自(mavenishly):
javax.servlet
jstl
1.2
我无法解释为什么URL缺少“jsp”,但它是这样工作的。tsk。。。我不知道;我没有评论的特权。我使用的是Jetty 7.1.6和works提供的答案 基本上,将URI从
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
到
使taglibs在Jetty 7中工作
-Nishant之所以不起作用,是因为Jetty(org.apache.Jasper.glassfish:jar:2.2.2.xxx)使用的Jasper Jsp解析器中的代码假设uri是一个systemuri(请参见TldScanner.java),并且它不会将任何带有此uri的标记库放在其tablib位置缓存中。我不知道代码中为什么会有这样的假设,但事实确实如此。对我来说似乎是个bug。谢谢史蒂夫的小费!缺陷似乎仍然存在,这里有一个在Jetty初始化时运行的解决方法。这对我起了作用
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);
import org.apache.jasper.runtime.TldScanner;
导入java.util.Set;
Field=TldScanner.class.getDeclaredField(“SystemURI”);
字段。setAccessible(true);
((Set)field.get(null)).clear();
字段.setAccessible(false);
My web.xml已使用如上所示的2.5版本。No go.Modified my No-jar文件被捆绑到eclipse导出的.war文件中。抱歉,我没有看到其他原因。祝你好运。不过我想知道根本原因。谢谢你的努力。当我找到解决方案时,我会更新这个问题(希望如此)。感谢您的解释(感谢上面的讨论,现在JSTL工作了)。我使用嵌入式Jetty,对于JSP,我使用这个Maven坐标:org.glassfish.web:JSP impl:2.2.1。我将尝试使用另一个JSP实现。很好的发现(在TldScanner中发现问题)!好像是虫子。切换到jasper 6.0.37有助于解决这个问题。排除“all*.Exclude模块:'org.apache.jasper.glassfish'(gradle语法)并添加“compile'org.apache.tomcat:jasper:6.0.37'”。
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
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);