Struts 2:volver a página de llamada
Pregunta
Estoy usando Struts 2.
Me gustaría volver a partir de una Acción a la página que la invocó.
Decir que estoy en la página x.jsp, Invoco la acción Visual para cambiar CSS preferencias en la sesión;Quiero volver a x.jsp en lugar de una página fijo (es decir, casa.jsp)
Aquí está la pertinente struts.xml fragmento:
<action name="Visual" class="it.___.web.actions.VisualizationAction"> <result name="home">/pages/home.jsp</result> </action>
Por supuesto, mi VisualizationAction.execute()
devuelve casa.
Hay alguna "magia" constante (como, por ejemplo, INPUT_PAGE) que puedo volver a hacer el truco?
Debo usar una mayor participación del método (es decir,la extracción de la página de solicitud y expedición de ella)?
T. I. A.
Solución
Puede utilizar una dinámica de resultados en struts.xml.Por ejemplo:
<action
name="Visual"
class="it.___.web.actions.VisualizationAction">
<result name="next">${next}</result>
</action>
A continuación, en su acción, se crea un campo denominado siguiente.Para invocar la acción que se pase el nombre de la página que desea con ansias el próximo.La acción, a continuación, devuelve "siguiente" y puntales se sabe que la página a la que acudir.
No hay una mejor explicación en este post: Desbordamiento De Pila
Otros consejos
return INPUT;
hará el truco.De ENTRADA constante se define en la Acción misma interfaz.Indica que la acción necesita más de entrada.
Llamando a la página si significaba la página a la que te llevó a la acción de entrada de la página, su página de entrada tendrán que almacenar encabezado HTTP "Referer" en el ámbito de petición para la Acción.
Mi solución implicaría una interfaz y un interceptor.Implementar la siguiente interfaz para todas las acciones para que usted probablemente desea redirigir:
public interface TargetAware {
public String getTarget();
public void setTarget(String target);
}
El interceptor simplemente asegura que el objetivo es establecer, si es necesario:
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 */ }
}
A partir de entonces, una vez que estos dos bits están en su lugar y sus acciones a implementar el TargetAware
interfaz (si usted espera tener para redirigir a ellos), entonces usted tiene acceso a una target
parámetro en el Jsp siempre que lo necesite.Pasar ese parámetro en el VisualizationAction
(que bien podría implementar también el TargetAware
interfaz!), y en SUCCESS
, redirigir como explica Vicente Ramdhanie:
<action name="Visual" class="it.___.web.actions.VisualizationAction">
<result type="redirect">
<param name="location">${target}</param>
<param name="parse">true</param>
</result>
</action>
Yo no intente cada uno de los detalles de esta estrategia.En particular, ten cuidado con la notación que rodea el redirect
tipo de resultado (dependiendo de la versión específica de Struts2:2.0.x y 2.1.x puede variar en esto...).
Yo prefiero la navegación de los usuarios por acciones particulares.
http://domain.com/myAction.action
Usted podría utilizar algún parámetro como indicador, que desea cambiar el diseño actual:es decir,
http://domain.com/myAction.action?changeDesign=silver_theme
Así que a continuación, escribir algunos de los struts 2 interceptor, que la lógica es la comprobación de la presencia de dicho parámetro 'changeDesign', y este interceptor hará así lo requiriesen labor de cambiar el diseño y el control de flujo de trabajo.Con interceptor que separar sus acciones transversales de la lógica.
ok, en tu clase.___.web.acciones.VisualizationAction, usted debe devolver un valor de cadena que contiene la ENTRADA, a continuación, en struts.xml usted tiene que establecer algo como esto:
<action name="Visual" class="it.___.web.actions.VisualizationAction">
<result name="input">yourJspPage.jsp</result>
</action>
esto te llevará a la página que desea.Esto debería funcionar, he estado trabajando en struts2 a lo largo de 2 meses