2009-07-14 10 views
0

De la JSF 1.2 revB spec mrel2: bas de la page 65adf - Comment modifier les composants de l'arbre?

■ Il doit être possible pour l'application de modifier par programme l'arborescence des composants à tout moment au cours du cycle de vie de traitement des demandes (sauf pendant le rendu de la vue) et que le système se comporte comme prévu. Par exemple, les éléments suivants doivent être autorisés. La modification de la vue pendant le rendu peut entraîner des résultats indéfinis. Il doit être possible de permettre à des composants ajoutés par le système de modèle (tels que JSP) d'être supprimés de l'arborescence avant le rendu. Il doit être possible d'ajouter par programme des composants à l'arborescence et de les faire restituer au bon endroit dans la hiérarchie. Il doit être possible de réorganiser les composants dans l'arborescence avant le rendu. Ces manipulations nécessitent que tous les composants ajoutés à l'arborescence aient des identifiants uniques dans le cadre du composant NamingContainer parent le plus proche. La valeur de la propriété renderersChildren est gérée comme prévu et peut être true ou false.

Alors, comment fait-on cela dans ADF 11g? J'essaye de mettre en application un système d'autorisation d'application large où les composants sont visibles/éditables basés sur les rôles d'un utilisateur. Cependant, je ne peux pas trouver un moyen de se connecter à adf pour modifier les composants (par exemple RichInputText.setDisabled (true)) avant que la réponse soit écrite. J'ai essayé avec PhaseListeners et ViewHandlers. Aucun d'entre eux ne semble me permettre d'effectuer la fonctionnalité mentionnée ci-dessus. Alors qu'est-ce qui donne? Est-ce que je n'ai pas de chance? Est-ce que je manque quelque chose?

Merci, Ben

public class AuthorizationPhaseListener implements PhaseListener { 
    ... 
    public PhaseId getPhaseId() { 
    return PhaseId.RENDER_RESPONSE; // I've also tried in the other phases including ALL_PHASES 
    } 
    public void beforePhase(PhaseEvent p1) { 
    // relevant ui components don't yet exist 
    ... 
    } 
    public void afterPhase(PhaseEvent p1) { 
    // relevant ui components exist, but have already been written to the stream, thus it's too late to modify them 
    ... 
    } 
    ... 
} 

public class MyCustomViewHandler extends ViewHandlerWrapper { 
    ... 
    @Override 
    public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException { 
    AuthorizationService as = (AuthorizationService)RiscsContext.getCurrentInstance().getBean("AuthorizationService"); 
    // relevant ui components don't yet exist 
    as.applyAuthorization(); 
    super.renderView(context, viewToRender); 
    // relevant ui components exist, but have already been written to the stream, thus it's too late to modify them 
    as.applyAuthorization(); 
    } 
    ... 
} 

Répondre

0

Selon mon (limitée) recherche dans la documentation, l'objet UIViewRoot est le nœud racine de l'arborescence de la vue. Vous pouvez utiliser ses méthodes getChildren pour trouver les UIComponents appropriés et apporter vos modifications. Cependant, je suggérerais une manière différente.

Si vous exposez votre service d'autorisation en tant que bean, vous pouvez directement ajouter les méthodes au balisage. Par exemple ...

public class User { 
... 
Map<String, Boolean> allowedRoles; 
... 
public Map<String, Boolean> getAllowedRoles { return allowedRoles; } 
} 

<h:inputText value="#{SomethingImportant}" disabled="!#{User.allowedRoles['importantRole']}/> 

Encore mieux serait d'utiliser un cadre de sécurité qui simplifierait encore plus.

+0

Drew, obtenir UIViewRoot ne vous aide pas parce que je documentés dans les commentaires l'un des ce qui suit est vrai: // les composants ui pertinents n'existent pas encore // les composants ui pertinents existent, mais ont déjà été écrits dans le flux Je préfère ne pas avoir à ajouter manuellement l'attribut disabled à tous mes jsfs. Pour l'un, c'est fastidieux. D'autre part, nous laissons les utilisateurs configurer les rôles. Ainsi, nos exigences sont beaucoup plus fines que ce que permet cette solution. – andersonbd1

+0

Nous utilisons un cadre de sécurité (acegi) pour nous aider à démarrer, mais nos exigences vont plus loin. Je suis en train d'écrire notre propre cadre de sécurité. J'ai utilisé aop faire ce qui est nécessaire.C'est un hack, mais ça marche. – andersonbd1

0

Il permet d'accéder/modifier les composants de l'interface utilisateur dans l'arborescence si elle est localisable. Vous devez fournir l'ID du composant client lors de l'utilisation de findComponent(). Le seul problème reste qu'il ne vous donne pas accès/constrol pour le chargement de la page initiale (restore_view). :-( Pour l'instant, je ne peux trouver que le mode EL dans jspx/jsp/jsff

2

Vous avez vraiment besoin de faire cela du côté de la présentation, ne le faites pas avec un phaselistener. il n'est pas pour Exploitez l'attribut rendered à bon escient Voici quelques exemples de base comment vous pouvez l'utiliser:..

<h:someComponent rendered="#{bean.booleanValue}" /> 
<h:someComponent rendered="#{bean.intValue > 10}" /> 
<h:someComponent rendered="#{bean.objectValue == null}" /> 
<h:someComponent rendered="#{bean.stringValue != 'someValue'}" /> 
<h:someComponent rendered="#{!empty bean.collectionValue}" /> 
<h:someComponent rendered="#{!bean.booleanValue && bean.intValue != 0}" /> 
<h:someComponent rendered="#{bean.stringValue == 'oneValue' || bean.stringValue == 'anotherValue'}" /> 
Questions connexes