Jetty 7高级分发,JSP和JSTL支持

我一直在努力使用Jetty 7及其对JSP和JSTL的支持。

我的JSP文件:

     blah   
Hour ${campaign}
${hour.key} ${hour[campaign]}

上面的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; 
  • 我没有将任何jar文件捆绑到我部署到jetty的.war文件中。
  • 我正在使用的docker版本是: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 

任何帮助将不胜感激。

提前致谢,

利奥尔。

 java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext; 

此exception基本上意味着在运行时类路径中找不到所提到的方法,而它在类或其依赖项之一的compiletime类路径中可用。

这个方法在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-INF/lib甚至更糟/JRE/lib/JRE/lib/ext与包含旧版Servlet API版本的appserver特定库混杂在一起。 例如来自Tomcat或j2ee.jar servlet-api.jar或来自Glassfish的javaee.jar等。 您需要从不属于那里的任何库中清除这些类路径文件夹,因为它们在类加载中优先,并将覆盖appserver自己的库。 特定于Appserver的库属于有问题的appserver,而不属于webapp或JRE。


除了实际问题之外, @page attributes language="java" contentType="text/html; charset=utf-8"都是多余的。 该language已默认为Java,如果设置pageEncoding="UTF-8" ,则contentType已默认为text/html ,并且charset已设置为UTF-8 。 所以以下就足够了:

 <%@page pageEncoding="UTF-8" %> 

对于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和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

http://java.sun.com/jsp/jstl/core无效的原因是Jetty使用的Jasper Jsp解析器中的代码(org.apache.jasper.glassfish:jar:2.2.2.xxx )假设uri是一个系统(参见TldScanner.java)并且它不会将任何带有此uri的taglib放入其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);