我的解决方案将涉及一个接口和一个拦截器。您为可能要重定向到的所有操作实现以下接口:
public interface TargetAware {
public String getTarget();
public void setTarget(String target);
}
如果需要,拦截器只是确保设置目标:
public class SetTargetInterceptor extends MethodFilterInterceptor implements Interceptor {
public String doIntercept(ActionInvocation invocation) {
Object action = invocation.getAction();
HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
if (action instanceof TargetAware) {
TargetAware targetAwareAction = (TargetAware) action;
if (targetAwareAction.getTarget() == null)
targetAwareAction.setTarget(getCurrentUri(request));
}
return invocation.invoke();
}
// I'm sure we can find a better implementation of this...
private static String getCurrentUri(HttpServletRequest request) {
String uri = request.getRequestURI();
String queryString = request.getQueryString();
if (queryString != null && !queryString.equals(""))
uri += "?" + queryString;
return uri;
}
public void init() { /* do nothing */ }
public void destroy() { /* do nothing */ }
}
从那时起,一旦这两个位就位并且您的操作实现了TargetAware
接口(如果您希望必须重定向到它们),那么您可以target
在需要时访问 JSP 中的参数。将该参数传递给您的VisualizationAction
(也可以实现TargetAware
接口!),然后SUCCESS
按照文森特·拉姆达尼(Vincent Ramdhanie)的解释进行重定向:
<action name="Visual" class="it.___.web.actions.VisualizationAction">
<result type="redirect">
<param name="location">${target}</param>
<param name="parse">true</param>
</result>
</action>
我没有尝试这个策略的每一个细节。特别要注意redirect
结果类型周围的符号(取决于您的 Struts2 的特定版本:2.0.x 和 2.1.x 可能会有所不同...)。