This is an evil error but it's not really Struts' fault. Basically the error
is the fact that a compiled JSP (servlet really) can't have a single method
greater then 64k - but with all those tags being compiled in directly the
size grows pretty large.  I asked this a while back and Martin Cooper was
kind enough to help - his explanation is below. 

Note that with Struts 1.0 to solve this all you need to do is pull out a few
html:input, etc. fields and include them using jsp:include - you're problem
will be solved. :)

-Chris

---- From Martin Coooper ----
I am, unfortunately, intimately familiar with this problem.

The problem is that there is a limit on the size of a compiled method in a 
Java class file, and that limit is what we're running up against. Recall 
that a JSP page is compiled into a servlet, and into essentially only one 
method in that servlet. Hence, if your page contains many, many tags, that 
method becomes too big, and up comes the exception that you're seeing.

There are a couple of (partial) solutions.

1) Break your giant page up into multiple smaller pages and bring them 
together at run time using <jsp:include>. Note that <%@include> won't work, 
because that's a compile-time include, which will get you straight back to 
the original problem.

2) Look for places to save on tags. For example, the <html:option> tag was 
recently extended to allow the specification of the text to display, so 
that you can replace this:

<html:option ... ><bean:message key="foo"/></html:option>

with this:

<html:option ... key="foo"/>

If you have a lot of cases of this pattern, it can help quite a bit. In 
addition to the <html:option> tag, some other Struts tags allow the same 
shortcut to including the text. Also, you might consider replacing 
<html:option> sequences with <html:options> if you can build an appropriate 
collection up front.

Unfortunately, we can't use solution (1), because our giant page is almost 
entirely one <html:form>. (Please don't ask... :-} ) Many of the <html:*> 
tags won't work if they are on a separate page from the <html:form> tag 
itself. That means I've spent quite some time on option (2).

We have several of our own tags, too, so that was the next place for me to 
look. I discovered that changing some frequently used tags from extending 
BodyTagSupport to extending TagSupport, and marking them with 
<bodycontent>empty</bodycontent> in the .tld file, made a significant 
reduction in generated code size. Of course, this is not always feasible, 
but it helped us quite a bit.

One other trick is to create custom tags for frequently used groups of 
related elements. For example, I created a simple DatePickerTag which is a 
Struts-like tag that combines three drop-down boxes for month, day and 
year, with the localized strings obtained from the JVM, and the current 
values pulled from a bean.

That's about all I can think of that I've tried so far. All our pages are 
now within the limit, but one is very close to breaking it. I really want 
to put a "do not touch" notice on that file!

Hope this helps.

--
Martin Cooper


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, July 31, 2001 9:16 AM
To: [EMAIL PROTECTED]
Subject: Branch too large, Internal restriction. (?!)



Having *a lot* of input fields (50+ hidden and non-) on my JSP appearently
results in the exception below. Has anyone seen this one before? Is this
due to WebSphere's outdated version of Jasper? At first I thought it was a
limitation in the WTE only but WAS 3.5.3 throws the same exception.

regards,
S. Bro


----------------------------------------------------------------------------
--------
org.apache.jasper.JasperException: C:\Program Files\IBM\VisualAge for
Java\ide\project_resources\IBM WebSphere Test
Environment\temp\JSP1_1\mywebapp\_persinfo_xjsp.java:19: Branch is too
large, Internal restriction.
public class _persinfo_xjsp extends HttpJspBase {
             ^
1 error

           java.lang.Throwable(java.lang.String)
           java.lang.Exception(java.lang.String)
           javax.servlet.ServletException(java.lang.String)
           org.apache.jasper.JasperException(java.lang.String)
           boolean
com.ibm.ivj.jsp.jasper.compiler.JspDebugPageCompiler.javaToClass(java.lang.S
tring,

java.lang.String, java.io.ByteArrayOutputStream, boolean)
           boolean org.apache.jasper.compiler.Compiler.compile()
           boolean
com.ibm.ivj.jsp.jasper.runtime.JspDebugServlet.compile(org.apache.jasper.com
piler.Compiler,

java.lang.Class)
           boolean
com.ibm.ivj.jsp.jasper.runtime.JspDebugServlet.loadJSP(java.lang.String,
java.lang.String, boolean, javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse)
           void
org.apache.jasper.runtime.JspServlet$JspServletWrapper.loadIfNecessary(javax
.servlet.http.HttpServletRequest,

javax.servlet.http.HttpServletResponse)
           void
org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(javax.servlet
.http.HttpServletRequest,

javax.servlet.http.HttpServletResponse, boolean)
           void
org.apache.jasper.runtime.JspServlet.serviceJspFile(javax.servlet.http.HttpS
ervletRequest,

javax.servlet.http.HttpServletResponse, java.lang.String,
java.lang.Throwable, boolean)
           void
org.apache.jasper.runtime.JspServlet.service(javax.servlet.http.HttpServletR
equest,

javax.servlet.http.HttpServletResponse)
           void
javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest,
javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.StrictServletInstance.doService(javax.servlet.
ServletRequest,

javax.servlet.ServletResponse)
           void com.ibm.servlet.engine.webapp.StrictLifecycleServlet.
_service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.IdleServletState.service(com.ibm.servlet.engin
e.webapp.StrictLifecycleServlet,

javax.servlet.ServletRequest, javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(javax.servlet.S
ervletRequest,

javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.ServletInstance.service(javax.servlet.ServletR
equest,

javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(com.ibm.se
rvlet.engine.webapp.ServletInstanceReference,

javax.servlet.ServletRequest, javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.ServletInstanceReference.dispatch(javax.servle
t.ServletRequest,

javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.handleWebAppDispatch(c
om.ibm.servlet.engine.webapp.WebAppRequest,

javax.servlet.http.HttpServletResponse, boolean)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.dispatch(javax.servlet
.ServletRequest,

javax.servlet.ServletResponse, boolean)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.forward(javax.servlet.
ServletRequest,

javax.servlet.ServletResponse)
           void
org.apache.struts.action.ActionServlet.processActionForward(org.apache.strut
s.action.ActionForward,

org.apache.struts.action.ActionMapping,
org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse)
           void
org.apache.struts.action.ActionServlet.process(javax.servlet.http.HttpServle
tRequest,

javax.servlet.http.HttpServletResponse)
           void
org.apache.struts.action.ActionServlet.doGet(javax.servlet.http.HttpServletR
equest,

javax.servlet.http.HttpServletResponse)
           void
javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest
,

javax.servlet.http.HttpServletResponse)
           void
javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest,
javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.StrictServletInstance.doService(javax.servlet.
ServletRequest,

javax.servlet.ServletResponse)
           void com.ibm.servlet.engine.webapp.StrictLifecycleServlet.
_service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.IdleServletState.service(com.ibm.servlet.engin
e.webapp.StrictLifecycleServlet,

javax.servlet.ServletRequest, javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(javax.servlet.S
ervletRequest,

javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.webapp.ServletInstance.service(javax.servlet.ServletR
equest,

javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(com.ibm.se
rvlet.engine.webapp.ServletInstanceReference,

javax.servlet.ServletRequest, javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.ServletInstanceReference.dispatch(javax.servle
t.ServletRequest,

javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.handleWebAppDispatch(c
om.ibm.servlet.engine.webapp.WebAppRequest,

javax.servlet.http.HttpServletResponse, boolean)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.dispatch(javax.servlet
.ServletRequest,

javax.servlet.ServletResponse, boolean)
           void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.forward(javax.servlet.
ServletRequest,

javax.servlet.ServletResponse)
           void
com.ibm.servlet.engine.srt.WebAppInvoker.handleInvocationHook(java.lang.Obje
ct)

           void
com.ibm.servlet.engine.invocation.CachedInvocation.handleInvocation(java.lan
g.Object)

           void
com.ibm.servlet.engine.srp.ServletRequestProcessor.dispatchByURI(java.lang.S
tring,

com.ibm.servlet.engine.srp.ISRPConnection)
           void
com.ibm.servlet.engine.oselistener.OSEListenerDispatcher.service(com.ibm.ser
vlet.engine.oselistener.api.IOSEConnection)

           void
com.ibm.servlet.engine.http_transport.HttpTransportHandler.handleConnection(
java.net.Socket)

           void
com.ibm.servlet.engine.http_transport.HttpTransportHandler.run()
           void java.lang.Thread.run()


Reply via email to