[S2-ActionComponent] Action not on the stack while evaluating body
------------------------------------------------------------------
Key: WW-2724
URL: https://issues.apache.org/struts/browse/WW-2724
Project: Struts 2
Issue Type: Bug
Components: Other
Affects Versions: 2.1.1
Environment: weblogic10.0, windows XP
Reporter: kris beaumont
as advised in the mailing list, I create a BUG request for this...
http://www.nabble.com/-S2-ActionComponent--Action-not-on-the-stack-while-evaluating-body-td18502819.html
I think I found a problem in struts 2.1.1 (or misunderstood the documentation).
I have an action that can search for persons (querystring for name, list of
persons retreived).
I wanted to reuse that functionality for a form where a user has to be picked
(to be added to a group of users).
So I did this:
[code]
<div>
<span>choose a person: </span>
<s:action name="viewUsers" namespace="/security/users"
executeResult="false" var="usersAction">
<div class="searchForm">
<s:text name="search.query"/>
<s:form action="addUser" id="searchForm"
namespace="/ref/groups">
<s:textfield name="queryString"
value="%{#attr[usersAction].queryString}" label="search.query"
labelposition="left" labelSeparator=":"/>
<s:submit value="OK"/>
</s:form>
</div>
<s:hidden name="groupId" />
.... More code with display tag table and some buttons etc....
</s:action>
</div>
[/code]
%{#attr[usersAction].queryString} and other variations never got evaluated, and
when I debug the textcomponent I can't find the usersAction on the valuestack...
I think it's because of a bug in ActionComponent that only executes the action
in the 'end' method so it's not yet on the stack when the body is evaluated.
More specific details:
This is componentTagSupport:
[code]
public int doStartTag() throws JspException {
component = getBean(getStack(), (HttpServletRequest)
pageContext.getRequest(), (HttpServletResponse) pageContext.getResponse());
Container container = Dispatcher.getInstance().getContainer();
container.inject(component);
populateParams();
boolean evalBody = component.start(pageContext.getOut());
if (evalBody) {
return component.usesBody() ? EVAL_BODY_BUFFERED :
EVAL_BODY_INCLUDE;
} else {
return SKIP_BODY;
}
}
[/code]
That returns EVAL_BODY_INCLUDE, so it'll evaluate the body, but the action is
not yet on the stack
While the ActionComponent does
[code]
public boolean end(Writer writer, String body) {
boolean end = super.end(writer, "", false);
try {
if (flush) {
try {
writer.flush();
} catch (IOException e) {
LOG.warn("error while trying to flush writer ", e);
}
}
executeAction();
if ((getVar() != null) && (proxy != null)) {
getStack().setValue("#attr['" + getVar() + "']",
proxy.getAction());
}
} finally {
popComponentStack();
}
return end;
}
[/code]
So the action is executed and then again removed from the stack
(popComponentStack) before it can be used in the body ...
While this is in the docs (http://struts.apache.org/2.0.11.2/docs/action.html ):
[quote]
This tag enables developers to call actions directly from a JSP page by
specifying the action name and an optional namespace. The body content of the
tag is used to render the results from the Action. Any result processor defined
for this action in struts.xml will be ignored, unless the executeResult
parameter is specified.
Parameters can be passed to the action using nested param
<http://struts.apache.org/2.0.11.2/docs/param.html> tags.
[/quote]
So I think the pop thing should happen in the end, but the executeAction should
happen in the '"start" method.
Unless I'm making a huge thinking-error (meaning I need a vacation, which my
boss will certainly contend :))
Thanks already for reading!
Kris
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.