Summary:
Code that worked in Tomcat4 throws a compile time exception in Tomcat5.
My Jsp file consists of one line.
<jsp:useBean scope="request" id="l" class="java.util.List"/>
In Tomcat 4 a line like this was legal. If "l" did not exist in the request
scope it would try to instantiate it and throw a runtime
java.lang.InstantiationException. However in Tomcat 5 it causes this compile
time exception.
org.apache.jasper.JasperException: Unable to compile class for JSP
An error occurred at line: 1 in the jsp file: /useBeanTest.jsp
Generated servlet error:
[javac] Compiling 1 source file
C:\jakarta-tomcat-5.0.16\work\Catalina\localhost\jsp-examples\org\apache\jsp
\useBeanTest_jsp.java:44: java.util.List is abstract; cannot be instantiated
l = new java.util.List();
^
1 error
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandle
r.java:127)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:3
51)
org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:415)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:458)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:5
52)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:2
91)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
The code generated in Tomcat5 is
java.util.List l = null;
synchronized (request) {
l = (java.util.List) pageContext.getAttribute("l",
PageContext.REQUEST_SCOPE);
if (l == null){
l = new java.util.List();
pageContext.setAttribute("l", l, PageContext.REQUEST_SCOPE);
}
}
The code generated in Tomcat4 is
java.util.List l = null;
synchronized (request) {
l = (java.util.List) pageContext.getAttribute("l",
PageContext.REQUEST_SCOPE);
if (l == null){
try {
l = (java.util.List)
java.beans.Beans.instantiate(this.getClass().getClassLoader(),
"java.util.List");
} catch (ClassNotFoundException exc) {
throw new InstantiationException(exc.getMessage());
} catch (Exception exc) {
throw new ServletException("Cannot create bean of class " +
"java.util.List", exc);
}
pageContext.setAttribute("l", l, PageContext.REQUEST_SCOPE);
}
}
Which throws the exception because you aren't allowed to instantiate an
abstract class.
--------------------------------------------------------------------
A similar exception is being thrown if you attempt to retrieve an array.
A line in a jsp...
<jsp:useBean scope="request" id="l" class="java.util.ArrayList[]"/>
Yields an exception...
org.apache.jasper.JasperException: Unable to compile class for JSP
An error occurred at line: 1 in the jsp file: /useBeanTest2.jsp
Generated servlet error:
[javac] Compiling 1 source file
C:\jakarta-tomcat-5.0.16\work\Catalina\localhost\jsp-examples\org\apache\jsp
\useBeanTest2_jsp.java:44: array dimension missing
l = new java.util.ArrayList[]();
^
1 error
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandle
r.java:127)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:3
51)
org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:415)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:458)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:5
52)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:2
91)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
In this case the code generated in Tomcat5 is
java.util.ArrayList[] l = null;
synchronized (request) {
l = (java.util.ArrayList[]) pageContext.getAttribute("l",
PageContext.REQUEST_SCOPE);
if (l == null){
l = new java.util.ArrayList[]();
pageContext.setAttribute("l", l, PageContext.REQUEST_SCOPE);
}
}
The code generated in Tomcat4 is
java.util.ArrayList[] l = null;
synchronized (request) {
l = (java.util.ArrayList[]) pageContext.getAttribute("l",
PageContext.REQUEST_SCOPE);
if (l == null){
try {
l = (java.util.ArrayList[])
java.beans.Beans.instantiate(this.getClass().getClassLoader(),
"java.util.ArrayList[]");
} catch (ClassNotFoundException exc) {
throw new InstantiationException(exc.getMessage());
} catch (Exception exc) {
throw new ServletException("Cannot create bean of class " +
"java.util.ArrayList[]", exc);
}
pageContext.setAttribute("l", l, PageContext.REQUEST_SCOPE);
}
}
If this should be in the Tomcat-Dev list, I'm sorry and I'll move it there.
If this has already been brought up as I bug in Tomcat5, sorry for bringing
it up again but I couldn't find any mention of it in Bugzilla.
Thanks for reading.
-Andrew.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]