The following is a direct copy of a question at SO which has been repeated
here for completeness but can be found here with nice syntax highlighting :
http://stackoverflow.com/questions/18650377/understanding-struts2-internals-result-configuration
In an effort to understand how struts2 loads its configuration I wanted to
display the path to the JSP which would be rendered. Given the following
very minimal struts.xml:
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />
<package name="base" namespace="/">
<result-types>
<result-type name="dispatcher"
class="org.apache.struts2.dispatcher.ServletDispatcherResult"
default="true"/>
</result-types>
<action name="test" class="com.kenmcwilliams.badwebapp.action.Test">
<result>/WEB-INF/content/test.jsp</result>
</action>
</package>
</struts>
I want to be able to log "/WEB-INF/content/test.jsp" from within the
action. Given the following action:
package com.quaternion.badwebapp.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.PreResultListener;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Test extends ActionSupport {
//used for a sanity test on JSP
public String getMessage() {
return "From test";
}
@Override
public String execute() throws Exception {
System.out.println("ActionContext.getContext().getActionInvocation().getResultCode():
" + ActionContext.getContext().getActionInvocation().getResultCode());
ActionInvocation ai = ActionContext.getContext().getActionInvocation();
ai.addPreResultListener(new PreResultListener() {
@Override
public void beforeResult(ActionInvocation invocation,
String resultCode) {
try {
System.out.println("PreResultListener resultCode:
" + resultCode);
System.out.println("PreResultListener result: " +
invocation.getResult());
} catch (Exception ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
return SUCCESS;
}
}
There are three print statements which produce the following output on my
console:
INFO: ActionContext.getContext().getActionInvocation().getResultCode(): null
INFO: PreResultListener resultCode: success
INFO: PreResultListener result: null
>From testing both the result "invocation.getResult()" and the resultcode is
null *before* the PreResultListener is called but *within* the
PreResultListener the resultcode is set, yet the result still returns null!
>From the JavaDoc of the getResult() method:
If the ActionInvocation has been executed before and the Result is an
instance of {@link ActionChainResult}, this method will walk down the chain
of ActionChainResult's until it finds a non-chain result, which will be
returned. *If the ActionInvocation's result has not been executed before,
the Result instance will be created and populated with the result params.*
Seems pretty clear that a result instance is *not* being created.
So how do I display "/WEB-INF/content/test.jsp" within this action? This is
not for typical struts2 use, I'm want to test a configuration provider for
which there is something wrong with the construction of the result for the
action, hopefully understanding why this isn't working will let me fix that
too.