Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jetty 7 hightide distribution, JSP and JSTL support

Tags:

java

jsp

jstl

jetty

I've been struggling with Jetty 7 and its support for JSP and JSTL.

My JSP file:

<%@ 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>

The JSP portions above work as expected. JSTL, however, does not. The campaigns and results variables are request attributes set by a servlet.

I get the following errors:

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;
  • I am not bundling any jar files into my .war file deployed to jetty.
  • The version of jetty I'm using is: jetty-hightide-7.0.1.v20091125

The classpath:

/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

Any help would be greatly appreciated.

Thanks in advance,

Lior.

like image 770
Lior Cohen Avatar asked Mar 28 '10 22:03

Lior Cohen


4 Answers

With Jetty 8, the situation is a bit different, in case this helps anyone.

For JSTL 1.2, rather surprisingly, the taglib has to be:

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

with JSTL 1.2 from (mavenishly):

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

I can't really explain why the URL lacks 'jsp', but it works this way.

like image 54
bmargulies Avatar answered Sep 29 '22 13:09

bmargulies


tsk... I don;t have privilege to comment. I am using Jetty 7.1.6 and answer provided by bmargulies works.

Basically, changing URI from

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

to

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

makes taglibs to work in Jetty 7.

-Nishant

like image 42
Nishant Avatar answered Sep 29 '22 11:09

Nishant


The reason why http://java.sun.com/jsp/jstl/core doesn't work is because the code in the Jasper Jsp parser used by Jetty (org.apache.jasper.glassfish:jar:2.2.2.xxx) assumes that that uri is a systemuri (see TldScanner.java) and it will not put any taglibs with this uri in its tablib location cache. I don't know why this assumption is in the code but it is. Seems to be a bug to me.

like image 22
Steve Avatar answered Sep 29 '22 13:09

Steve


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

This exception basically means that the mentioned method cannot be found in the runtime classpath, while it was available in the compiletime classpath of either the class or one of its dependencies.

This method is introduced in JSP 2.1 which gets hand in hand with Servlet 2.5. Since Jetty 7 is supposed to support Servlet 2.5 and thus isn't the suspect here, the only cause can be that the web.xml is declared as Servlet 2.4 or lower instead of Servlet 2.5. So, to fix this particular problem, you need to declare your web.xml as at least Servlet 2.5. The <web-app> tag should look like this:

<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">

If that doesn't solve the problem, then the other cause is that the /WEB-INF/lib or even worse the /JRE/lib or /JRE/lib/ext is cluttered with appserver-specific libraries containing an older Servlet API version. E.g. servlet-api.jar from Tomcat or j2ee.jar or javaee.jar from Glassfish, etcetera. You'll need to clean up those classpath folders from any libraries which doesn't belong there, because they get precedence in classloading and will override the appserver's own libraries. Appserver-specific libraries belongs to the appserver in question, not to the webapp or JRE.


That said and apart from the actual problem, the @page attributes language="java" contentType="text/html; charset=utf-8" are all superfluous. The language already defaults to Java and the contentType already defaults to text/html and the charset will already be set to UTF-8 if you set pageEncoding="UTF-8". So the following is already sufficient:

<%@page pageEncoding="UTF-8" %>
like image 32
BalusC Avatar answered Sep 29 '22 11:09

BalusC