Cannot create nested Struts 2 components using JSP templates.
--------------------------------------------------------------
Key: WW-3093
URL: https://issues.apache.org/struts/browse/WW-3093
Project: Struts 2
Issue Type: Bug
Affects Versions: 2.1.6
Environment: Windows XP, Java 1.6.0_07, Tomcat 6.0.18
Reporter: Lucian Furtos
The page contex is cleared after the body of the parent tag is rendered but is
not replaced with the initial page context when the rendering returns to the
parent tag.
Details:
Struts is configured to use JSP templates:
<constant name="struts.ui.templateSuffix" value="jsp"/>
We create an action and a tiles result for this action that takes us to a JSP
file which contains the struts tags which use JSP templates.
the JSP page contains the following snippet:
<s:component theme="myJspTheme" template="components/box"
cssStyle="background-color:aqua;">
<s:param name="content">
<s:textfield theme="myJspTheme" name="name" label="Name"/>
<s:textfield theme="myJspTheme" name="password" label="Password"/>
</s:param>
</s:component>
The template of the box component is (/template/myJspTheme/components/box.jsp):
<div id="<s:property value="%{parameters.id}"/>" class="<s:property
value="%{parameters.cssClass}"/>" style="<s:property
value="%{parameters.cssStyle}"/>">
<s:property value="%{parameters.content}" escape="false"/>
</div>
The error is:
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.struts2.components.Include.include(Include.java:245)
at
org.apache.struts2.components.template.JspTemplateEngine.renderTemplate(JspTemplateEngine.java:58)
at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
at org.apache.struts2.components.UIBean.end(UIBean.java:513)
at
org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
at
org.apache.jsp.test_jsp._jspx_meth_s_005fcomponent_005f0(test_jsp.java:124)
at org.apache.jsp.test_jsp._jspService(test_jsp.java:73)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
...
This is thrown because the page context doesn't contain a request, response or
session anymore. The page context was cleared and returned to the pool but is
still referred by the ValueStack.
In the rendering process there are 2 instances of page context used: one for
the outer component and one for the inner component(s). Let's call them
outerPageContext and innerPageContext.
When rendering of the outer component starts the outerPageContext is created
and saved also in the struts value stack.
Next the rendering of the inner component starts and this results in the
creation of the innerPageContext instance. THis will replace the previous page
context in struts value stack.
When rendering of the inner text field is complete the innerPageContext is
released (by tomcat) that means that it's request/response members are cleared
and the instance itself is returned to the pool.
However the innerPageContext instance is still referred by the struts value
stack.
In the UIBean.end() processing of the outer component the pageContext instance
retrievied for rendering is no longer valid, and therefore the above error.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.