Aby zrozumieć, w jaki sposób struts2 ładuje swoją konfigurację, chciałbym wyświetlić ścieżkę do strony JSP, która byłaby renderowana. Biorąc pod uwagę następujące bardzo minimalny struts.xml:Opis wewnętrznych elementów Struts2: Konfiguracja wyników
<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>
Chcę być w stanie zalogować się „/WEB-INF/content/test.jsp” od wewnątrz działania. Biorąc pod uwagę następujące działania:
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;
}
}
Istnieją trzy oświadczenia drukowania, które produkują następujące dane wyjściowe na mojej konsoli:
INFO: ActionContext.getContext().getActionInvocation().getResultCode(): null
INFO: PreResultListener resultCode: success
INFO: PreResultListener result: null
Od testowania zarówno „invocation.getResult()” wynik i ResultCode jest null przed PreResultListener jest wywoływany, ale w ciągu PreResultListener kod wyniku jest ustawiony, ale wynik nadal zwraca wartość null!
Z JavaDoc z getResult() metoda:
Jeśli ActionInvocation zostało wykonane przed i wynik jest instancją {@link ActionChainResult}, metoda ta będzie schodzić z łańcucha ActionChainResult, dopóki nie znajdzie wyniku niezwiązanego, który zostanie zwrócony. Jeśli wynik ActionInvocation nie został wcześniej wykonany, instancja wyniku zostanie utworzona i zapełni się parametrami wyników w postaci .
wydaje się dość oczywiste, że instancja wynik jest nie tworzone.
Jak wyświetlić "/WEB-INF/content/test.jsp" w ramach tej akcji? Nie jest to typowe użycie struts2, chcę przetestować dostawcę konfiguracji, dla którego jest coś nie tak z budową wyniku działania, mam nadzieję, że zrozumienie, dlaczego to nie działa, pozwoli mi to naprawić.
Czy masz ten projekt testowy jako SSCCE? +1, to jest interesujące –
Jeśli wyślesz mi e-mail (powinien być na moim profilu, użyj adresu gmail) Wyślę ci kopię. – Quaternion
'ActionInvocatio # getResult' ma wartość null, ponieważ akcja zwróciła" sukces "zamiast instancji wyniku, a następnie nie ma wartości zerowej. Wiem, że nie jest to udokumentowane, ale działania mogą zwrócić wynik bezpośrednio ;-) –