源码解析:继承于ServletRedirectResult 结果类型
public class ServletActionRedirectResult extends ServletRedirectResult implements ReflectionExceptionHandler {
public static final String DEFAULT_PARAM = "actionName";
//这是多出的参数在配置文件中
protected String actionName;
protected String namespace;
protected String method;
public void execute(ActionInvocation invocation) throws Exception {
actionName = conditionalParse(actionName , invocation);
if (namespace == null) {
namespace = invocation.getProxy().getNamespace();
} else {
namespace = conditionalParse(namespace , invocation);
}
if (method == null) {
method = "";
} else {
method = conditionalParse( method, invocation);
}
String tmpLocation = actionMapper.getUriFromActionMapping(new ActionMapping(actionName, namespace , method , null));
setLocation(tmpLocation);
super.execute(invocation);
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public void setMethod(String method) {
this.method = method;
}
}
结果类型: chain
chain 结果类型的基本用途是构成一个 action 链: 前一个 action 把控制权转发给后一个 action, 而前一个 action 的状态在后一个 action 中依然保持
chain 结果类型接受下面这些参数:
actionName: 指定目标 action 的名字. 它是默认属性
namespace: 用来指定 “目的地” action 的命名空间. 如果没有配置该参数, Struts 会把当前 action 所在的命名空间作为 “目的地” 的命名空间
method: 指定目标 action 方法. 默认值为 execute
源码解析:
public class ActionChainResult implements Result {
public static final String DEFAULT_PARAM = "actionName";
private static final String CHAIN_HISTORY = "CHAIN_HISTORY";
public static final String SKIP_ACTIONS_PARAM = "skipActions";
private ActionProxy proxy;
private String actionName;
private String namespace;
private String methodName;
public void setActionName(String actionName) {
this.actionName = actionName;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public void setSkipActions(String actions) {
this.skipActions = actions;
}
public void setMethod(String method) {
this.methodName = method;
}
public void execute(ActionInvocation invocation) throws Exception {
proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext);
proxy.execute();
}
private String makeKey(String namespace, String actionName, String methodName) {
if (null == methodName) {
return namespace + "/" + actionName;
}
return namespace + "/" + actionName + "!" + methodName;
}
}
实现的简单过程图:举例