Мое решение будет включать один интерфейс и один перехватчик. Вы реализуете следующий интерфейс для всех действий , к которым вы, вероятно, захотите перенаправить:
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
, перенаправьте, как объяснил Винсент Рамдани:
<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 могут отличаться в этом ...).