Trong một nỗ lực để hiểu cách struts2 tải cấu hình của nó, tôi muốn hiển thị đường dẫn đến JSP sẽ được hiển thị. Với tệp struts.xml rất tối thiểu sau:Hiểu nội bộ của Struts2: Cấu hình kết quả
<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>
Tôi muốn có thể đăng nhập "/WEB-INF/content/test.jsp" từ bên trong hành động. Căn cứ vào hành động sau đây:
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;
}
}
Có ba báo cáo in mà cho kết quả sau trên giao diện điều khiển của tôi:
INFO: ActionContext.getContext().getActionInvocation().getResultCode(): null
INFO: PreResultListener resultCode: success
INFO: PreResultListener result: null
Từ thử nghiệm cả hai kết quả "invocation.getResult()" và resultcode là null trước PreResultListener được gọi nhưng trong số PreResultListener mã kết quả được đặt, nhưng kết quả vẫn trả về giá trị rỗng!
Từ javadoc của getResult() phương pháp:
Nếu ActionInvocation đã được thực hiện trước và kết quả là một thể hiện của {@link ActionChainResult}, phương pháp này sẽ đi bộ xuống các chuỗi của ActionChainResult cho đến khi nó tìm thấy kết quả không phải là chuỗi, trong đó sẽ được trả lại. Nếu kết quả của ActionInvocation chưa được thực hiện trước đó, cá thể Kết quả sẽ được tạo và điền với thông số kết quả.
Có vẻ khá rõ ràng rằng bản sao kết quả là không phải là đang được tạo.
Vậy làm cách nào để hiển thị "/WEB-INF/content/test.jsp" trong hành động này? Đây không phải là để sử dụng struts2 điển hình, tôi muốn thử nghiệm một nhà cung cấp cấu hình mà có điều gì đó sai trái với việc xây dựng kết quả cho hành động, hy vọng hiểu tại sao điều này không hoạt động sẽ cho phép tôi khắc phục điều đó.
Bạn có dự án thử nghiệm này là SSCCE không? 1, điều thú vị là –
Nếu bạn gửi email cho tôi (phải ở trong tiểu sử của tôi, hãy sử dụng gmail) Tôi sẽ gửi cho bạn một bản sao. – Quaternion
'ActionInvocatio # getResult' là null bởi vì hành động trả về" thành công "thay vì instance của Result và sau đó không có null. Tôi biết, nó không phải là tài liệu nhưng hành động có thể trả lại kết quả trực tiếp ;-) –