2010-12-11 7 views
0

Je fais (merci à certains utilisateurs sur ce portail) mon application qui implémente SessionAware.Struts2 - Problèmes de session

Ceci est mon code actuel:

public class UserManager extends ActionSupport implements SessionAware { 
    private Map<String, Object> session; 

    @Override 
    public String execute() throws Exception { 
     return SUCCESS; 
    } 

    public void setSession(Map<String, Object> map) { 
     this.session=map; 
    } 

    public String checkLogin() {   
     session.put("loggedOn", true); 
     return SUCCESS; 
    } 

    public String checkLogout() { 
     session.clear(); 
     return SUCCESS; 
    } 
} 

Et je vérifier ces variables sur mon .jsp:

<s:if test="#session['loggedOn']!=true"> 
    DIV LOGIN 
</s:if> 
<s:else> 
    DIV LOGOUT 
</s:else> 

Une pièce facile de code.

Ce que je voudrais savoir est ceci:

1 - le haricot est (par défaut) demande scope. Ainsi, lorsque la demande est terminée, elle sera détruite. Mais je vois ça, quand je mets une variable dans la carte, elle est toujours vivante sur le serveur. Comment est-ce possible? Est une variable de mon Bean.

2 - Qui appelle la méthode setSession? Je pense que le servlet, en raison du fait que j'implémente cette interface?

3 - Je voudrais me détacher de la sauvegarde d'objet/bean sur un objet Session. Je voudrais utiliser la session Bean portée (comme pour tout type de framework MVC). Comment puis-je le faire sur struts2?

Espoir vous pouvez faire clairement à ces questions :) Vive

Répondre

3

1) Votre haricot est une action struts2 en tant que telle est l'action scope (ce qui est une portée plus restrictive que la demande). Je dis que l'action est une portée moindre car vous pouvez transférer une action à une autre action, auquel cas l'action précédente est hors de portée, mais les objets étendus de la requête resteront dans la portée jusqu'à ce que la requête soit servie. Lorsque vous implémentez SessionAware, vous recevez une référence à l'objet SessionObject, puis vous placez votre objet dans l'objet Session dont la durée de vie est beaucoup plus longue que votre action. Effacer le cache de votre navigateur enlèvera la valeur de la session ... vous pouvez également les supprimer par code en implémentant SessionAware et en supprimant la valeur de la carte.

2 - La session existe déjà. Vous pouvez obtenir la session et ajouter des clés, mais même si vous n'y mettez rien, il sera là pour être utilisé.

3 - Vous avez une question plus tard déjà pour ce sujet voir ma réponse ici.

+0

1 & 2 - Ok est maintenant plus clair. La référence de session-map est définie sur l'action Bean trought 'public void setSession (Carte carte) {this.session = map; } '. Mais l'OMS appelle cette méthode? Quand je fais une action (j'appelle ce Bean) je vois que cette fonction est appelée ... Comment est-ce possible? Est-ce le servlet? – markzzz

+1

Non c'est un intercepteur qui le fait! Dans votre fichier struts.xml, vous verrez que votre déclaration de paquet a 'extends = "struts-default"' alors qu'est-ce que cela signifie? Eh bien, comment votre action obtient-elle les valeurs des formes définies? Comment votre session est-elle automatiquement appelée? Comment les valeurs vont-elles de votre action à votre JSP? ... tout est fait par Interceptors ... Vous devez regarder quelque chose d'important: Ouvrez le Struts2-core-xxxjar (où xxx est la version actuelle) et regardez dans le paquet par défaut, ouvrez struts-default.xml, vous trouverez 'package name = "struts-default"', – Quaternion

+0

vous trouverez 'interceptor-stack name = "defaultStack"' qui est une liste d'intercepteurs qu'ils sont tous invoqués l'un après l'autre jusqu'à ce que votre action soit atteinte et qu'ils reviennent tous la pile jusqu'à ce que la demande soit servie. Vous ne pouvez pas choisir d'autres piles mais vous verrez tout en bas 'default-interceptor-ref name = "defaultStack"' c'est pourquoi cette pile de ce paquet est utilisée =) Maintenant la liste des piles les intercepteurs par nom mais plus vous verrez tous les intercepteurs définis et la classe qu'ils utilisent (dans le pot de xwork) donc vous devriez rapidement parcourir ceci et regarder – Quaternion