Je travaille avec Struts2 et lorsque j'accède à des variables de pile de valeurs, je ne sais pas s'il faut utiliser %
ou #
ou $
. Je les essaie tous jusqu'à ce que je trouve le bon.
Quelqu'un peut-il expliquer quelle est la différence entre ceux-ci?
Utilisation de # (dièse)
OGNL est utilisé pour faire référence aux objets du ActionContext comme suit:
objectName
: objet dans ValueStack (objet par défaut/racine dans le contexte OGNL), tel qu'une propriété Action#objectName
: objet dans ActionContext mais en dehors de ValueStack, plus précisément ... #objectName
: objet ActionContext créé à l'aide des balises de données Struts2 avec l'étendue d'action par défaut (par exemple, <s:set name="foo" value="'Testing'" />
, référencé par <s:property value="#foo" />
)#parameters.objectName
: paramètre de requête#request.objectName
: attribut request-scoped#session.objectName
: attribut session-scoped#application.objectName
: attribut applicatif#attr.objectName
: attribut dans la portée de la page, de la demande, de la session ou de l'application (recherché dans cet ordre)Les références de carte scoped ci-dessus (paramètres, requête, session et application) peuvent être créées de deux manières:
#scopeName.objectName
ou#scopeName['objectName']
Utilisation de% (signe de pourcentage)
%{ OGNL expression }
est utilisé pour forcer l'évaluation OGNL d'un attribut qui serait normalement interprété comme un littéral de chaîne.
Exemple: <s:property value="myProperty" default="%{myDynamicDefaultValue}" />
Utilisation de @ (arobase)
Le symbole @ est utilisé pour faire référence à des propriétés et méthodes statiques. Notez que vous devrez peut-être l'activer dans vos propriétés Struts2: struts.ognl.allowStaticMethodAccess=true
Exemples:
@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod
Utilisation de $ (signe dollar)
Struts2 OGNL ne fait pas un usage particulier du signe dollar. Cependant, il peut être utilisé pour évaluer les expressions JSTL normales. Par exemple:
Struts2: <h1><s:property value="#pageTitle" /></h1>
(est équivalent à...)
JSTL: <h1>${pageTitle}</h1>
La structure utilise un contexte de dénomination standard pour évaluer les expressions OGNL. L'objet de niveau supérieur traitant de OGNL est une carte (généralement appelée carte de contexte ou contexte). OGNL a la notion qu'il existe un objet racine (ou par défaut) dans le contexte. En expression, les propriétés de l'objet racine peuvent être référencées sans aucune notion spéciale de "marqueur". Les références à d'autres objets sont marquées d'un dièse (#).
La structure définit le contexte OGNL comme étant notre ActionContext et la pile de valeurs comme étant l'objet racine OGNL. (La pile de valeurs est un ensemble de plusieurs objets, mais pour OGNL, il semble qu'il s'agisse d'un seul objet.) Parallèlement à la pile de valeurs, le cadre place d'autres objets dans ActionContext, y compris des cartes représentant les contextes de l'application, de la session et de la demande. Ces objets coexistent dans ActionContext, aux côtés de la pile de valeurs (notre racine OGNL).
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
référez-vous pour plus de détails
en gros, struts2 met la valeur de l’objet Stack en tête et OGNL est utilisé pour les référencer. On peut référencer un objet sans "marqueur" spécial ou avec %
tandis que les références à d’autres objets sont marquées par un signe dièse (#). # est fondamentalement utilisé pour faire référence à des objets/valeurs depuis Application/Session, etc.
Juste pour compléter le @Devon Biere ...
Utilisation de $ (signe dollar)
Vous pouvez également utiliser ${}
dans vos fichiers de ressources. Les struts utiliseront automatiquement OGNL pour analyser ${}
. Par exemple
sample.foo.bar=This is some ${someProperty} //If the someProperty is in valueStack
sample.welcome.message=Welcome dear ${#session.CurrentUser.farsiFirstName}
Veuillez noter que le signe $
est ici un déclencheur qui demande à struts d'évaluer la chaîne par rapport à OGNL. Veuillez ne pas le confondre avec ${}
dans JSTL.