2014-06-16 2 views
2

J'ai une action de connexion qui après une exécution réussie redirige vers la page précédente (je stocke la page précédente dans ma session afin que je puisse la récupérer plus tard). En Struts2, je peux trouver deux façons de le faire cette redirection.Struts2 redirigeant vers une autre action avec un nombre inconnu de paramètres

<action name="login" class="com.myapp.login.Login"> 
     <result name="redirect" type="redirect">${previousAction.requestURL}</result> 
    </action> 

Dans cet exemple, la méthode getPreviousAction() getRequestURL() (ce qui est une méthode selfmade, sa non ntive à Struts2) sera invoquée et cela renvoie l'url de la page précédente comme prévu, par exemple:

somenamespace/index.action 

Il y a aussi un autre type de redirection:

<action name="login" class="com.myapp.login.Login"> 
    <result type="redirectAction"> 
     <param name="actionName">${previousAction.name}</param> 
     <param name="namespace">/${previousAction.namespace}</param> 
    </result> 
</action> 

Je veux utiliser ce résultat redirectaction tapez parce que c'est beaucoup plus propre. Mais, j'ai un problème lorsque les paramètres de requête font partie de l'URL. Par exemple:

somenamespace/index.action?name=john&age=50 

Je sais que je peux ajouter ces params dans mon struts.xml codées en dur, mais le problème est mon action de connexion doit rediriger toute action précédemment invoqué, et je ne sais pas à l'avance qui paramètres de requête précédent actions avaient. Ceci est différent de l'usecase typique où vous savez exactement à quelle action vous redirigez

Une très mauvaise solution que j'ai trouvée était d'ajouter tous les paramètres possibles (la collecte de tous les paramètres de toutes mes actions dans struts.xml) et puis utilisez l'option:

<param name="suppressEmptyParameters">true</param> 
+0

meilleure façon de définir votre paramètre dans la portée de la requête et de les récupérer tous dans votre prochaine action –

+0

http://struts.apache.org/development/2.x/docs/parameters-in-configuration-results.html. –

Répondre

3

Vous pouvez enregistrer le nom d'action, espace de noms, et les paramètres de la ActionMapping.

ActionMapping mapping = ServletActionContext.getActionMapping(); 

Vous pouvez également enregistrer la chaîne de requête au lieu de la carte de paramètres.

String params = request.getQueryString(); 

Pour ajouter des paramètres dynamiquement à redirectAction résultat que vous devez utiliser OGNL dans un paramètre dynamique.

<param name="actionName">${previousAction.name +'?'+ parameters}</param> 

Censé vous avez un getter pour parameters et initialisé de la session où vous avez enregistré chaîne de requête précédente, le nom d'action, et l'espace.

+0

Très bien, dans la documentation il semblait que vous ne pouviez pas fournir de paramètres supplémentaires, seul le nom. – user1884155

Questions connexes