2008-09-05 9 views
2

J'utilise Struts 2.Struts 2: retour à la page d'appel

J'aimerais revenir d'une Action à la page qui l'a appelée.

Dites que je suis dans la page x.jsp, j'appelle Action Visual pour modifier les préférences CSS dans la session; Je veux revenir à x.jsp plutôt que vers une page fixe (c.-à-de home.jsp)

Voici le fragment struts.xml concerné:

 
<action 
    name="Visual" 
    class="it.___.web.actions.VisualizationAction"> 
    <result name="home">/pages/home.jsp</result> 
</action> 

Bien sûr mon VisualizationAction.execute() renvoie la maison.

Y a-t-il une constante "magique" (comme, par exemple, INPUT_PAGE) que je peux retourner faire l'affaire? Dois-je utiliser une méthode plus complexe (c'est-à-dire extraire la page de requête et la transférer)?

T.I.A.

Répondre

3

Vous pouvez utiliser un résultat dynamique dans struts.xml. Par exemple:

<action 
    name="Visual" 
    class="it.___.web.actions.VisualizationAction"> 
    <result name="next">${next}</result> 
</action> 

Puis dans votre action, vous créez un champ appelé suivant. Donc, pour invoquer l'action, vous passerez le nom de la page que vous souhaitez transférer à la suivante. L'action retourne ensuite "next" et les Struts sauront à quelle page aller.

Il y a une plus belle explication sur ce post: Stack Overflow

1
return INPUT; 

fera l'affaire. La constante INPUT est définie dans l'interface Action elle-même. Cela indique que l'action nécessite plus de données. En appelant la page si vous vouliez dire la page qui vous a conduit à la page d'entrée d'action, votre page d'entrée devra stocker l'en-tête HTTP "Referer" dans la portée de la requête pour l'action.

+0

Merci pour votre réponse aimable (et rapide), nikhilbelsare.
J'ai essayé return INPUT; mais j'ai reçu un message d'erreur **No result defined for action it.___.web.actions.VisualizationAction and result input**
(à peu près attendu parce que je n'ai pas défini "entrée" n'importe où dans mon struts.xml). Ce que je voulais vraiment faire était de Struts 2 pour identifier automagiquement la page de renvoi et me la transmettre, puisque l'action est invoquée à partir de nombreuses pages différentes, et je n'ai aucun moyen de prédire l'INPUT.
Je suppose que je suis coincé avec l'analyse de l'en-tête ... –

+0

Alternativement, vous pouvez inclure un champ caché dans chacune de vos pages qui indique à quelle page rediriger vers. De cette façon, vous pouvez obtenir un contrôle plus fin sur les choses. – nikhilbelsare

0

Je préfère la façon lorsque vous naviguer les utilisateurs par des actions particulières.

http://domain.com/myAction.action

Vous pouvez utiliser un paramètre comme indicateur, que vous voulez changer la conception actuelle: -à-dire

http://domain.com/myAction.action?changeDesign=silver_theme

Alors, vous écrivez des entretoises 2 intercepteurs, dont la logique est de vérifiez la présence d'un tel paramètre 'changeDesign', et cet intercepteur fera le travail de changement de conception et contrôlera le workflow. Avec l'intercepteur, vous découplerez vos actions de la logique transversale.

1

Ma solution impliquerait une interface et un intercepteur.Vous implémentez l'interface suivante pour toutes les actions auquel vous êtes susceptible de vouloir rediriger:

public interface TargetAware { 
    public String getTarget(); 
    public void setTarget(String target); 
} 

L'intercepteur assure simplement que l'objectif est fixé, le cas échéant:

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 là , une fois que ces deux bits sont en place et que vos actions implémentent l'interface TargetAware (si vous pensez devoir les rediriger), vous avez accès à un paramètre dans vos JSP lorsque vous en avez besoin. Passer ce paramètre à votre VisualizationAction (qui pourrait ainsi mettre en œuvre également l'interface TargetAware!), Et SUCCESS, redirigez comme l'a expliqué 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> 

Je ne cherchais pas tous les détails de cette stratégie. En particulier, méfiez-vous de la notation entourant le type de résultat redirect (en fonction de votre version spécifique de Struts2: 2.0.x et 2.1.x peuvent différer à ce sujet ...).

0

ok, dans votre classe, il .___ web.actions.VisualizationAction, vous devez retourner une valeur de chaîne contenant INPUT, puis, sur struts.xml vous devez définir quelque chose comme ceci:.

<action name="Visual" class="it.___.web.actions.VisualizationAction"> 
    <result name="input">yourJspPage.jsp</result> 
</action> 

cette vous mènera à la page que vous voulez. Cela devrait fonctionner, j'ai travaillé sur struts2 le long de 2 mois

+0

Ce n'est pas ce que l'utilisateur demande. Il veut changer dynamiquement votre fichier JspPage.jsp en fonction de la page d'appel – user1884155

Questions connexes