Rechercher un composant par ID dans JSF

Je veux trouver un UIComponent du bean géré par l’ID que j’ai fourni.

J’ai écrit le code suivant:

 private UIComponent getUIComponent(Ssortingng id) { return FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ; } 

J’ai défini un p:inputTextarea comme:

 

Maintenant, si un appel à la méthode en tant que getUIComponent("activityDescription") il retourne null , mais si je l’appelle getUIComponent("adminTabView:activityForm:activityDescription") alors je peux obtenir l’instance org.primefaces.component.inputtextarea.InputTextarea .

Existe-t-il un moyen d’obtenir le composant avec uniquement l’identifiant, à savoir “activityDescription”, pas l’id absolu, par exemple “adminTabView: activityForm: activityDescription”?

    Vous pouvez utiliser le code suivant:

     public UIComponent findComponent(final Ssortingng id) { FacesContext context = FacesContext.getCurrentInstance(); UIViewRoot root = context.getViewRoot(); final UIComponent[] found = new UIComponent[1]; root.visitTree(new FullVisitContext(context), new VisitCallback() { @Override public VisitResult visit(VisitContext context, UIComponent component) { if(component.getId().equals(id)){ found[0] = component; return VisitResult.COMPLETE; } return VisitResult.ACCEPT; } }); return found[0]; } 

    Ce code ne trouvera que le premier composant de l’arborescence avec l’ id vous passez. Vous devrez faire quelque chose de personnalisé s’il y a 2 composants portant le même nom dans l’arborescence (cela est possible s’ils se trouvent sous 2 conteneurs de noms différents).

    Peut-être que ce n’est pas possible. La FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ne renvoie qu’un seul UIComponent . Le ViewRoot est construit comme un arbre, donc si vous avez deux formes dans la vue, chacune avec un composant avec id="text" , ses composants parents seront ajoutés à l’identifiant pour qu’ils ne soient pas en conflit. Si vous placez les deux composants id="text" dans le même formulaire, java.lang.IllegalStateException sera lancé.

    Si vous voulez trouver tous les composants avec l’identifiant recherché, vous pouvez écrire une méthode qui implémente:

     List foundComponents = new ArrayList(); for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) { if(component.getId().contains("activityDescription")){ foundComponents.add(component); } } 

    Ou si vous voulez trouver la première occurrence:

     UIComponent foundComponent; for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) { if(component.getId().contains("activityDescription")){ foundComponent = component; break; } } 

    J’essaie ce code et c’est de l’aide:

     private static UIComponent getUIComponentOfId(UIComponent root, Ssortingng id){ if(root.getId().equals(id)){ return root; } if(root.getChildCount() > 0){ for(UIComponent subUiComponent : root.getChildren()){ UIComponent returnComponent = getUIComponentOfId(subUiComponent, id); if(returnComponent != null){ return returnComponent; } } } return null; } 

    Merci

    Il suffit de mettre prependId="false" dans votre formulaire dans lequel se trouve cette textarea.

    Oui, dans tous les composants parents qui sont NamingContainers vous devez append l’atsortingbut prependId="false" – cela fonctionnera dans à coup sûr et devrait fonctionner dans d’autres.
    S’il n’est pas possible de le définir via l’atsortingbut du fichier .xhtml, vous devez définir cette valeur par programmation.

    Suggestion après commentaire de l’auteur de la question:

    S’il n’y a pas de tels atsortingbuts dans les composants que vous utilisez, essayez la méthode find find comme ceci:

     private UIComponent findComponent(Ssortingng id, UIComponent where) { if (where == null) { return null; } else if (where.getId().equals(id)) { return where; } else { List childrenList = where.getChildren(); if (childrenList == null || childrenList.isEmpty()) { return null; } for (UIComponent child : childrenList) { UIComponent result = null; result = findComponent(id, child); if(result != null) { return result; } return null; } 

    Ensuite, invoquez

     UIComponent iamLookingFor = findComponent(myId, FacesContext.getCurrentInstance().getViewRoot()); 

    Ça va aider?