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();
}
...
}
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
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