Hi,
I am experiencing a problem with recursivity in tag files in tomcat
6.0.14. I developed a simple tag file to show you the problem.
Here is my tag file:
<%@ tag body-content="empty" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@ attribute name="number" required="true" type="java.lang.Integer" %>
<c:choose>
<c:when test="${number==0 || number==1}">1</c:when>
<c:otherwise>${number}*<t:factorial number="${number-1}"/></c:otherwise>
</c:choose>
The tag file is pretty simple. When called from a jsp file, the tag
outputs how the factorial of any given number is calculated, but it
doen't actually calculate the factorial result. For example: if the
"number" paramenter is 5, the tag will output 5*4*3*2*1.
Here is the portion of the jsp file that calls the tag:
<c:if test="${! empty param.number}">
Result: <t:factorial number="${param.number}"/>
</c:if>
The problem is that nothing is displayed when the tag is called form
a jsp file. It happens as if the tag is not being called at all or as if
it is an empty tag file.
After some work I found out the problem. Jasper is not correctly
converting my recursive tag file to java code. The resulting java file
found in tomcat's work directory has an empty doTag method. Here is the
doTag method:
public void doTag() throws JspException, java.io.IOException {
}
I've checked all tomcat logs and couldn't find any jasper error message.
I've run the same web application in two different systems and the
problem only happens in system 2. Here is the configuration:
System 1 (development machine) (problem does not happen):
- OS: Windows XP sp2
- Hardware: AMD Athlon XP 2400+ (2.03 GHz) (1,5 GB RAM)
- Java (as stated by "java -version" command):
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode,
sharing)
- Tomcat version: 6.0.14 (.zip download package)
System 2 (production machine) (problem happens):
- OS: Ubuntu linux 7.10 (codename gutsy)
- Hardware: HP Tower Computer ProLiant ML350 G5, Intel(R)
Xeon(R) CPU 5120 @ 1.86GHz, 4 GB RAM
- Java (as stated by "java -version" command):
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode)
- Tomcat version: 6.0.14 (.tar.gz download package)
I am sending you my factorial example web application. The file is
recursive-tag.war. The application only has 2 files: index.jsp and
factorial.tag.
I am also sending you 2 jasper generated .java files extracted from
the tomcat work directory. "system1_factorial_tag.java" is generated in
the system 1 configuration and "system2_factorial_tag.java" is generated
in the system 2 configuration. Please, notice that the "doTag" method is
empty in "system2_factorial_tag.java".
Please, can anyone help me with this problem? Am I doing something
wrong?
Thank you very much.
Sincerely,
Jair Jr
package org.apache.jsp.tag.web;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class factorial_tag
extends javax.servlet.jsp.tagext.SimpleTagSupport
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private JspContext jspContext;
private java.io.Writer _jspx_sout;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fchoose;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fwhen_005ftest;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fotherwise;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public void setJspContext(JspContext ctx) {
super.setJspContext(ctx);
java.util.ArrayList _jspx_nested = null;
java.util.ArrayList _jspx_at_begin = null;
java.util.ArrayList _jspx_at_end = null;
this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx,
_jspx_nested, _jspx_at_begin, _jspx_at_end, null);
}
public JspContext getJspContext() {
return this.jspContext;
}
private java.lang.Integer number;
public java.lang.Integer getNumber() {
return this.number;
}
public void setNumber(java.lang.Integer number) {
this.number = number;
jspContext.setAttribute("number", number);
}
public Object getDependants() {
return _jspx_dependants;
}
private void _jspInit(ServletConfig config) {
_005fjspx_005ftagPool_005fc_005fchoose =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_005fjspx_005ftagPool_005fc_005fwhen_005ftest =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_005fjspx_005ftagPool_005fc_005fotherwise =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_el_expressionfactory =
_jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor)
config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
_005fjspx_005ftagPool_005fc_005fchoose.release();
_005fjspx_005ftagPool_005fc_005fwhen_005ftest.release();
_005fjspx_005ftagPool_005fc_005fotherwise.release();
}
public void doTag() throws JspException, java.io.IOException {
PageContext _jspx_page_context = (PageContext)jspContext;
HttpServletRequest request = (HttpServletRequest)
_jspx_page_context.getRequest();
HttpServletResponse response = (HttpServletResponse)
_jspx_page_context.getResponse();
HttpSession session = _jspx_page_context.getSession();
ServletContext application = _jspx_page_context.getServletContext();
ServletConfig config = _jspx_page_context.getServletConfig();
JspWriter out = jspContext.getOut();
_jspInit(config);
jspContext.getELContext().putContext(JspContext.class,jspContext);
if( getNumber() != null )
_jspx_page_context.setAttribute("number", getNumber());
try {
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
if (_jspx_meth_c_005fchoose_005f0(_jspx_page_context))
return;
} catch( Throwable t ) {
if( t instanceof SkipPageException )
throw (SkipPageException) t;
if( t instanceof java.io.IOException )
throw (java.io.IOException) t;
if( t instanceof IllegalStateException )
throw (IllegalStateException) t;
if( t instanceof JspException )
throw (JspException) t;
throw new JspException(t);
} finally {
jspContext.getELContext().putContext(JspContext.class,super.getJspContext());
((org.apache.jasper.runtime.JspContextWrapper)
jspContext).syncEndTagFile();
_jspDestroy();
}
}
private boolean _jspx_meth_c_005fchoose_005f0(PageContext _jspx_page_context)
throws Throwable {
JspWriter out = _jspx_page_context.getOut();
// c:choose
org.apache.taglibs.standard.tag.common.core.ChooseTag
_jspx_th_c_005fchoose_005f0 =
(org.apache.taglibs.standard.tag.common.core.ChooseTag)
_005fjspx_005ftagPool_005fc_005fchoose.get(org.apache.taglibs.standard.tag.common.core.ChooseTag.class);
_jspx_th_c_005fchoose_005f0.setPageContext(_jspx_page_context);
_jspx_th_c_005fchoose_005f0.setParent(new
javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) this
)); int _jspx_eval_c_005fchoose_005f0 =
_jspx_th_c_005fchoose_005f0.doStartTag();
if (_jspx_eval_c_005fchoose_005f0 !=
javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
do {
out.write('\r');
out.write('\n');
out.write(' ');
if (_jspx_meth_c_005fwhen_005f0(_jspx_th_c_005fchoose_005f0,
_jspx_page_context))
return true;
out.write('\r');
out.write('\n');
out.write(' ');
if (_jspx_meth_c_005fotherwise_005f0(_jspx_th_c_005fchoose_005f0,
_jspx_page_context))
return true;
out.write('\r');
out.write('\n');
int evalDoAfterBody = _jspx_th_c_005fchoose_005f0.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
}
if (_jspx_th_c_005fchoose_005f0.doEndTag() ==
javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
_005fjspx_005ftagPool_005fc_005fchoose.reuse(_jspx_th_c_005fchoose_005f0);
throw new SkipPageException();
}
_005fjspx_005ftagPool_005fc_005fchoose.reuse(_jspx_th_c_005fchoose_005f0);
return false;
}
private boolean _jspx_meth_c_005fwhen_005f0(javax.servlet.jsp.tagext.JspTag
_jspx_th_c_005fchoose_005f0, PageContext _jspx_page_context)
throws Throwable {
JspWriter out = _jspx_page_context.getOut();
// c:when
org.apache.taglibs.standard.tag.rt.core.WhenTag _jspx_th_c_005fwhen_005f0 =
(org.apache.taglibs.standard.tag.rt.core.WhenTag)
_005fjspx_005ftagPool_005fc_005fwhen_005ftest.get(org.apache.taglibs.standard.tag.rt.core.WhenTag.class);
_jspx_th_c_005fwhen_005f0.setPageContext(_jspx_page_context);
_jspx_th_c_005fwhen_005f0.setParent((javax.servlet.jsp.tagext.Tag)
_jspx_th_c_005fchoose_005f0);
// /WEB-INF/tags/factorial.tag(7,1) name = test type = boolean reqTime =
true required = true fragment = false deferredValue = false expectedTypeName =
null deferredMethod = false methodSignature = null
_jspx_th_c_005fwhen_005f0.setTest(((java.lang.Boolean)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number==0 ||
number==1}", java.lang.Boolean.class, (PageContext)this.getJspContext(), null,
false)).booleanValue());
int _jspx_eval_c_005fwhen_005f0 = _jspx_th_c_005fwhen_005f0.doStartTag();
if (_jspx_eval_c_005fwhen_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
do {
out.write('1');
int evalDoAfterBody = _jspx_th_c_005fwhen_005f0.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
}
if (_jspx_th_c_005fwhen_005f0.doEndTag() ==
javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
_005fjspx_005ftagPool_005fc_005fwhen_005ftest.reuse(_jspx_th_c_005fwhen_005f0);
throw new SkipPageException();
}
_005fjspx_005ftagPool_005fc_005fwhen_005ftest.reuse(_jspx_th_c_005fwhen_005f0);
return false;
}
private boolean
_jspx_meth_c_005fotherwise_005f0(javax.servlet.jsp.tagext.JspTag
_jspx_th_c_005fchoose_005f0, PageContext _jspx_page_context)
throws Throwable {
JspWriter out = _jspx_page_context.getOut();
// c:otherwise
org.apache.taglibs.standard.tag.common.core.OtherwiseTag
_jspx_th_c_005fotherwise_005f0 =
(org.apache.taglibs.standard.tag.common.core.OtherwiseTag)
_005fjspx_005ftagPool_005fc_005fotherwise.get(org.apache.taglibs.standard.tag.common.core.OtherwiseTag.class);
_jspx_th_c_005fotherwise_005f0.setPageContext(_jspx_page_context);
_jspx_th_c_005fotherwise_005f0.setParent((javax.servlet.jsp.tagext.Tag)
_jspx_th_c_005fchoose_005f0);
int _jspx_eval_c_005fotherwise_005f0 =
_jspx_th_c_005fotherwise_005f0.doStartTag();
if (_jspx_eval_c_005fotherwise_005f0 !=
javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
do {
out.write((java.lang.String)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number}",
java.lang.String.class, (PageContext)this.getJspContext(), null, false));
out.write('*');
if (_jspx_meth_t_005ffactorial_005f0(_jspx_th_c_005fotherwise_005f0,
_jspx_page_context))
return true;
int evalDoAfterBody = _jspx_th_c_005fotherwise_005f0.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
}
if (_jspx_th_c_005fotherwise_005f0.doEndTag() ==
javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
_005fjspx_005ftagPool_005fc_005fotherwise.reuse(_jspx_th_c_005fotherwise_005f0);
throw new SkipPageException();
}
_005fjspx_005ftagPool_005fc_005fotherwise.reuse(_jspx_th_c_005fotherwise_005f0);
return false;
}
private boolean
_jspx_meth_t_005ffactorial_005f0(javax.servlet.jsp.tagext.JspTag
_jspx_th_c_005fotherwise_005f0, PageContext _jspx_page_context)
throws Throwable {
JspWriter out = _jspx_page_context.getOut();
// t:factorial
org.apache.jsp.tag.web.factorial_tag _jspx_th_t_005ffactorial_005f0 = new
org.apache.jsp.tag.web.factorial_tag();
org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor,
_jspx_th_t_005ffactorial_005f0);
_jspx_th_t_005ffactorial_005f0.setJspContext(_jspx_page_context);
_jspx_th_t_005ffactorial_005f0.setParent(_jspx_th_c_005fotherwise_005f0);
// /WEB-INF/tags/factorial.tag(8,24) name = number type = java.lang.Integer
reqTime = true required = true fragment = false deferredValue = false
expectedTypeName = java.lang.String deferredMethod = false methodSignature =
null
_jspx_th_t_005ffactorial_005f0.setNumber((java.lang.Integer)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number-1}",
java.lang.Integer.class, (PageContext)this.getJspContext(), null, false));
_jspx_th_t_005ffactorial_005f0.doTag();
org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor,
_jspx_th_t_005ffactorial_005f0);
return false;
}
}
package org.apache.jsp.tag.web;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class factorial_tag
extends javax.servlet.jsp.tagext.SimpleTagSupport
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private JspContext jspContext;
private java.io.Writer _jspx_sout;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fchoose;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fwhen_005ftest;
private org.apache.jasper.runtime.TagHandlerPool
_005fjspx_005ftagPool_005fc_005fotherwise;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public void setJspContext(JspContext ctx) {
super.setJspContext(ctx);
java.util.ArrayList _jspx_nested = null;
java.util.ArrayList _jspx_at_begin = null;
java.util.ArrayList _jspx_at_end = null;
this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx,
_jspx_nested, _jspx_at_begin, _jspx_at_end, null);
}
public JspContext getJspContext() {
return this.jspContext;
}
private java.lang.Integer number;
public java.lang.Integer getNumber() {
return this.number;
}
public void setNumber(java.lang.Integer number) {
this.number = number;
jspContext.setAttribute("number", number);
}
public Object getDependants() {
return _jspx_dependants;
}
private void _jspInit(ServletConfig config) {
_005fjspx_005ftagPool_005fc_005fchoose =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_005fjspx_005ftagPool_005fc_005fwhen_005ftest =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_005fjspx_005ftagPool_005fc_005fotherwise =
org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config);
_el_expressionfactory =
_jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor)
config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
_005fjspx_005ftagPool_005fc_005fchoose.release();
_005fjspx_005ftagPool_005fc_005fwhen_005ftest.release();
_005fjspx_005ftagPool_005fc_005fotherwise.release();
}
public void doTag() throws JspException, java.io.IOException {
}
}
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]