1. L'importance de l'émergence de l'OGNL
Dans mvc, c'est un fait incontestable que les données circulent entre différents niveaux. Et ce type de circulation sera également confronté à certaines difficultés. Ces difficultés sont causées par les différentes manifestations des données dans différents mondes :
a Les données sont plates sur la page sans type de chaîne. La complexité de votre structure de données ou la richesse du type de données, lorsqu'il s'agit d'afficher, elles seront toutes traitées de la même manière et deviendront des chaînes et affichées sur la page.
b. Les données peuvent être représentées par des structures de données et des types de données riches dans le monde Java. Vous pouvez définir vos classes préférées et hériter et imbriquer entre les classes. Nous appelons généralement ce modèle une arborescence d’objets complexe. À ce stade, si les données sont transférées entre la page et le monde Java, elles sembleront ne pas correspondre. Cela conduit donc à plusieurs problèmes qui doivent être résolus ;
c. Lorsque les données sont transmises de la couche Vue à la couche Contrôleur, nous devons nous assurer qu'une collecte de données plate et dispersée peut être définie selon certaines règles. Accédez à l'arborescence des objets dans le monde Java. En même temps, il peut convertir intelligemment les types de chaînes en différents types en Java ;
d. Lorsque les données sont transmises de la couche Contrôleur à la couche Vue, nous devons nous assurer que la couche Vue peut utiliser certains éléments simples. règles Accéder à l'arborescence des objets. Dans le même temps, le format d'affichage des données dans l'arborescence des objets est contrôlé dans une certaine mesure.
Si nous réfléchissons un peu plus à ce problème, nous constaterons que résoudre le problème de l'inadéquation des flux de données due à différentes formes de présentation ne nous est en fait pas étranger. Le même problème se produit dans le monde Java et dans le monde des bases de données. Face à cette inadéquation entre modèles objet et relationnel, la solution que nous adoptons est d'utiliser des frameworks ORM, comme Hibernate, iBatis, etc. Alors maintenant, une inadéquation se produit également dans la couche Web, nous devons donc également utiliser certains outils pour nous aider à résoudre le problème. Afin de résoudre l'inadéquation lorsque les données sont transmises de la couche View à la couche Controller, Struts2 adopte une solution parfaite de XWork. Et sur cette base, un mécanisme parfait a été construit pour résoudre parfaitement l’inadéquation du flux de données. La solution OGNL est née
2. Combat réel du projet OGNL
OGNL est l'abréviation de Object-Graph Navigation Language. C'est un langage d'expression puissant qui utilise une syntaxe de formule simple et cohérente. , vous pouvez accéder à tous les attributs de l'objet, appeler les méthodes de l'objet,
parcourir le diagramme structurel de l'objet entier et implémenter des fonctions telles que la conversion de type de champ.
a. OGNL nous permet d'accéder à la couche d'objets avec des expressions très simples [OGNL prend en charge la recherche de valeur clé pour la carte]
Par exemple, si l'attribut utilisateur est une liste,
Par exemple, l'attribut utilisateur est une carte
**/
La projection consiste à sélectionner les mêmes attributs de chaque élément de l'ensemble pour former un nouvel ensemble, similaire à l'opération de terrain d'une base de données relationnelle. La syntaxe de l'opération de projection est collection.{XXX}, où XXX est la propriété publique de chaque élément de cette collection.
**/
? Sélectionne tous les éléments qui satisfont à la condition
^ Sélectionne le premier élément qui satisfait à la condition
$ Sélectionne le dernier élément qui satisfait à la condition
/**group.userList.{? #txxx.xxx != null} obtiendra une liste des utilisateurs d'un groupe dont le nom n'est pas vide
**/
i. OGNL est généralement utilisé en conjonction avec les signes Struts 2, principalement l'utilisation des trois symboles #, % et $. La méthode d'utilisation est la suivante :
/**Accès au contexte OGNL et au contexte d'action, #équivalent à ActionContext.getContext(); le tableau suivant a plusieurs propriétés utiles dans ActionContext :
parameters Map #parameters.id[0] contenant les paramètres de la requête HTTP actuelle est équivalent à request.getParameterValues("id").get(0);
request Map #request contenant les attributs de la HttpServletRequest actuelle .userName est équivalent à request.getAttribute("userName")session, qui contient la Map des attributs de la HttpSession actuelle. #session.userName est équivalent à la Map de l'application session.getAttribute("userName"), qui contient l'application. attributs du ServletContext actuellement appliqué. #application.userName est équivalent à application.getAttribute("userName")
attr est utilisé pour accéder à ses attributs (attributs) dans la requête > session > userName est équivalent aux trois ci-dessus dans l'ordre Lire l'attribut userName dans la portée jusqu'à ce qu'il soit trouvé
est utilisé pour filtrer et projeter des collections,
telles que des livres.{?#this.price<100}; 🎜> pour construire une Map, telle que # {'foo1':'bar1', 'foo2':'bar2'}. Le symbole
%" est utilisé pour calculer la valeur de l'expression OGNL lorsque l'attribut du drapeau est de type chaîne.
"$" a deux utilisations principales, utilisé en internationalisation Dans le fichier de ressources , faites référence à l'expression OGNL. Dans le fichier de configuration
/**