Java Jetty 7 hightide分发、JSP和JSTL支持

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

我一直在努力使用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>
  • 我没有将任何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);