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:
sessionScope
, requestScope
, applicationScope
dans EL?ActionContext
et request(requestScope)
?P.S.:
Je teste ${request == requestScope}
Ce qui est vrai, cela veut dire que ce sont les mêmes?
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.
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.
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.
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.
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