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

Lio*_*hen 7 java jsp jstl jetty

我一直在努力使用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>
Run Code Online (Sandbox Code Playgroud)

上面的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;
Run Code Online (Sandbox Code Playgroud)
  • 我没有将任何jar文件捆绑到我部署到jetty的.war文件中.
  • 我正在使用的码头版本是: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
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

提前致谢,

利奥尔.

bma*_*ies 7

对于Jetty 8,情况有点不同,以防这对任何人都有帮助.

对于JSTL 1.2,相当令人惊讶的是,taglib必须是:

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Run Code Online (Sandbox Code Playgroud)

与JSTL 1.2(mavenishly):

 <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

我无法解释为什么URL缺少'jsp',但它以这种方式工作.


Bal*_*usC 2

java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
Run Code Online (Sandbox Code Playgroud)

此异常基本上意味着在运行时类路径中找不到上述方法,但该方法在该类或其依赖项之一的编译时类路径中可用。

方法是在 JSP 2.1 中引入的,并与 Servlet 2.5 齐头并进。由于 Jetty 7 应该支持 Servlet 2.5,因此这里不是可疑的,唯一的原因可能是它web.xml被声明为 Servlet 2.4 或更低版本,而不是 Servlet 2.5。因此,要解决这个特定问题,您需要将web.xmlServlet 声明为至少 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">
Run Code Online (Sandbox Code Playgroud)

如果这不能解决问题,那么另一个原因是/WEB-INF/lib或 更糟糕的是/JRE/lib/JRE/lib/ext被包含旧 Servlet API 版本的特定于应用程序服务器的库弄乱。例如,servlet-api.jar来自 Tomcat 或j2ee.jar 来自javaee.jarGlassfish 等。您需要从任何不属于那里的库中清理这些类路径文件夹,因为它们在类加载中具有优先权,并且将覆盖应用程序服务器自己的库。应用程序服务器特定的库属于相关的应用程序服务器,而不是 web 应用程序或 JRE。


也就是说,除了实际问题之外,这些@page属性language="java" contentType="text/html; charset=utf-8"都是多余的。已经language默认为 Java,并且contentType已经默认为text/html,并且如果您设置 则charset已经将其设置为。所以以下内容已经足够了:UTF-8pageEncoding="UTF-8"

<%@page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)