私のソリューションには、1 つのインターフェースと 1 つのインターセプターが含まれます。リダイレクトする可能性が高いすべてのアクションに対して、次のインターフェイスを実装します。
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 */ }
}
その後、これら 2 つのビットが配置され、アクションがTargetAware
インターフェースを実装すると (それらにリダイレクトする必要があると予想される場合)、target
必要なときにいつでも JSP 内のパラメーターにアクセスできます。そのパラメーターを your に渡します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 ではこれが異なる場合があります...)。