Распределение джетти 7 hightide, поддержка JSP и JSTL - PullRequest
7 голосов
/ 29 марта 2010

Я боролся с 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, однако, не делает. Переменные кампаний и результатов являются атрибутами запроса, установленными сервлетом.

Я получаю следующие ошибки:

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-файлы в мой файл .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

Любая помощь будет принята с благодарностью.

Заранее спасибо,

Лиор.

Ответы [ 5 ]

7 голосов
/ 02 июля 2010

С Jetty 8 ситуация немного другая, на случай, если это кому-нибудь поможет.

Для JSTL 1.2 довольно удивительно, что taglib должен быть:

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

с JSTL 1.2 от (мавински):

 <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
 </dependency>

Я не могу объяснить, почему в URL отсутствует «jsp», но он работает следующим образом.

4 голосов
/ 18 января 2012

Причина, по которой http://java.sun.com/jsp/jstl/core не работает, заключается в том, что код в парсере Jasper Jsp, используемый Jetty (org.apache.jasper.glassfish: jar: 2.2.2.xxx), предполагает, что systemuri (см. TldScanner.java), и он не будет помещать никакие метки с этим URI в свой кеш таблиц. Я не знаю, почему это предположение в коде, но это так. Кажется, это ошибка для меня.

4 голосов
/ 21 декабря 2010

tsk ... Я не имею права комментировать. Я использую Jetty 7.1.6 и ответ предоставлен bmargulies works.

В основном, изменение 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 голосов
/ 29 марта 2010
java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;

Это исключение в основном означает, что упомянутый метод не может быть найден в пути к классам времени выполнения, хотя он был доступен в пути к классам компиляции либо класса, либо одной из его зависимостей.

Этот метод представлен в JSP 2.1, который тесно связан с сервлетом 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 перегружены специфичными для appserver библиотеками, содержащими более старую версию API сервлета. Например. servlet-api.jar от Tomcat или j2ee.jar или javaee.jar от Glassfish, и так далее. Вам нужно будет очистить эти папки classpath от любых библиотек, которые там не принадлежат, потому что они получают приоритет при загрузке классов и переопределяют собственные библиотеки сервера приложений. Библиотеки, специфичные для сервера приложений, принадлежат данному серверу приложений, а не веб-приложению или JRE.


Тем не менее, кроме реальной проблемы, атрибуты @page language="java" contentType="text/html; charset=utf-8" являются излишними. language по умолчанию уже Java, а contentType уже по умолчанию text/html, а charset будет уже установлен на UTF-8, если вы установите pageEncoding="UTF-8". Так что уже достаточно:

<%@page pageEncoding="UTF-8" %>
1 голос
/ 07 августа 2012

Спасибо за отзыв Стив! Ошибка, кажется, все еще есть, вот обходной путь для запуска при инициализации 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);
...