来自 jsf 1.2 revB mrel2 规范:第 65 页底部
■ 应用程序必须能够在请求处理生命周期中的任何时候以编程方式修改组件树(视图呈现期间除外),并使系统按预期运行。例如,必须允许以下内容。在渲染期间修改视图可能会导致未定义的结果。必须可以允许模板系统(例如 JSP)添加的组件在渲染之前从树中移除。必须能够以编程方式将组件添加到树中,并让它们呈现在层次结构中的适当位置。必须可以在渲染之前对树中的组件进行重新排序。这些操作确实要求添加到树中的任何组件都具有在最近的父 NamingContainer 组件范围内唯一的 ID。
那么如何在 adf 11g 中做到这一点呢?我正在尝试实现一个应用程序范围的授权系统,其中组件根据用户的角色可见/可编辑。但是,在写出响应之前,我无法找到一种方法来挂钩 adf 以修改组件(例如 RichInputText.setDisabled(true))。我已经尝试过 PhaseListeners 和 ViewHandlers。这些似乎都不允许我执行上述功能。那么给了什么?我运气不好?我错过了什么吗?
谢谢,本
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();
}
...
}