struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ken McWilliams <ken.mcwilli...@gmail.com>
Subject Understanding Struts2 Internals : Result Configuration
Date Fri, 06 Sep 2013 05:46:19 GMT
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.

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message