Comment accéder aux propriétés du composant à partir d'une Classe Java
Je suis en train de travailler sur un composant qui nécessite certaines propriétés (que l'utilisateur définit au moment de l'exécution) pour qu'il fonctionne comme prévu.
D'abord, j'ai été tout simplement à l'aide d'un properties.get('foo')
pour aller chercher le nécessaire propriété de mon composant, mais je vais essayer de supprimer toutes les traces de script-laissez-le code de mon composant fichier jsp.
Comment puis-je récupérer cette propriété 'foo' (qui est définie en cours d'exécution sur mon composant) dans mon code Java? Je me souviens avoir lu quelque part que l'utilisation d'un ValueMap était la meilleure façon, alors j'ai essayé en utilisant ceci:-
public static Map<String, Object> getResourceProperties(String path,
SlingHttpServletRequest request) {
ResourceResolver resourceResolver = request.getResourceResolver();
Map<String, Object> props= new HashMap<String, Object>();
Resource resource = resourceResolver.getResource(path);
if (null != resource) {
props.putAll(resource.adaptTo(ValueMap.class));
}
return props;
}
et c'est à mon jsp:- <c:set var="refProperties" value="${xyz:getResourceProperties(properties.path,slingRequest)}" />
Mais cela ne veut pas retourner la valeur que je veux.
Vous devez vous connecter pour publier un commentaire.
La méthode la plus simple de procéder consiste à inclure le
/libs/foundation/global.jsp
et il suffit d'utiliser laproperties
objet est déjà dans le champ d'application${properties.foo}
.Inclure le mondial.jsp en haut de la composante jsp comme suit:
Que les commentaires dans le fichier indiquer, il enregistre le Sling (écharpe), CQ (cq), et JSTL (c,esf,fn) taglib des espaces pour les utiliser dans la page JSP.
Puis, avec l'aide de la
cq:defineObjects
taglib, il apporte de nombreux objets utiles dans l'étendue.Voici la liste:
Cela signifie qu'en utilisant simplement la cq:defineObjects taglib vous avez déjà accès aux propriétés ValueMap par JSP Expression Language (EL). Pas de conversion supplémentaire est nécessaire pour accéder aux propriétés de la JSP.
Pour accéder aux propriétés à l'intérieur de votre propre Java taglib ou des haricots vous venez de passer l'objet approprié à votre code à l'aide de la norme de balises JSTL. Vous pouvez passer l'ensemble de la demande, les ressources, ou tout simplement les propriétés. En passant la totalité de la requête donne votre code Java d'accès à la ressource actuelle et tous les objets créés par le cq:defineObjects taglib y compris les propriétés ValueMap.
En JSP:
Sur le haricot:
resource
Dans ce cas particulier que vous essayez de créer
Map<String, Object>
contenant toutes les propriétés de la ressource. Cette carte serait la même queproperties
objet (qui est aussi unMap
), donc je suppose que toute la méthode est redondant (et comme vous l'écrivez - il ne fonctionne pas).properties
objet ne contient pas depath
méthode et c'est probablement la raison pour laquelle cela ne fonctionne pas.Ce qui est plus, vous pouvez avoir utilisé
request.getResource()
(au lieu d'obtenir de résolution et de ressources par le chemin d'accès). Aussi, au lieu d'adapter leresource
àValueMap
vous pouvez avoir simple passageproperties
à partir de la JSP.Plus générale, si vous voulez extraire la logique de JSP Java de la classe, je pense que c'est une bonne idée de créer une sorte de
model
classe, en passantslingRequest
à son constructeur et ensuite invoquer ses méthodes dans la page JSP. Exemple:OBTENIR.jsp
MyModel.java
Veuillez noter que si vous appelez
${model.firstMethod}
vous devez ajouterget
préfixe pour le nom de la méthode (getFirstMethod()
).Cannot use this in a static context
. Savez-vous pourquoi est-ce le cas? La raison, j'ai utilisérequest.getResource()
est parce que ma page 6 instances d'un même composant. Le paramètre dont l'auteur passe en serait différent pour toutes les instances, ce qui signifie que la création d'une ressource avec 1 chemin ne serait pas vraiment l'aider.static
méthode (plutôt que constructeur comme dans l'exemple) dans lequel vous essayez d'utiliserthis
mot-clé.Je voudrais utiliser l'étiquette useBean pour créer une instance d'une classe qui peuvent vous donner quelque info dont vous avez besoin:
Puis il suffit de créer un setter dans la classe.
Puis dans votre jsp:
Obtenir le RJC session dans votre fichier Java, puis parcourir les nœuds
comme
content/your_site_name/node/some_parsys
. Ensuite, vous pouvez obtenir les valeurs qui sont définies par l'auteur au moment de l'exécution.Bien j'ai réussi à répondre à ma propre question. J'ai tout utiliser
resource.path
dans ma jsp.ressources ici se réfère à la composante en question, et donc, en utilisant le chemin, j'ai pu créer mon ValueMap correctement.
Donc, le code dans mon jsp fichier est comme suit:-
À l'aide de cette manière, je peux désormais référence à une propriété du composant que je veux:-
Afin d'utiliser
resource.path
, on doit aussi inclure mondiale.jsp, sinon elle ne sera pas reconnue.