You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2003/06/05 19:58:02 UTC
DO NOT REPLY [Bug 20516] New: -
Jasper2 compilation not JSP 2.0 compliant on J2SE 1.4
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20516>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20516
Jasper2 compilation not JSP 2.0 compliant on J2SE 1.4
Summary: Jasper2 compilation not JSP 2.0 compliant on J2SE 1.4
Product: Tomcat 5
Version: 5.0.2
Platform: PC
OS/Version: Windows NT/2K
Status: NEW
Severity: Normal
Priority: Other
Component: Jasper2
AssignedTo: tomcat-dev@jakarta.apache.org
ReportedBy: todd@genuitec.com
According to the JSP 2.0 specification, Section 11.5 - Debugging Requirements:
"Full runtime support for JSR-45 (as opposed to only generating the SMAPs that
are used at runtime) is only required when the JSP container is running in a
J2SE 1.4 or greater environment."
While Jasper2 correctly generates SMAP's during JSP compilation, when running
in a J2SE 1.4 environment, the SMAP is not properly stored in the resulting
class file as required by the JSP 2.0 & JSR-45 specifications.
Following is a full description of the issue. It is effectively a duplicate of
an email I posted to the tomcat-dev mailing list, to which there was no
response.
We're working to support source-level JSP debugging for Tomcat 5 using its JSR-
045 support. However,we've been unsuccessful at getting this to work because
the line to code index map that we retrieve from our SourceDebugExtension JDWP
request does not agree with the SMAP that was generated when my example JSP
was compiled. The SMAP appears to be correct but for whatever reason the line
mapping returned from the JVM has little in common with the SMAP.
We've already gotten our debugging implementation working properly with
WebLogic 7.0 and 8.1 so I have a high degree of confidence that once this
mapping issue is resolved we'll also have a source-level JSP debugging
solution for Tomcat 5 also.
Here are the details of our test environment:
Platform: Window 2000, latest SP
JDK: 1.4.1_02-b06
Tomcat: Version 5.0.2 (alpha)
Tomcat 5 JSP servlet settings from web.xml:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>classdebuginfo</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>suppressSmap</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>dumpSmap</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
For the test, we attempt to set a breakpoint on line 18, which
according to the SMAP corresponds to line 62 of the servlet.
Here's the test JSP, with line numbers for convenience.
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <%@ page language="java" import="java.lang.*,java.util.*" %>
3 <%
4 String path = request.getContextPath();
5 String basePath =
"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";
6 %>
7 <HTML>
8 <HEAD>
9 <BASE HREF="<%=basePath%>">
10 <TITLE>My JSP 'TestJSP.jsp' starting page</TITLE>
11 </HEAD>
12
13 <BODY>
14 <%
15 Date date = new Date();
16 out.println("Current time is: " + date);
17 out.println(". ");
18 date = new Date();
19 out.println("Now the time is " + date);
20 out.println(". ");
21 %>
22 <BR>This is my test JSP page. <BR>
23 </BODY>
24 </HTML>
Here's the SMAP generated by Tomcat:
SMAP
C:\dev\ApacheGroup\Tomcat
5.0.2alpha\work\Catalina\localhost\TomcatTest\org\apache\jsp\TomcatTestJSP_j
sp.java
JSP
*S JSP
*F
+ 0 TomcatTestJSP.jsp
/TomcatTestJSP.jsp
*L
1:42
4,3:45
7:49
8:50
9:51
9:52
9:53
10:54
10:55
11:56
13:57
15,7:59
22:67
22:68
23:69
24:70
*E
Here's the generated servlet. As you can see,
line 62 is correct for the breakpont request from
line 18 of the JSP file.
1 package org.apache.jsp;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import javax.servlet.jsp.*;
6 import java.lang.*;
7 import java.util.*;
8
9 public final class TomcatTestJSP_jsp extends
org.apache.jasper.runtime.HttpJspBase
10 implements org.apache.jasper.runtime.JspSourceDependent {
11
12 private static java.util.Vector _jspx_dependants;
13
14 public java.util.List getDependants() {
15 return _jspx_dependants;
16 }
17
18 public void _jspService(HttpServletRequest request,
HttpServletResponse response)
19 throws java.io.IOException, ServletException {
20
21 JspFactory _jspxFactory = null;
22 PageContext pageContext = null;
23 HttpSession session = null;
24 ServletContext application = null;
25 ServletConfig config = null;
26 JspWriter out = null;
27 Object page = this;
28 JspWriter _jspx_out = null;
29
30
31 try {
32 _jspxFactory = JspFactory.getDefaultFactory();
33 response.setContentType("text/html;charset=ISO-8859-1");
34 pageContext = _jspxFactory.getPageContext(this, request,
response,
35 null, true, 8192, true);
36 application = pageContext.getServletContext();
37 config = pageContext.getServletConfig();
38 session = pageContext.getSession();
39 out = pageContext.getOut();
40 _jspx_out = out;
41
42 out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">\r\n");
43 out.write("\r\n");
44
45 String path = request.getContextPath();
46 String basePath =
"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";
47
48 out.write("\r\n");
49 out.write("<HTML>\r\n\t");
50 out.write("<HEAD>\r\n\t\t");
51 out.write("<BASE HREF=\"");
52 out.write(String.valueOf(basePath));
53 out.write("\">\t\t\r\n\t\t");
54 out.write("<TITLE>My JSP 'TestJSP.jsp' starting page");
55 out.write("</TITLE>\r\n\t");
56 out.write("</HEAD>\r\n\r\n\t");
57 out.write("<BODY>\r\n\t ");
58
59 Date date = new Date();
60 out.println("Current time is: " + date);
61 out.println(". ");
62 date = new Date();
63 out.println("Now the time is " + date);
64 out.println(". ");
65
66 out.write("\r\n\t\t");
67 out.write("<BR>This is my test JSP page. ");
68 out.write("<BR>\r\n\t");
69 out.write("</BODY>\r\n");
70 out.write("</HTML>\r\n");
71 } catch (Throwable t) {
72 if (!(t instanceof javax.servlet.jsp.SkipPageException)){
73 out = _jspx_out;
74 if (out != null && out.getBufferSize() != 0)
75 out.clearBuffer();
76 if (pageContext != null) pageContext.handlePageException(t);
77 }
78 } finally {
79 if (_jspxFactory != null)
_jspxFactory.releasePageContext(pageContext);
80 }
81 }
82 }
Everything so far looks good, but the map of JSP line numbers
to Java line numbers returned from the JVM looks like this:
{62=[268], 79=[400], 43=[89], 48=[154],
59=[227], 32=[23], 34=[35], 73=[360],
70=[337], 60=[236], 61=[261], 68=[323],
75=[377], 63=[277], 66=[309], 81=[422],
27=[17], 64=[302], 28=[20], 38=[64],
57=[220], 37=[57], 51=[175], 23=[5],
40=[78], 72=[350], 49=[161], 54=[199],
71=[344], 22=[2], 53=[192], 21=[0],
33=[27], 78=[394], 52=[182], 24=[8],
42=[82], 36=[50], 26=[14], 55=[206],
50=[168], 67=[316], 39=[71], 76=[382],
45=[96], 74=[364], 46=[104], 25=[11],
56=[213], 69=[330]}
This mapping obviously isn't correct since neither file is over 82 lines in
length, line 18 has no entry at all, and it has nothing in common with the SMAP.
According to the JSP 2.0 specification, full JSR-45 compliance is required when
running on J2SE 1.4, and this does not appear to be the case. Again, all this
code is working flawlessly with the JSR-045 implementation in WebLogic 7 & 8.
I'll be glad to provide additional details, if needed, to help address this
issue.
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org