web-dev-qa-db-fra.com

Session et sessionScope sont-ils les mêmes dans JSP EL?

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        ActionContext ctx = ActionContext.getContext();
        Integer counter = (Integer)ctx.getApplication().get("counter");
        // put counter into application 
        ctx.getApplication().put("counter", counter);
        // put username into session
        ctx.getSession().put("user", username);
        if (getUsername().equals("crazyit.org")
                && getPassword().equals("leegang")) {
            ctx.put("tip", "Login Success! ");
            return SUCCESS;
        }
        else {
            ctx.put("tip", "Login Falied!");
            return ERROR;
        }        
    }
}

J'ai mis "counter" Dans l'application "user" En session et "tip" Dans ActionContext. Dans JSP, je peux utiliser ${session.user} Et ${sessionScope.user} Pour référencer la propriété "utilisateur". ${request.tip} Et ${requestScope.tip} Pour référencer tip.

Mes questions:

  1. La session, la demande et l'application sont-elles les mêmes que sessionScope, requestScope, applicationScope dans EL?
  2. Quelle est la relation entre ActionContext et request(requestScope)?

P.S.:

Je teste ${request == requestScope} Ce qui est vrai, cela veut dire que ce sont les mêmes?

17
StrikeW

Avec le langage d'expression (EL), les éléments de portée sont des cartes de valeurs d'attributs dans les objets auxquels ils se réfèrent. Par exemple, le requestScope est une représentation cartographique des valeurs dans l'objet de demande. Ceci est expliqué en détail assez clair sur cette page: Java Servlet et JSP . Si vous lisez les sections EL, vous remarquerez un point sur la demande par rapport à la portée de la demande ici: Le requestScope n'est PAS un objet de demande .

Je recommanderais de lire cette page pour mieux comprendre servlet/jsp en général.

En ce qui concerne la façon dont ActionContext se rapporte à ces éléments, il s'agit en fait d'un wrapper utilisé par les entretoises pour encapsuler le servlet. Vous pouvez lire plus de détails à ce sujet ici: Accès à l'application, à la session, aux objets de demande .

Il y a eu quelques références à des valeurs implicites données ici, mais j'ai envie de dire que c'est implicite n'explique pas vraiment grand-chose. Lorsque vous utilisez EL pour accéder aux variables de servlet, vous pouvez déclarer explicitement l'étendue que vous souhaitez référencer, par exemple:

 ${requestScope.myVariable}

Vous pouvez également le référencer implicitement en omettant la portée:

 ${myVariable}

Maintenant, le problème qui peut survenir ici est que les variables du même nom peuvent provoquer une collision. EL vérifiera les valeurs implicites dans un ordre spécifique: pageScope, requestScope, sessionScope et applicationScope, param, paramValues, header, headervalues, initParam, cookie, pageContext. Cela signifie que si vous avez une variable dans la portée de la demande avec le même nom qu'une variable dans la portée de la session ou de l'application par exemple, la valeur de la portée de la demande sera référencée.

21
Russell Shingleton

Par défaut, les objets page, request, session and application Sont disponibles pour les pages JSP. Vous pouvez donc accéder ensuite à l'aide de la syntaxe EL.

Et le tableau suivant montre les objets IMPLICIT disponibles pour EL.

       Implicit object            Description
1.     pageScope        Scoped variables from page scope
2.     requestScope     Scoped variables from request scope
3.     sessionScope     Scoped variables from session scope
4.     applicationScope Scoped variables from application scope
5.     param            Request parameters as strings
6.     paramValues      Request parameters as collections of strings
7.     header           HTTP request headers as strings
8.     headerValues     HTTP request headers as collections of strings
9.     initParam        Context-initialization parameters
10.    cookie           Cookie values
11.    pageContext      The JSP PageContext object for the current page

Ainsi session et sessionScope sont identiques mais diffèrent dans le contexte où ils sont utilisés. Plus précisément session is object Et sessionScope is map (key, value) of Attribute and its value.

  • Si vous dites ${session.sessionAttr}, Cela fait référence à l'objet de session disponible sur la page JSP.

  • Si vous dites ${sessionScope.sessionAttr}, Cela fait référence à l'objet de session IMPLICIT disponible pour EL.

  • Ou si vous dites simplement {attrName}, il recherchera attrName dans toute la portée de la page à la portée de l'application.
21
Dipak Ingole
  1. session, requête, application sont les objets réellement HttpSession, HttpServletRequest et ServletContext tandis que sessionScope, requestScope and applicationScope donne accès à tous les attributs de portée de session, de demande et d'application.

Vous pouvez dire que applicationScope> sessionScope> requestScope.

  • les attributs applicationScope seront accessibles à toutes les sessions, à toutes les demandes des applications Web. Ces attributs restent actifs tant que l'application est active
  • les attributs sessionScope seront accessibles à toutes les demandes de la session HttpSession en cours. Ces attributs restent actifs tant que la session est active
  • les attributs requestScope ne seront accessibles qu'à partir de la demande en cours. Une fois la réponse terminée, ils ont disparu.
3
Prasad Kharkar

Le ActionContext est une chose Struts2, et il est créé dans chaque requête qui est gérée par le framework. Quand il est créé, le framework le remplit avec les éléments de servlet avec ses propres implémentations de request, session et applicaton. Et là où vous l'utilisez dans l'application, ces objets sont référencés. Pour accéder au contenu du servlet, utilisez le ServletActionContext qui aide à récupérer les ressources appropriées. Struts2 encapsule également le ServletRequest pour fournir l'accès aux propriétés de l'action et valueStack à partir des expressions EL. sessionScope, requestScope et applicationScope utilisés avec les expressions EL pour évaluer les attributs de remplissage de servlet. Voilà les différences.

2
Roman C

Jetez un œil au-dessous du code que j'ai essayé.

<body>
<%
FirstServlet first=new FirstServlet();  // it has a fileName property and getter setter for it
%>
<%
session.setMaxInactiveInterval(10); //jsp's implicit session object
request.setAttribute("session", first); //jsp's implicit request object
session.setAttribute("hello", "this worked!");
pageContext.getSession().setAttribute("hello", "now this also worked!");%> // same as above

${pageContext.session.maxInactiveInterval } // client's session object
${sessionScope.maxInactiveInterval}
${session.fileName } // FirstServlet Object and gives the fileName I gave.
${sessionScope.hello } // OP: "now this also worked!
${session==sessionScope } // gives false. If using struts2 than true
${request==requestScope } // gives false. If using struts2 than true
</body>

dans EL comme indiqué par Prasad et Captain lorsque vous utilisez ${sessionScope} il mappe uniquement les noms de variables de portée de session à leurs valeurs.

si vous voulez obtenir l'objet de session du client, vous devez utiliser pageContext.session

mais quand vous utilisez ${session}, el recherche l'attribut mappé avec le nom de la session dans l'ordre: page->request->session->application étendues commençant de gauche à droite.

${request == requestScope} donne false parce que requestScope est l'objet de demande du client lorsque request fera que EL recherchera l'objet mappé avec request nom dans divers scopes. Mais dans votre cas, c'est true à cause de struts2

1
Kartik73